<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-12T00:19:15.277571" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-userfeatures-netty.txt">
<suite id="s1-s1" name="Ready" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/ready">
<suite id="s1-s1-s1" name="Netconfready" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:15.930870" 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-12T00:19:15.925736" elapsed="0.005225"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:15.925232" elapsed="0.005822"/>
</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-12T00:19:15.936418" 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-12T00:19:15.932540" elapsed="0.003911"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:15.936712" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:15.936561" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.936529" elapsed="0.000265"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.937370" 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-12T00:19:15.936968" elapsed="0.000449"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.937949" level="INFO">${cluster_size} = 0</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-12T00:19:15.937590" elapsed="0.000397"/>
</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-12T00:19:15.938598" elapsed="0.000392"/>
</kw>
<msg time="2026-04-12T00:19:15.939104" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:15.939154" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:15.938167" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.939766" level="INFO">${int_of_members} = 0</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-12T00:19:15.939358" elapsed="0.000436"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.941452" 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-12T00:19:15.941169" elapsed="0.000311"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.942866" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:15.941647" elapsed="0.001248"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.943426" 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-12T00:19:15.943060" elapsed="0.000395"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:15.946073" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:15.945859" elapsed="0.000290"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.943520" elapsed="0.002659"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.946776" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:15.946346" elapsed="0.000476"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.947398" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:15.946989" elapsed="0.000454"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.948014" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:15.947620" elapsed="0.000438"/>
</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-12T00:19:15.940678" elapsed="0.007442"/>
</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-12T00:19:15.932159" elapsed="0.016021"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.948370" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:15.948252" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.948230" elapsed="0.000211"/>
</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-12T00:19:15.951652" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:15.951246" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.952213" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:15.951915" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:15.952287" elapsed="0.000043"/>
</return>
<msg time="2026-04-12T00:19:15.952462" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:15.950903" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:15.952858" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:15.952681" elapsed="0.000238"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.952544" elapsed="0.000403"/>
</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-12T00:19:15.948688" elapsed="0.004313"/>
</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-12T00:19:15.953153" elapsed="0.000212"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:15.953696" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:15.953541" elapsed="0.000220"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.953418" elapsed="0.000371"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:15.931486" elapsed="0.022359"/>
</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-12T00:19:15.956527" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:15.956407" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.956386" 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-12T00:19:15.961431" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:15.961321" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.961302" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.962475" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:15.962083" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.962967" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:15.962677" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:15.963038" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:15.963194" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:15.961741" elapsed="0.001478"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.963577" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.963844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:15.963694" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:15.963675" elapsed="0.000246"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:15.963435" elapsed="0.000510"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.963270" elapsed="0.000701"/>
</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-12T00:19:15.961031" elapsed="0.002997"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:15.954434" elapsed="0.009647"/>
</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-12T00:19:15.954008" elapsed="0.010114"/>
</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-12T00:19:15.924866" elapsed="0.039304"/>
</kw>
<kw name="Set_Netconf_Connector">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.965724" 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-12T00:19:15.965432" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.968130" 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-12T00:19:15.965972" elapsed="0.002185"/>
</kw>
<return>
<value>${connector}</value>
<status status="PASS" start="2026-04-12T00:19:15.968211" elapsed="0.000032"/>
</return>
<msg time="2026-04-12T00:19:15.968375" level="INFO">${connector} = </msg>
<var>${connector}</var>
<doc>Sets netconf connector verify url according to the vanadium and False combination</doc>
<status status="PASS" start="2026-04-12T00:19:15.964387" elapsed="0.004014"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.973220" 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-12T00:19:15.968560" elapsed="0.004707"/>
</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-12T00:19:15.973427" elapsed="0.000229"/>
</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-12T00:19:15.988279" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:15.988161" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.988141" elapsed="0.000210"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-12T00:19:15.988724" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-12T00:19:15.988839" 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-12T00:19:15.988504" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.989281" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:15.989020" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:15.989742" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:15.989482" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:15.990586" 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-12T00:19:15.990340" elapsed="0.000464">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-12T00:19:15.990922" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-12T00:19:15.990968" 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-12T00:19:15.989946" elapsed="0.001045"/>
</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-12T00:19:15.991297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:15.991069" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:15.991049" elapsed="0.000349"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:15.992174" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-12T00:19:15.991895" elapsed="0.000384">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-12T00:19:15.992349" elapsed="0.000017"/>
</return>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-12T00:19:15.991600" elapsed="0.000869">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.992651" elapsed="0.000023"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.992842" elapsed="0.000022"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.993005" elapsed="0.000020"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:15.993172" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:15.996386" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-12T00:19:15.996879" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-12T00:19:15.997190" 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-12T00:19:15.994000" elapsed="0.003384"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_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-12T00:19:15.993453" elapsed="0.003980"/>
</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-12T00:19:15.986408" elapsed="0.011105">Dictionary does not contain key '1'.</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-12T00:19:17.020224" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.020072" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.020039" elapsed="0.000276"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.020726" level="INFO">index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-12T00:19:17.020859" 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-12T00:19:17.020493" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.021366" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:17.021048" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.021833" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:17.021571" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:17.022724" 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-12T00:19:17.022446" elapsed="0.000405">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-12T00:19:17.022969" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-12T00:19:17.023015" 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-12T00:19:17.022044" elapsed="0.000994"/>
</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-12T00:19:17.023342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.023115" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.023096" elapsed="0.000345"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:17.024233" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.023959" elapsed="0.000377">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.024397" elapsed="0.000017"/>
</return>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.023683" elapsed="0.000833">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.024699" elapsed="0.000022"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.024881" elapsed="0.000020"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.025042" elapsed="0.000020"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.025209" elapsed="0.000020"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:17.028428" elapsed="0.000333"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-12T00:19:17.028923" elapsed="0.000159"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-12T00:19:17.029228" 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-12T00:19:17.026028" elapsed="0.003354"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_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-12T00:19:17.025490" elapsed="0.003938"/>
</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-12T00:19:17.018149" elapsed="0.011359">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-12T00:19:17.029676" level="FAIL">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:15.973818" elapsed="1.055959">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.034316" 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-12T00:19:17.034807" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.034415" elapsed="0.000453"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.034397" elapsed="0.000496"/>
</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-12T00:19:17.035038" elapsed="0.000027"/>
</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-12T00:19:17.035313" elapsed="0.000024"/>
</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-12T00:19:15.924428" elapsed="1.110997">Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.035506" elapsed="0.000465">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.036173" elapsed="0.000399">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.036777" elapsed="0.000397">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.037356" elapsed="0.001092">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.038694" elapsed="0.000426">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.039292" elapsed="0.000326">Parent suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</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-12T00:19:17.046932" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.046818" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.046799" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.047983" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.047573" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.048482" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.048170" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.048553" elapsed="0.000032"/>
</return>
<msg time="2026-04-12T00:19:17.048730" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.047228" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.049125" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.049366" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.049223" elapsed="0.000234"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.049206" elapsed="0.000276"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.048980" elapsed="0.000526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.048814" elapsed="0.000721"/>
</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-12T00:19:17.044751" elapsed="0.004840"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:17.049836" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:17.049755" elapsed="0.000134"/>
</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-12T00:19:17.040139" elapsed="0.009801"/>
</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-12T00:19:15.320390" elapsed="1.729581">Suite setup failed:
Keyword 'KarafKeywords.Open_Controller_Karaf_Console_On_Background' failed after retrying 2 times. The last error was: Dictionary does not contain key '1'.</status>
</suite>
<status status="FAIL" start="2026-04-12T00:19:15.319184" elapsed="1.731626"/>
</suite>
<suite id="s1-s2" name="Apidocs" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs">
<suite id="s1-s2-s1" name="Apidocs" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.098735" level="INFO">Creating Session using : alias=default, url=http://:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5839ce110&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-12T00:19:17.098297" elapsed="0.000604"/>
</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-12T00:19:17.097915" elapsed="0.001059"/>
</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-12T00:19:17.114122" elapsed="0.000443"/>
</kw>
<arg>titanium</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to vanadium and in case vanadium 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-12T00:19:17.113695" elapsed="0.000964"/>
</kw>
<msg time="2026-04-12T00:19:17.114711" 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-12T00:19:17.106848" elapsed="0.007916"/>
</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 vanadium and in case vanadium is less than titanium,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-04-12T00:19:17.106484" elapsed="0.008359"/>
</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-12T00:19:17.128923" elapsed="0.000440"/>
</kw>
<msg time="2026-04-12T00:19:17.129418" 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-12T00:19:17.128583" elapsed="0.000885"/>
</kw>
<arg>aluminium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to vanadium and return openapi_18 if vanadium is at least ${lower_bound},
return apis otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.128230" elapsed="0.001353"/>
</kw>
<msg time="2026-04-12T00:19:17.129645" 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-12T00:19:17.121679" elapsed="0.008012"/>
</kw>
<msg time="2026-04-12T00:19:17.129797" level="INFO">${path} = openapi_18</msg>
<var>${path}</var>
<arg>openapi_18</arg>
<arg>apis</arg>
<doc>Compare aluminium to vanadium and return ${value_if_true} if vanadium is at least aluminium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.121379" elapsed="0.008442"/>
</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-12T00:19:17.143532" elapsed="0.000435"/>
</kw>
<msg time="2026-04-12T00:19:17.144018" 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-12T00:19:17.143212" elapsed="0.000856"/>
</kw>
<arg>chlorine</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to vanadium and return openapi if vanadium is at least ${lower_bound},
return openapi_18 otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.142868" elapsed="0.001276"/>
</kw>
<msg time="2026-04-12T00:19:17.144187" 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-12T00:19:17.136332" elapsed="0.007903"/>
</kw>
<msg time="2026-04-12T00:19:17.144339" level="INFO">${path} = openapi</msg>
<var>${path}</var>
<arg>openapi</arg>
<arg>${path}</arg>
<doc>Compare chlorine to vanadium and return ${value_if_true} if vanadium is at least chlorine, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.136024" elapsed="0.008339"/>
</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-12T00:19:17.158320" elapsed="0.000456"/>
</kw>
<msg time="2026-04-12T00:19:17.158828" 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-12T00:19:17.158000" elapsed="0.000877"/>
</kw>
<arg>potassium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to vanadium and return openapi_v3 if vanadium is at least ${lower_bound},
return openapi otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.157649" elapsed="0.001303"/>
</kw>
<msg time="2026-04-12T00:19:17.158995" 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-12T00:19:17.150872" elapsed="0.008165"/>
</kw>
<msg time="2026-04-12T00:19:17.159139" level="INFO">${path} = openapi_v3</msg>
<var>${path}</var>
<arg>openapi_v3</arg>
<arg>${path}</arg>
<doc>Compare potassium to vanadium and return ${value_if_true} if vanadium is at least potassium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-12T00:19:17.150556" elapsed="0.008607"/>
</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-12T00:19:17.196181" level="INFO">${file_path_stream} = /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-12T00:19:17.195803" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.196901" level="FAIL">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.196637" elapsed="0.000338">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-12T00:19:17.197069" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-12T00:19:17.196330" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.197598" level="INFO">${file_path} = /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.197217" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.197900" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3/location.uri"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.198055" 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-12T00:19:17.197762" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.198485" 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-12T00:19:17.198233" 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-12T00:19:17.199446" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:17.199191" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.199903" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-12T00:19:17.199626" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.200226" 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-12T00:19:17.200398" 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-12T00:19:17.200530" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.200130" elapsed="0.000457"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.199984" elapsed="0.000647"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-12T00:19:17.200680" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:17.200844" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-12T00:19:17.198909" elapsed="0.001961"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.198636" elapsed="0.002266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.201162" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.200927" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.198596" elapsed="0.002645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.202007" 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-12T00:19:17.201343" elapsed="0.000694"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-12T00:19:17.202088" 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-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.195220" elapsed="0.006995"/>
</kw>
<msg time="2026-04-12T00:19:17.202269" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:17.185457" elapsed="0.016860"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>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-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.211906" 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-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.221486" 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-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/apidocs/../../../variables/apidoc/openapi_v3/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.231055" 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-12T00:19:17.231209" 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-12T00:19:17.231345" 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-12T00:19:17.231728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.231621" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.231592" elapsed="0.000216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.231907" 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-12T00:19:17.232032" 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-12T00:19:17.232157" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.231562" elapsed="0.000647"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.231456" elapsed="0.000779"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.232341" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.232417" elapsed="0.000015"/>
</return>
<msg time="2026-04-12T00:19:17.232526" 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-12T00:19:17.182145" elapsed="0.050406"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.233698" level="FAIL">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.233440" elapsed="0.000326">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-12T00:19:17.233859" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-12T00:19:17.233140" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.234158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.233954" elapsed="0.000260"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.234689" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-12T00:19:17.234355" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.234238" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.233936" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.236642" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.234887" elapsed="0.001782"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-12T00:19:17.236721" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.236874" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.232854" elapsed="0.004045"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.237984" level="FAIL">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.237748" elapsed="0.000302">File '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/apidoc/openapi_v3/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-12T00:19:17.238143" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-12T00:19:17.237440" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-12T00:19:17.238379" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-12T00:19:17.238238" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.238219" elapsed="0.000248"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.238571" elapsed="0.000046"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.238729" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.238835" elapsed="0.000017"/>
</return>
<msg time="2026-04-12T00:19:17.240448" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.237165" elapsed="0.003309"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.241798" 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-12T00:19:17.241532" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.242195" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:17.241953" 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">
<var>${response}</var>
<arg>${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-12T00:19:17.243931" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.242304" elapsed="0.001691"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:17.244689" level="FAIL">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</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-12T00:19:17.244123" elapsed="0.001787">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</kw>
<status status="FAIL" start="2026-04-12T00:19:17.244020" elapsed="0.001975">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</branch>
<status status="FAIL" start="2026-04-12T00:19:17.242286" elapsed="0.003739">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.246371" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.246512" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.246474" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.246457" 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-12T00:19:17.246713" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.246785" 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-12T00:19:17.240771" elapsed="0.006127">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.246971" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.165314" elapsed="0.081753">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.247310" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.247159" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.247142" elapsed="0.000263"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.247439" elapsed="0.000013"/>
</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-12T00:19:17.162056" elapsed="0.085477">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</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-12T00:19:17.247677" elapsed="0.000023"/>
</kw>
<doc>Get the Apidoc Apis list, check 200 status and apis string presence.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.099029" elapsed="0.148815">InvalidURL: Invalid URL 'http://:8182/openapi/api/v3/single': No host supplied</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-12T00:19:17.248296" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:17.248215" elapsed="0.000147"/>
</kw>
<doc>Test suite to verify Apidocs is OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.052494" elapsed="0.195900"/>
</suite>
<status status="FAIL" start="2026-04-12T00:19:17.051272" elapsed="0.197804"/>
</suite>
<suite id="s1-s3" name="MDSAL" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/MDSAL">
<suite id="s1-s3-s1" name="Northbound" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:17.322768" 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-12T00:19:17.318956" elapsed="0.003865"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:17.318736" elapsed="0.004146"/>
</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-12T00:19:17.327430" 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-12T00:19:17.323939" elapsed="0.003519"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.327662" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.327538" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.327517" elapsed="0.000209"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.328227" 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-12T00:19:17.327868" elapsed="0.000402"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.328747" level="INFO">${cluster_size} = 0</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-12T00:19:17.328420" elapsed="0.000354"/>
</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-12T00:19:17.329246" elapsed="0.000281"/>
</kw>
<msg time="2026-04-12T00:19:17.329646" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:17.329695" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:17.328925" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.330240" level="INFO">${int_of_members} = 0</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-12T00:19:17.329873" elapsed="0.000393"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.331238" 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-12T00:19:17.330968" elapsed="0.000297"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.331675" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.331399" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.332139" 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-12T00:19:17.331850" elapsed="0.000316"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:17.334430" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.334249" elapsed="0.000255"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.332224" elapsed="0.002308"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.335130" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:17.334720" elapsed="0.000454"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.335742" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:17.335331" elapsed="0.000458"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.336321" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:17.335939" elapsed="0.000425"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-12T00:19:17.330495" elapsed="0.005926"/>
</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-12T00:19:17.323583" elapsed="0.012892"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.336669" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.336541" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.336522" elapsed="0.000227"/>
</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-12T00:19:17.339801" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.339407" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.340259" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.339975" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.340330" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:17.340520" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.339095" elapsed="0.001450"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:17.340891" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.340730" elapsed="0.000221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.340597" elapsed="0.000380"/>
</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-12T00:19:17.336982" elapsed="0.004049"/>
</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-12T00:19:17.341171" elapsed="0.000209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:17.341688" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.341549" elapsed="0.000207"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.341431" elapsed="0.000350"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:17.323160" elapsed="0.018674"/>
</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-12T00:19:17.344250" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.344142" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.344124" 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-12T00:19:17.348583" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.348475" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.348457" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.349582" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.349190" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.350068" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.349779" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.350139" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.350293" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.348878" elapsed="0.001439"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.350682" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.350922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.350783" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.350766" elapsed="0.000231"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.350519" elapsed="0.000501"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.350368" elapsed="0.000676"/>
</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-12T00:19:17.348187" elapsed="0.002910"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.342374" elapsed="0.008785"/>
</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-12T00:19:17.341976" elapsed="0.009224"/>
</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-12T00:19:17.318345" elapsed="0.032903"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:17.351688" level="INFO">Creating Session using : alias=config, url=http://:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e583a62110&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-12T00:19:17.351384" elapsed="0.000480"/>
</kw>
<doc>Setup resources and create session for Restconf checking.</doc>
<status status="PASS" start="2026-04-12T00:19:17.318072" elapsed="0.033855"/>
</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-12T00:19:17.355971" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.355683" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.357198" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.357086" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.357067" 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-12T00:19:17.361698" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.361575" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.361557" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.362769" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.362337" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.363246" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.362960" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.363318" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.363473" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.361976" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.363851" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.364081" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.363949" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.363932" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.363716" elapsed="0.000464"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.363551" elapsed="0.000653"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.361214" elapsed="0.003043"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.356800" elapsed="0.007511"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.356372" elapsed="0.007983"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.352475" elapsed="0.011930"/>
</kw>
<kw name="Create_ODL_Netconf_Connection">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.365412" level="INFO">${control} = 3</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-12T00:19:17.365036" elapsed="0.000403"/>
</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-12T00:19:17.367311" level="INFO">Length is 0.</msg>
<msg time="2026-04-12T00:19:17.367391" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_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-12T00:19:17.366901" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:17.367561" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.368899" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-12T00:19:17.369442" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.368554" elapsed="0.004771">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:17.373387" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.368206" elapsed="0.005233"/>
</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="FAIL" start="2026-04-12T00:19:17.366392" elapsed="0.007153">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:17.373594" 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="FAIL" start="2026-04-12T00:19:17.366017" elapsed="0.007638"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.365647" elapsed="0.008099">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_control}</arg>
<arg>${control}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.373944" elapsed="0.000023"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<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="NOT RUN" start="2026-04-12T00:19:17.374142" elapsed="0.000023"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.374357" elapsed="0.000024"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_netconf}</arg>
<arg>${netconf}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.374519" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_port}</arg>
<arg>${port}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.374729" elapsed="0.000022"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_user}</arg>
<arg>${user}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.374897" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ssh_password}</arg>
<arg>${password}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.375062" elapsed="0.000020"/>
</kw>
<doc>Open a netconf connecion to the given machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.364585" elapsed="0.010586">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<doc>Open a prepared netconf connecion.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.375322" elapsed="0.000021"/>
</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-12T00:19:17.376561" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.376191" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.376172" 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-12T00:19:17.376799" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.381765" 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-12T00:19:17.381271" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.382019" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.381874" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.381856" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.382515" 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-12T00:19:17.382217" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.383075" level="INFO">${reference} = netconf_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-12T00:19:17.382734" elapsed="0.000368"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.383423" level="INFO">${reference} = netconf_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-12T00:19:17.383250" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.383949" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.383589" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.384424" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.384116" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.385048" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"

OSError: [Errno 16] Device or resource busy</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-12T00:19:17.384591" elapsed="0.000508"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.385540" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.385244" 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-12T00:19:17.380975" elapsed="0.004717"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.375980" elapsed="0.009765"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.375626" elapsed="0.010160"/>
</kw>
<doc>Connect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.351983" elapsed="0.033845">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_connect_to_odl_netconf&amp;order=bug_status"

OSError: [Errno 16] Device or resource busy</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-12T00:19:17.389095" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.388844" 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-12T00:19:17.390320" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.390209" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.390189" 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-12T00:19:17.394841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.394726" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.394707" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.395880" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.395487" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.396337" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.396055" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.396408" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.396562" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.395124" elapsed="0.001462"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.396936" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.397163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.397031" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.397015" elapsed="0.000222"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.396807" elapsed="0.000453"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.396654" elapsed="0.000630"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.394345" elapsed="0.002991"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.389925" elapsed="0.007469"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.389497" elapsed="0.007941"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.386506" elapsed="0.010984"/>
</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-12T00:19:17.398803" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.398942" 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-12T00:19:17.398539" elapsed="0.000430"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.399017" elapsed="0.000032"/>
</return>
<msg time="2026-04-12T00:19:17.399168" 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-12T00:19:17.398232" elapsed="0.000963"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.400180" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.399983" elapsed="0.000664">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.400804" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.400965" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.399685" elapsed="0.001393">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.401225" elapsed="0.000026"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.401296" elapsed="0.000181"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.399375" elapsed="0.002189">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.401633" 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-12T00:19:17.397944" elapsed="0.003786">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.401891" elapsed="0.000026"/>
</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-12T00:19:17.402051" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.402115" elapsed="0.000014"/>
</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-12T00:19:17.397660" elapsed="0.004548">Cannot open session, you need to establish a connection first.</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-12T00:19:17.403424" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.403060" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.403041" elapsed="0.000469"/>
</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-12T00:19:17.403660" elapsed="0.000318"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.408794" 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-12T00:19:17.408369" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.409048" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.408905" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.408887" elapsed="0.000223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.409537" 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-12T00:19:17.409243" elapsed="0.000320"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.409983" level="INFO">${reference} = netconf_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-12T00:19:17.409723" elapsed="0.000287"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.410326" level="INFO">${reference} = netconf_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-12T00:19:17.410155" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.410855" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.410489" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.411327" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.411021" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.411952" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.411499" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.412495" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.412195" 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-12T00:19:17.408042" elapsed="0.004556"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.402852" elapsed="0.009815"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.402476" elapsed="0.010234"/>
</kw>
<doc>Make sure the configuration has only the default elements in it.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.386051" elapsed="0.026700">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.415754" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.415492" 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-12T00:19:17.417019" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.416905" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.416886" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.421808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.421701" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.421682" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.422871" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.422450" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.423333" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.423047" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.423403" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.423557" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.422086" elapsed="0.001565"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.423999" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.424262" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.424096" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.424079" elapsed="0.000263"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.423870" elapsed="0.000495"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.423711" elapsed="0.000678"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.421317" elapsed="0.003126"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.416575" elapsed="0.007923"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.416159" elapsed="0.008384"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.413516" elapsed="0.011079"/>
</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-12T00:19:17.425883" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/missing-attr-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/missing-attr-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.426018" 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-12T00:19:17.425665" elapsed="0.000415"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.426131" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.426283" 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-12T00:19:17.425337" elapsed="0.000974"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.427319" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.427122" elapsed="0.000680">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.427959" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.428111" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.426778" elapsed="0.001444">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.428367" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.428432" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.426454" elapsed="0.002072">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.428579" elapsed="0.000015"/>
</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-12T00:19:17.425048" elapsed="0.003639">Cannot open session, you need to establish a connection first.</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-12T00:19:17.428836" elapsed="0.000022"/>
</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-12T00:19:17.428999" elapsed="0.000020"/>
</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-12T00:19:17.429157" 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-12T00:19:17.429315" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.429379" elapsed="0.000015"/>
</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-12T00:19:17.424775" elapsed="0.004699">Cannot open session, you need to establish a connection first.</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-12T00:19:17.430937" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.430330" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.430312" elapsed="0.000715"/>
</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-12T00:19:17.431165" elapsed="0.000321"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.436128" 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-12T00:19:17.435717" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.436372" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.436230" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.436212" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.436883" 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-12T00:19:17.436567" elapsed="0.000342"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.437312" level="INFO">${reference} = netconf_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-12T00:19:17.437054" elapsed="0.000284"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.437673" level="INFO">${reference} = netconf_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-12T00:19:17.437483" elapsed="0.000216"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.438190" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.437846" elapsed="0.000371"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.438757" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.438400" elapsed="0.000391"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.439371" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.438934" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.439873" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.439562" 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-12T00:19:17.435412" elapsed="0.004563"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.430114" elapsed="0.009910"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.429767" elapsed="0.010299"/>
</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-12T00:19:17.412954" elapsed="0.027153">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_missing_message_id_attribute&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.443242" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.442992" 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-12T00:19:17.444469" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.444359" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.444340" 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-12T00:19:17.448973" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.448866" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.448848" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.450000" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.449621" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.450458" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.450174" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.450528" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.450697" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.449248" elapsed="0.001484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.451071" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.451301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.451169" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.451152" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.450941" elapsed="0.000459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.450791" elapsed="0.000638"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.448493" elapsed="0.002989"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.444069" elapsed="0.007505"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.443657" elapsed="0.007979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.440869" elapsed="0.010820"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.452847" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/additional-attr-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/additional-attr-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.452982" 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-12T00:19:17.452437" elapsed="0.000573"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.453058" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.453208" 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-12T00:19:17.452120" elapsed="0.001115"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.454159" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.453976" elapsed="0.000645">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.454801" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.454961" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.453681" elapsed="0.001392">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.455219" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.455283" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.453377" elapsed="0.002001">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.455430" elapsed="0.000015"/>
</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-12T00:19:17.451842" elapsed="0.003676">Cannot open session, you need to establish a connection first.</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-12T00:19:17.455682" elapsed="0.000023"/>
</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-12T00:19:17.455840" 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-12T00:19:17.455992" 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-12T00:19:17.456141" elapsed="0.000019"/>
</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-12T00:19:17.456290" elapsed="0.000019"/>
</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-12T00:19:17.457507" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.457131" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.457113" elapsed="0.000479"/>
</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-12T00:19:17.457744" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.462619" 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-12T00:19:17.462201" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.462889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.462745" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.462705" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.463378" 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-12T00:19:17.463083" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.463860" level="INFO">${reference} = netconf_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-12T00:19:17.463584" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.464208" level="INFO">${reference} = netconf_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-12T00:19:17.464035" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.464733" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.464375" elapsed="0.000385"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.465209" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.464903" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.465830" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.465379" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.466312" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.466021" elapsed="0.000338"/>
</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-12T00:19:17.461910" elapsed="0.004503"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.456923" elapsed="0.009540"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.456569" elapsed="0.009934"/>
</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-12T00:19:17.440311" elapsed="0.026231">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_additional_attributes_in_message&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.469827" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.469559" 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-12T00:19:17.471068" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.470960" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.470941" 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-12T00:19:17.475570" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.475464" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.475446" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.476595" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.476220" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.477095" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.476809" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.477165" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.477325" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.475861" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.477700" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.478055" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.477839" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.477822" elapsed="0.000341"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.477551" elapsed="0.000636"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.477401" elapsed="0.000811"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.475106" elapsed="0.003160"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.470650" elapsed="0.007670"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.470227" elapsed="0.008137"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.467344" elapsed="0.011071"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.479411" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-nonexistent-namespace-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-nonexistent-namespace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.479542" 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-12T00:19:17.479197" elapsed="0.000374"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.479634" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.479785" 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-12T00:19:17.478882" elapsed="0.000932"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.480759" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.480559" elapsed="0.000641">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.481356" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.481507" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.480252" elapsed="0.001379">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.481779" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.481843" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.479954" elapsed="0.001982">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.481987" elapsed="0.000015"/>
</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-12T00:19:17.478560" elapsed="0.003520">Cannot open session, you need to establish a connection first.</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-12T00:19:17.482274" elapsed="0.000024"/>
</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-12T00:19:17.482431" elapsed="0.000020"/>
</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-12T00:19:17.482640" elapsed="0.000204"/>
</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-12T00:19:17.482983" elapsed="0.000022"/>
</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-12T00:19:17.483139" 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-12T00:19:17.484356" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.483986" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.483967" elapsed="0.000508"/>
</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-12T00:19:17.484628" elapsed="0.000319"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.489672" 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-12T00:19:17.489247" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.489925" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.489783" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.489764" elapsed="0.000223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.490415" 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-12T00:19:17.490121" elapsed="0.000320"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.490879" level="INFO">${reference} = netconf_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-12T00:19:17.490585" elapsed="0.000321"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.491224" level="INFO">${reference} = netconf_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-12T00:19:17.491052" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.491744" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.491389" elapsed="0.000381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.492216" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.491912" elapsed="0.000332"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.492837" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.492384" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.493325" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.493032" elapsed="0.000339"/>
</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-12T00:19:17.488956" elapsed="0.004469"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.483777" elapsed="0.009697"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.483421" elapsed="0.010093"/>
</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-12T00:19:17.466768" elapsed="0.026786">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_send_stuff_in_undefined_namespace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.496566" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.496320" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.497796" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.497687" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.497668" 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-12T00:19:17.502519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.502411" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.502393" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.503636" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.503243" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.504094" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.503811" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.504163" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.504316" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.502878" elapsed="0.001462"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.504694" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.504923" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.504792" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.504775" elapsed="0.000223"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.504542" elapsed="0.000479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.504393" elapsed="0.000652"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.502048" elapsed="0.003050"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.497390" elapsed="0.007763"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.496985" elapsed="0.008212"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.494295" elapsed="0.010953"/>
</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-12T00:19:17.506503" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-1-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.506654" 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-12T00:19:17.506293" elapsed="0.000390"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.506739" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.506890" 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-12T00:19:17.505995" elapsed="0.000923"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.507867" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.507676" elapsed="0.000655">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.508486" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.508653" elapsed="0.000022"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.507359" elapsed="0.001425">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.508945" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.509009" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.507058" elapsed="0.002045">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.509154" elapsed="0.000015"/>
</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-12T00:19:17.505705" elapsed="0.003539">Cannot open session, you need to establish a connection first.</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-12T00:19:17.509387" elapsed="0.000021"/>
</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-12T00:19:17.509546" elapsed="0.000020"/>
</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-12T00:19:17.509758" 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-12T00:19:17.509919" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.509983" elapsed="0.000015"/>
</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-12T00:19:17.505416" elapsed="0.004664">Cannot open session, you need to establish a connection first.</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-12T00:19:17.511532" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.510969" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.510950" elapsed="0.000686"/>
</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-12T00:19:17.511775" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.516665" 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-12T00:19:17.516244" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.516914" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.516770" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.516749" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.517403" 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-12T00:19:17.517110" elapsed="0.000320"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.517845" level="INFO">${reference} = netconf_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-12T00:19:17.517571" elapsed="0.000300"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.518193" level="INFO">${reference} = netconf_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-12T00:19:17.518017" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.518719" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.518362" elapsed="0.000409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.519235" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.518922" elapsed="0.000342"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.519889" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.519403" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.520375" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.520082" 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-12T00:19:17.515954" elapsed="0.004523"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.510712" elapsed="0.009816"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.510349" elapsed="0.010221"/>
</kw>
<doc>Request a "merge" operation adding an element in candidate configuration and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.493771" elapsed="0.026857">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_first_batch_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.523815" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.523443" elapsed="0.000633"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.525072" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.524962" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.524943" 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-12T00:19:17.529593" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.529482" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.529463" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.530634" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.530244" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.531110" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.530823" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.531180" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.531333" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.529884" elapsed="0.001473"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.531707" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.531937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.531805" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.531788" elapsed="0.000223"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.531556" elapsed="0.000478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.531409" elapsed="0.000649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.529128" elapsed="0.002981"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.524674" elapsed="0.007489"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.524212" elapsed="0.007994"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.521437" elapsed="0.010820"/>
</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-12T00:19:17.533710" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-no-edit-before-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-no-edit-before-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.533844" 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-12T00:19:17.533482" elapsed="0.000391"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.533920" elapsed="0.000028"/>
</return>
<msg time="2026-04-12T00:19:17.534068" 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-12T00:19:17.533169" elapsed="0.000926"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.535048" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.534856" elapsed="0.000636">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.535665" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.535819" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.534519" elapsed="0.001411">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.536109" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.536173" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.534233" elapsed="0.002037">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.536321" elapsed="0.000015"/>
</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-12T00:19:17.532704" elapsed="0.003713">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.536575" elapsed="0.000022"/>
</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-12T00:19:17.536746" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.536809" elapsed="0.000019"/>
</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-12T00:19:17.532406" elapsed="0.004506">Cannot open session, you need to establish a connection first.</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-12T00:19:17.538101" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.537740" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.537722" elapsed="0.000463"/>
</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-12T00:19:17.538320" elapsed="0.000327"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.543259" 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-12T00:19:17.542845" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.543501" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.543360" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.543342" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.544015" 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-12T00:19:17.543712" elapsed="0.000330"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.544437" level="INFO">${reference} = netconf_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-12T00:19:17.544184" elapsed="0.000279"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.544885" level="INFO">${reference} = netconf_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-12T00:19:17.544700" elapsed="0.000212"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.545391" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit"
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-12T00:19:17.545052" elapsed="0.000366"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.545882" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.545559" elapsed="0.000351"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.546481" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.546050" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.548587" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.546742" elapsed="0.001912"/>
</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-12T00:19:17.542511" elapsed="0.006206"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.537517" elapsed="0.011284"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.537178" elapsed="0.011665"/>
</kw>
<doc>Make sure the running configuration is still unchanged as the change was not commited yet.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.520865" elapsed="0.028022">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_edit_before_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.551798" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.551534" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.553083" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.552971" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.552952" 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-12T00:19:17.558214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.558106" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.558087" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.559293" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.558914" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.559775" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.559467" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.559846" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.560003" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.558496" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.560364" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.560594" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.560462" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.560444" elapsed="0.000242"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.560234" elapsed="0.000476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.560081" elapsed="0.000653"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.557741" elapsed="0.003046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.552683" elapsed="0.008159"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.552253" elapsed="0.008632"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.549497" elapsed="0.011438"/>
</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-12T00:19:17.562192" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-edit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-edit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.562327" 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-12T00:19:17.561978" elapsed="0.000376"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.562400" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.562547" 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-12T00:19:17.561671" elapsed="0.000902"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.563765" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.563368" elapsed="0.000842">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.564368" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.564555" elapsed="0.000022"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.563031" elapsed="0.001654">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.564832" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.564896" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.562729" elapsed="0.002263">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.565044" elapsed="0.000015"/>
</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-12T00:19:17.561370" elapsed="0.003765">Cannot open session, you need to establish a connection first.</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-12T00:19:17.565280" elapsed="0.000022"/>
</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-12T00:19:17.565440" elapsed="0.000020"/>
</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-12T00:19:17.565596" elapsed="0.000036"/>
</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-12T00:19:17.565771" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.565834" elapsed="0.000014"/>
</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-12T00:19:17.561096" elapsed="0.004831">Cannot open session, you need to establish a connection first.</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-12T00:19:17.567160" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.566785" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.566740" elapsed="0.000504"/>
</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-12T00:19:17.567380" elapsed="0.000332"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.572436" 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-12T00:19:17.572013" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.572718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.572557" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.572538" elapsed="0.000243"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.573213" 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-12T00:19:17.572916" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.573660" level="INFO">${reference} = netconf_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-12T00:19:17.573383" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.574005" level="INFO">${reference} = netconf_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-12T00:19:17.573833" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.574631" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.574211" elapsed="0.000449"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.575153" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.574843" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.575781" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.575327" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.576313" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.576013" 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-12T00:19:17.571715" elapsed="0.004700"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.566533" elapsed="0.009932"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.566192" elapsed="0.010313"/>
</kw>
<doc>Commit the change and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.549092" elapsed="0.027453">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.579480" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.579225" 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-12T00:19:17.580720" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.580592" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.580573" 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-12T00:19:17.585516" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.585408" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.585389" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.586564" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.586188" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.587056" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.586757" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.587127" elapsed="0.000028"/>
</return>
<msg time="2026-04-12T00:19:17.587282" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.585821" elapsed="0.001486"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.587659" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.587898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.587758" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.587740" elapsed="0.000233"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.587508" elapsed="0.000489"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.587359" elapsed="0.000662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.585046" elapsed="0.003028"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.580309" elapsed="0.007818"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.579899" elapsed="0.008274"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.577270" elapsed="0.010952"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.589171" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.589310" 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-12T00:19:17.588958" elapsed="0.000381"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.589417" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:17.589569" 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-12T00:19:17.588653" elapsed="0.000944"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.590541" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.590354" elapsed="0.000666">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.591181" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.591333" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.590060" elapsed="0.001383">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.591589" elapsed="0.000038"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.591673" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.589771" elapsed="0.001996">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.591819" elapsed="0.000015"/>
</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-12T00:19:17.588367" elapsed="0.003540">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.592038" elapsed="0.000021"/>
</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-12T00:19:17.593236" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.592876" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.592857" elapsed="0.000464"/>
</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-12T00:19:17.593458" elapsed="0.000332"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.598586" 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-12T00:19:17.598183" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.598890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.598709" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.598690" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.599387" 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-12T00:19:17.599090" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.599831" level="INFO">${reference} = netconf_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-12T00:19:17.599558" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.600180" level="INFO">${reference} = netconf_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-12T00:19:17.600006" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.600705" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_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-12T00:19:17.600346" elapsed="0.000387"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.601185" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_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-12T00:19:17.600877" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.601813" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.601355" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.602347" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.602048" 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-12T00:19:17.597884" elapsed="0.004567"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.592665" elapsed="0.009836"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.592312" elapsed="0.010230"/>
</kw>
<doc>Check that the change is now in the configuration.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.576761" elapsed="0.025820">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_to_confirm_edit_after_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.605557" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.605302" 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-12T00:19:17.606819" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.606681" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.606661" elapsed="0.000229"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.611380" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.611273" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.611254" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.612420" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.612042" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.612905" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.612595" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.612976" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.613130" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.611677" elapsed="0.001478"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.613489" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.613736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.613587" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.613569" elapsed="0.000244"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.613359" elapsed="0.000477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.613209" elapsed="0.000651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.610909" elapsed="0.003003"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.606378" elapsed="0.007589"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.605973" elapsed="0.008038"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.603287" elapsed="0.010775"/>
</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-12T00:19:17.615798" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/close-session-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/close-session-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.615965" 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-12T00:19:17.615558" elapsed="0.000436"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.616043" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.616196" 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-12T00:19:17.615242" elapsed="0.000981"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.617165" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.616981" elapsed="0.000620">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.617774" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.617928" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.616684" elapsed="0.001357">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.618189" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.618254" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.616372" elapsed="0.001979">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.618404" elapsed="0.000015"/>
</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-12T00:19:17.614744" elapsed="0.003753">Cannot open session, you need to establish a connection first.</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-12T00:19:17.618658" elapsed="0.000022"/>
</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-12T00:19:17.618832" 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-12T00:19:17.618994" 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-12T00:19:17.619152" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.619217" elapsed="0.000015"/>
</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-12T00:19:17.614459" elapsed="0.004854">Cannot open session, you need to establish a connection first.</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-12T00:19:17.619512" elapsed="0.000022"/>
</kw>
<status status="FAIL" start="2026-04-12T00:19:17.614189" elapsed="0.005446">Cannot open session, you need to establish a connection first.</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-12T00:19:17.620813" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.620439" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.620422" elapsed="0.000503"/>
</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-12T00:19:17.621085" elapsed="0.000331"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.626081" 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-12T00:19:17.625680" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.626325" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.626183" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.626165" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.626852" 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-12T00:19:17.626520" elapsed="0.000361"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.627276" level="INFO">${reference} = netconf_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-12T00:19:17.627024" elapsed="0.000278"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.627633" level="INFO">${reference} = netconf_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-12T00:19:17.627447" elapsed="0.000213"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.628186" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.627841" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.628681" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.628356" elapsed="0.000354"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.629455" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.628858" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.629965" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.629666" 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-12T00:19:17.625371" elapsed="0.004697"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.620233" elapsed="0.009885"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.619897" elapsed="0.010262"/>
</kw>
<doc>Close the session and disconnect.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.602812" elapsed="0.027386">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_terminate_connection_gracefully&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.633207" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.632960" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.634425" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.634316" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.634296" 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-12T00:19:17.639040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.638932" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.638914" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.640069" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.639691" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.640530" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.640244" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.640619" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.640774" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.639316" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.641130" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.641407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.641241" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.641218" elapsed="0.000268"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.641000" elapsed="0.000509"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.640851" elapsed="0.000716"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.638528" elapsed="0.003121"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.634031" elapsed="0.007676"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.633619" elapsed="0.008132"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.630954" elapsed="0.010851"/>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<kw name="Reopen_ODL_Netconf_Connection">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.650059" level="FAIL">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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="FAIL" start="2026-04-12T00:19:17.642483" elapsed="0.007618">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${hello}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.650258" elapsed="0.000022"/>
</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-12T00:19:17.650423" elapsed="0.000020"/>
</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-12T00:19:17.650580" elapsed="0.000020"/>
</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-12T00:19:17.650766" 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-12T00:19:17.650933" elapsed="0.000020"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.650993" elapsed="0.000015"/>
</return>
<var>${hello}</var>
<doc>Reopen a closed netconf connection.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.642231" elapsed="0.008863">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:17.651234" elapsed="0.000021"/>
</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-12T00:19:17.651379" elapsed="0.000021"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.651438" elapsed="0.000015"/>
</return>
<doc>Open a prepared netconf connecion.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.641956" elapsed="0.009575">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:17.652738" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.652356" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.652339" elapsed="0.000483"/>
</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-12T00:19:17.652957" elapsed="0.000314"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.661046" 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-12T00:19:17.657433" elapsed="0.003642"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.661296" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.661152" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.661133" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.661814" 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-12T00:19:17.661494" elapsed="0.000348"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.662256" level="INFO">${reference} = netconf_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-12T00:19:17.661986" elapsed="0.000297"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.662624" level="INFO">${reference} = netconf_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-12T00:19:17.662430" elapsed="0.000223"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.663169" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end"
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-12T00:19:17.662794" elapsed="0.000402"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.663714" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.663383" elapsed="0.000360"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.664318" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"

Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:17.663886" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.664823" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.664510" 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-12T00:19:17.657145" elapsed="0.007782"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.652149" elapsed="0.012828"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.651809" elapsed="0.013209"/>
</kw>
<doc>Reconnect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.630401" elapsed="0.034657">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_graceful_session_end&amp;order=bug_status"

Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:17.668156" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.667909" 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-12T00:19:17.669375" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.669265" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.669247" 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-12T00:19:17.673969" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.673847" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.673828" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.675079" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.674668" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.675553" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.675260" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.675640" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.675801" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.674246" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.676156" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.676422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.676286" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.676267" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.676027" elapsed="0.000494"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.675877" elapsed="0.000667"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.673459" elapsed="0.003138"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.668983" elapsed="0.007726"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.668555" elapsed="0.008201"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.665767" elapsed="0.011041"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.677791" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-edit-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.677930" 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-12T00:19:17.677550" elapsed="0.000412"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.678008" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.678158" 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-12T00:19:17.677232" elapsed="0.000954"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.679347" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.679160" elapsed="0.000651">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.679967" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.680121" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.678646" elapsed="0.001585">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.680376" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.680440" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.678327" elapsed="0.002207">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.680585" elapsed="0.000014"/>
</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-12T00:19:17.676958" elapsed="0.003734">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.680821" 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-12T00:19:17.682038" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.681670" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.681652" elapsed="0.000470"/>
</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-12T00:19:17.682257" elapsed="0.000313"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.687172" 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-12T00:19:17.686739" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.687416" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.687274" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.687256" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.687932" 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-12T00:19:17.687629" elapsed="0.000330"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.688355" level="INFO">${reference} = netconf_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-12T00:19:17.688102" elapsed="0.000279"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.688714" level="INFO">${reference} = netconf_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-12T00:19:17.688526" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.689237" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect"
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-12T00:19:17.688881" elapsed="0.000421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.689784" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.689450" elapsed="0.000363"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.690389" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.689955" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.690912" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.690580" elapsed="0.000381"/>
</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-12T00:19:17.686435" elapsed="0.004581"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.681440" elapsed="0.009626"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.681095" elapsed="0.010012"/>
</kw>
<doc>Check that the change is now in the configuration.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.665258" elapsed="0.025888">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_first_batch_in_config_running_after_reconnect&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.694434" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.694186" 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-12T00:19:17.695716" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.695588" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.695570" 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-12T00:19:17.700202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.700094" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.700076" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.701256" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.700873" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.701731" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.701429" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.701801" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.701952" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.700485" elapsed="0.001492"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.702304" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.702533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.702401" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.702385" elapsed="0.000239"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.702175" elapsed="0.000473"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.702027" elapsed="0.000646"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.699736" elapsed="0.002990"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.695306" elapsed="0.007516"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.694880" elapsed="0.008017"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.691992" elapsed="0.010960"/>
</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-12T00:19:17.704373" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/create-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/create-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.704508" 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-12T00:19:17.704157" elapsed="0.000380"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.704583" elapsed="0.000045"/>
</return>
<msg time="2026-04-12T00:19:17.704751" 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-12T00:19:17.703783" elapsed="0.000997"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.705719" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.705515" elapsed="0.000652">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.706322" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.706474" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.705214" elapsed="0.001371">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.706749" elapsed="0.000027"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.706820" elapsed="0.000191"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.704919" elapsed="0.002179">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.707152" elapsed="0.000015"/>
</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-12T00:19:17.703463" elapsed="0.003780">Cannot open session, you need to establish a connection first.</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-12T00:19:17.707389" elapsed="0.000021"/>
</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-12T00:19:17.707550" elapsed="0.000020"/>
</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-12T00:19:17.707731" 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-12T00:19:17.707889" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.707952" elapsed="0.000015"/>
</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-12T00:19:17.703114" elapsed="0.004931">Cannot open session, you need to establish a connection first.</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-12T00:19:17.709239" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.708873" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.708855" elapsed="0.000469"/>
</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-12T00:19:17.709458" elapsed="0.000328"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.714357" 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-12T00:19:17.713954" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.714598" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.714457" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.714439" elapsed="0.000280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.715167" 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-12T00:19:17.714869" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.715592" level="INFO">${reference} = netconf_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-12T00:19:17.715336" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.715965" level="INFO">${reference} = netconf_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-12T00:19:17.715783" elapsed="0.000212"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.716480" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.716138" elapsed="0.000370"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.716979" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.716670" elapsed="0.000338"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.717584" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.717148" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.718090" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.717797" 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-12T00:19:17.713662" elapsed="0.004530"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.708665" elapsed="0.009576"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.708311" elapsed="0.009972"/>
</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-12T00:19:17.691347" elapsed="0.026975">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_create_shall_fail_now&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.721323" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.721067" 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-12T00:19:17.722569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.722452" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.722432" 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-12T00:19:17.728702" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.728575" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.728556" elapsed="0.000218"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.729812" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.729348" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.730281" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.729988" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.730351" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.730505" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.728986" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.730937" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.731166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.731034" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.731017" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.730789" elapsed="0.000481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.730633" elapsed="0.000662"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.728212" elapsed="0.003136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.722145" elapsed="0.009257"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.721738" elapsed="0.009708"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.719093" elapsed="0.012403"/>
</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-12T00:19:17.732759" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/delete-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/delete-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.732897" 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-12T00:19:17.732525" elapsed="0.000401"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.732972" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.733119" 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-12T00:19:17.732225" elapsed="0.000921"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.734058" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.733877" elapsed="0.000619">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.734671" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.734830" elapsed="0.000054"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.733568" elapsed="0.001410">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.735123" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.735187" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.733285" elapsed="0.001997">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.735334" elapsed="0.000015"/>
</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-12T00:19:17.731943" elapsed="0.003480">Cannot open session, you need to establish a connection first.</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-12T00:19:17.735566" elapsed="0.000021"/>
</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-12T00:19:17.735742" 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-12T00:19:17.735899" 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-12T00:19:17.736053" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.736116" elapsed="0.000015"/>
</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-12T00:19:17.731670" elapsed="0.004540">Cannot open session, you need to establish a connection first.</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-12T00:19:17.737397" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.737036" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.737019" 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-12T00:19:17.737671" elapsed="0.025594"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.768144" 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-12T00:19:17.767678" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.768416" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.768261" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.768236" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.768951" 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-12T00:19:17.768648" elapsed="0.000330"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.769387" level="INFO">${reference} = netconf_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-12T00:19:17.769127" elapsed="0.000287"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.769754" level="INFO">${reference} = netconf_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-12T00:19:17.769562" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.770331" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.769980" elapsed="0.000378"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.770832" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.770502" elapsed="0.000359"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.771468" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.771024" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.771974" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.771679" 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-12T00:19:17.767329" elapsed="0.004750"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.736831" elapsed="0.035299"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.736477" elapsed="0.035694"/>
</kw>
<doc>Delete the created element from the candidate configuration and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.718522" elapsed="0.053701">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_delete_first_batch&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.775401" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.775147" 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-12T00:19:17.776660" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.776532" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.776513" 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-12T00:19:17.781310" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.781174" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.781154" elapsed="0.000225"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.782357" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.781977" elapsed="0.000466"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.782946" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.782597" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.783022" elapsed="0.000036"/>
</return>
<msg time="2026-04-12T00:19:17.783187" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.781591" elapsed="0.001621"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.783566" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.783821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.783684" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.783666" elapsed="0.000231"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.783433" elapsed="0.000488"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.783272" elapsed="0.000675"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.780813" elapsed="0.003188"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.776242" elapsed="0.007815"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.775826" elapsed="0.008275"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.773100" elapsed="0.011052"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.785122" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-no-delete-before-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-no-delete-before-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.785289" 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-12T00:19:17.784900" elapsed="0.000419"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.785365" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:17.785517" 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-12T00:19:17.784574" elapsed="0.000972"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.786503" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.786303" elapsed="0.000762">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.787227" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.787383" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.786004" elapsed="0.001496">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.787665" elapsed="0.000023"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.787732" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.785708" elapsed="0.002121">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.787881" elapsed="0.000015"/>
</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-12T00:19:17.784303" elapsed="0.003669">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_First_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.788105" 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-12T00:19:17.789336" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.788963" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.788945" elapsed="0.000514"/>
</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-12T00:19:17.789600" elapsed="0.000339"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.794752" 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-12T00:19:17.794326" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.795029" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.794857" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.794839" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.795542" 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-12T00:19:17.795239" elapsed="0.000330"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.795996" level="INFO">${reference} = netconf_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-12T00:19:17.795733" elapsed="0.000292"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.796350" level="INFO">${reference} = netconf_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-12T00:19:17.796173" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.796884" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit"
reference somewhere i...</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-12T00:19:17.796518" elapsed="0.000394"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.797367" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_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-12T00:19:17.797056" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.797991" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.797539" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.798495" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.798184" elapsed="0.000377"/>
</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-12T00:19:17.794027" elapsed="0.004631"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.788752" elapsed="0.009964"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.788391" elapsed="0.010374"/>
</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-12T00:19:17.772456" elapsed="0.026349">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_no_delete_before_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.801753" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.801477" 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-12T00:19:17.803013" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.802874" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.802855" 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-12T00:19:17.807534" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.807424" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.807406" elapsed="0.000260"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.808663" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.808259" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.809134" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.808842" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.809205" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.809362" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.807891" elapsed="0.001497"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.809741" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.809976" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.809841" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.809824" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.809592" elapsed="0.000483"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.809441" elapsed="0.000658"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.807062" elapsed="0.003090"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.802569" elapsed="0.007637"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.802156" elapsed="0.008094"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.799482" elapsed="0.010819"/>
</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-12T00:19:17.811808" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-delete-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-delete-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.811942" 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-12T00:19:17.811568" elapsed="0.000401"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.812017" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.812172" 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-12T00:19:17.811083" elapsed="0.001117"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.813161" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.812971" elapsed="0.000658">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.813791" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.813951" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.812660" elapsed="0.001406">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.814219" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.814286" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.812344" elapsed="0.002043">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.814442" 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-12T00:19:17.810758" elapsed="0.003779">Cannot open session, you need to establish a connection first.</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-12T00:19:17.814705" elapsed="0.000022"/>
</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-12T00:19:17.814870" elapsed="0.000040"/>
</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-12T00:19:17.815061" elapsed="0.000056"/>
</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-12T00:19:17.815266" elapsed="0.000022"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.815335" elapsed="0.000016"/>
</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-12T00:19:17.810463" elapsed="0.004973">Cannot open session, you need to establish a connection first.</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-12T00:19:17.816696" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.816304" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.816285" 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-12T00:19:17.816924" elapsed="0.000324"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.821900" 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-12T00:19:17.821475" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.822148" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.822004" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.821985" elapsed="0.000227"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.822666" 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-12T00:19:17.822347" elapsed="0.000346"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.823121" level="INFO">${reference} = netconf_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-12T00:19:17.822840" elapsed="0.000307"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.823471" level="INFO">${reference} = netconf_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-12T00:19:17.823295" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.824002" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.823654" elapsed="0.000375"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.824481" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.824172" elapsed="0.000337"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.825146" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.824665" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.825653" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.825343" 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-12T00:19:17.821181" elapsed="0.004576"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.816089" elapsed="0.009720"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.815736" elapsed="0.010116"/>
</kw>
<doc>Commit the deletion of the element and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.799048" elapsed="0.026845">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_delete&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.829124" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.828871" 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-12T00:19:17.830360" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.830247" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.830228" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.834865" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.834756" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.834737" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.835977" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.835573" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.836447" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.836157" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.836519" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.836693" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.835204" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.837066" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.837299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.837165" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.837148" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.836934" elapsed="0.000465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.836779" elapsed="0.000645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.834379" elapsed="0.003098"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.829958" elapsed="0.007576"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.829528" elapsed="0.008051"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.826601" elapsed="0.011049"/>
</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-12T00:19:17.838939" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-delete-after-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-delete-after-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.839093" 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-12T00:19:17.838703" elapsed="0.000419"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.839170" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.839322" 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-12T00:19:17.838376" elapsed="0.000976"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.840295" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.840106" elapsed="0.000834">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.841101" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.841257" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.839807" elapsed="0.001563">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.841519" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.841639" elapsed="0.000018"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.839495" elapsed="0.002250">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.841800" 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-12T00:19:17.838082" elapsed="0.003812">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.842051" elapsed="0.000022"/>
</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-12T00:19:17.842209" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.842276" 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-12T00:19:17.837803" elapsed="0.004568">Cannot open session, you need to establish a connection first.</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-12T00:19:17.843650" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.843266" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.843247" elapsed="0.000490"/>
</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-12T00:19:17.843874" elapsed="0.000316"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.848818" 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-12T00:19:17.848394" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.849065" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.848921" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.848903" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.849562" 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-12T00:19:17.849265" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.850012" level="INFO">${reference} = netconf_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-12T00:19:17.849752" elapsed="0.000288"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.850364" level="INFO">${reference} = netconf_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-12T00:19:17.850188" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.850894" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit"
reference somewhere insid...</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-12T00:19:17.850532" elapsed="0.000421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.851431" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.851117" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.852059" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.851616" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.852547" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.852253" 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-12T00:19:17.848100" elapsed="0.004572"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.843046" elapsed="0.009714"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.842660" elapsed="0.010144"/>
</kw>
<doc>Check that the element is gone.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.826099" elapsed="0.026745">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_config_running_to_confirm_delete_after_commit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.855902" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.855641" 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-12T00:19:17.857149" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.857035" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.857015" 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-12T00:19:17.861880" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.861770" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.861749" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.862931" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.862520" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.863394" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.863110" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.863465" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.863633" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.862158" elapsed="0.001501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.863990" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.864218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.864087" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.864071" elapsed="0.000221"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.863862" elapsed="0.000453"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.863713" elapsed="0.000625"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.861384" elapsed="0.003006"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.856746" elapsed="0.007698"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.856305" elapsed="0.008183"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.853599" elapsed="0.010940"/>
</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-12T00:19:17.865813" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.865943" 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-12T00:19:17.865584" elapsed="0.000386"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.866017" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.866165" 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-12T00:19:17.865281" elapsed="0.000910"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.867149" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.866960" elapsed="0.000635">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.867771" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.867966" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.866632" elapsed="0.001447">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.868227" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.868292" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.866331" elapsed="0.002057">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.868441" elapsed="0.000015"/>
</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-12T00:19:17.864998" elapsed="0.003533">Cannot open session, you need to establish a connection first.</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-12T00:19:17.868693" elapsed="0.000022"/>
</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-12T00:19:17.868855" elapsed="0.000020"/>
</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-12T00:19:17.869014" 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-12T00:19:17.869172" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.869237" elapsed="0.000014"/>
</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-12T00:19:17.864714" elapsed="0.004618">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.870475" 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-12T00:19:17.870074" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.870736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.870577" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.870558" elapsed="0.000241"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-12T00:19:17.870969" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.872438" 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-12T00:19:17.871905" elapsed="0.000595">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-12T00:19:17.872595" 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-12T00:19:17.871335" elapsed="0.001301"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.873131" 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-12T00:19:17.872795" elapsed="0.000362"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.873594" 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-12T00:19:17.873307" elapsed="0.000334"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.874095" 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-12T00:19:17.873790" elapsed="0.000331"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.874644" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-12T00:19:17.874263" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.875144" 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-12T00:19:17.874869" elapsed="0.000319"/>
</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-12T00:19:17.875846" 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-12T00:19:17.875484" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.875256" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.875238" elapsed="0.000713"/>
</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-12T00:19:17.869735" elapsed="0.006262"/>
</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-12T00:19:17.853047" elapsed="0.022995">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</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-12T00:19:17.879202" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.878778" elapsed="0.000688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.880429" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.880314" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.880295" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.885056" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.884949" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.884930" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.886089" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.885710" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.886552" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.886264" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.886641" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:17.886803" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.885334" elapsed="0.001494"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.887183" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.887414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.887281" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.887264" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.887051" elapsed="0.000462"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.886880" elapsed="0.000658"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.884574" elapsed="0.003017"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.880031" elapsed="0.007634"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.879619" elapsed="0.008091"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.876766" elapsed="0.010997"/>
</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-12T00:19:17.889015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-2-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-2-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.889147" 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-12T00:19:17.888798" elapsed="0.000378"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.889222" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.889369" 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-12T00:19:17.888480" elapsed="0.000916"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.890315" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.890133" elapsed="0.000641">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.890955" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.891118" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.889839" elapsed="0.001392">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.891415" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.891481" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.889534" elapsed="0.002044">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.891647" 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-12T00:19:17.888198" elapsed="0.003542">Cannot open session, you need to establish a connection first.</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-12T00:19:17.891887" elapsed="0.000021"/>
</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-12T00:19:17.892047" elapsed="0.000020"/>
</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-12T00:19:17.892205" 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-12T00:19:17.892363" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.892426" elapsed="0.000015"/>
</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-12T00:19:17.887926" elapsed="0.004594">Cannot open session, you need to establish a connection first.</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-12T00:19:17.893925" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.893350" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.893331" elapsed="0.000682"/>
</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-12T00:19:17.894149" elapsed="0.000317"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.899062" 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-12T00:19:17.898628" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.899307" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.899165" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.899147" elapsed="0.000223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.899826" 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-12T00:19:17.899505" elapsed="0.000348"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.900250" level="INFO">${reference} = netconf_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-12T00:19:17.899996" elapsed="0.000280"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.900594" level="INFO">${reference} = netconf_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-12T00:19:17.900420" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.901121" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.900776" elapsed="0.000372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.901598" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.901290" elapsed="0.000350"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.902216" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.901783" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.902721" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.902413" elapsed="0.000391"/>
</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-12T00:19:17.898322" elapsed="0.004539"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.893142" elapsed="0.009769"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.892804" elapsed="0.010165"/>
</kw>
<doc>Create an element to be discarded and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.876278" elapsed="0.026732">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_second_batch_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.906001" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.905754" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.907243" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.907134" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.907114" 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-12T00:19:17.911820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.911707" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.911689" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.912847" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.912455" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.913310" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.913023" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.913380" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.913534" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.912095" elapsed="0.001464"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.913911" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.914139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.914008" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.913991" elapsed="0.000224"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.913781" elapsed="0.000457"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.913628" elapsed="0.000634"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.911335" elapsed="0.002979"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.906825" elapsed="0.007543"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.906398" elapsed="0.008014"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.903757" elapsed="0.010705"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:17.915621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-candidate-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-candidate-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.915755" 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-12T00:19:17.915223" elapsed="0.000564"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.915835" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.915984" 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-12T00:19:17.914892" elapsed="0.001149"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.916976" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.916793" elapsed="0.000631">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.917578" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.917749" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.916479" elapsed="0.001380">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.918005" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.918069" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.916186" elapsed="0.001978">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.918216" elapsed="0.000014"/>
</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-12T00:19:17.914620" elapsed="0.003684">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_First_Batch_Data_Not_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.918434" elapsed="0.000022"/>
</kw>
<kw name="Check_Second_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.918563" elapsed="0.000021"/>
</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-12T00:19:17.919799" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.919421" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.919403" elapsed="0.000481"/>
</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-12T00:19:17.920020" elapsed="0.000314"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.924944" 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-12T00:19:17.924490" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.925188" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.925046" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.925028" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.925696" 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-12T00:19:17.925385" elapsed="0.000338"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.926119" level="INFO">${reference} = netconf_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-12T00:19:17.925864" elapsed="0.000281"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.926459" level="INFO">${reference} = netconf_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-12T00:19:17.926287" elapsed="0.000198"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.926994" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.926637" elapsed="0.000388"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.927476" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.927169" elapsed="0.000334"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.928095" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.927661" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.928587" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.928290" elapsed="0.000397"/>
</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-12T00:19:17.924194" elapsed="0.004551"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.919214" elapsed="0.009581"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.918853" elapsed="0.009983"/>
</kw>
<doc>Check that the element to be discarded is present in the candidate configuration.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.903212" elapsed="0.025664">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_for_discard&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.932065" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.931815" 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-12T00:19:17.933292" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.933182" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.933162" 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-12T00:19:17.937784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.937676" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.937657" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.938809" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.938418" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.939295" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.939007" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.939366" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.939518" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.938061" elapsed="0.001482"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.939899" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.940130" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.939997" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.939980" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.939768" elapsed="0.000461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.939595" elapsed="0.000658"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.937299" elapsed="0.003006"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.932897" elapsed="0.007463"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.932472" elapsed="0.007933"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.929561" elapsed="0.010895"/>
</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-12T00:19:17.941722" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-discard-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-discard-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.941852" 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-12T00:19:17.941495" elapsed="0.000384"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.941959" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:17.942111" 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-12T00:19:17.941192" elapsed="0.000946"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.943079" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.942880" elapsed="0.002085">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.945125" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.945281" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.942567" elapsed="0.002826">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.945541" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.945620" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.942279" elapsed="0.003440">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.945771" elapsed="0.000015"/>
</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-12T00:19:17.940907" elapsed="0.004954">Cannot open session, you need to establish a connection first.</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-12T00:19:17.946007" elapsed="0.000022"/>
</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-12T00:19:17.946169" elapsed="0.000020"/>
</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-12T00:19:17.946327" elapsed="0.000019"/>
</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-12T00:19:17.946482" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.946545" 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-12T00:19:17.940631" elapsed="0.006023">Cannot open session, you need to establish a connection first.</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-12T00:19:17.947880" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.947506" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.947488" elapsed="0.000477"/>
</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-12T00:19:17.948100" elapsed="0.000311"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.952946" 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-12T00:19:17.952527" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.953189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.953047" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.953029" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.953694" 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-12T00:19:17.953383" elapsed="0.000338"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.954116" level="INFO">${reference} = netconf_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-12T00:19:17.953864" elapsed="0.000278"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.954455" level="INFO">${reference} = netconf_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-12T00:19:17.954286" elapsed="0.000194"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.955000" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:17.954633" elapsed="0.000399"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.955520" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.955174" elapsed="0.000375"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.956143" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.955708" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.956642" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.956335" elapsed="0.000356"/>
</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-12T00:19:17.952239" elapsed="0.004507"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.947298" elapsed="0.009497"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.946927" elapsed="0.009908"/>
</kw>
<doc>Ask the server to discard the candidate and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.929079" elapsed="0.027796">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_discard_changes_using_discard_request&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.959923" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.959666" 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-12T00:19:17.961146" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.961036" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.961017" 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-12T00:19:17.965853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.965745" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.965726" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.966891" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.966495" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.967369" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.967083" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.967440" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.967593" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.966133" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.967964" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.968191" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.968061" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.968044" elapsed="0.000222"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.967835" elapsed="0.000455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.967687" elapsed="0.000627"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.965362" elapsed="0.003004"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.960752" elapsed="0.007668"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.960320" elapsed="0.008182"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.957558" elapsed="0.010999"/>
</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-12T00:19:17.969817" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-candidate-discard-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/get-config-candidate-discard-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.969945" 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-12T00:19:17.969588" elapsed="0.000385"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.970020" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.970167" 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-12T00:19:17.969287" elapsed="0.000907"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.971155" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.970938" elapsed="0.000651">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.971766" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.971920" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.970642" elapsed="0.001390">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.972177" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.972242" elapsed="0.000014"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.970337" elapsed="0.001999">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.972389" elapsed="0.000015"/>
</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-12T00:19:17.969002" elapsed="0.003477">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Test_Objects_Absent">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:17.972651" elapsed="0.000023"/>
</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-12T00:19:17.972807" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.972870" elapsed="0.000014"/>
</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-12T00:19:17.968722" elapsed="0.004241">Cannot open session, you need to establish a connection first.</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-12T00:19:17.974168" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.973802" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.973784" elapsed="0.000468"/>
</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-12T00:19:17.974388" elapsed="0.000566"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.979558" 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-12T00:19:17.979157" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:17.979821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.979678" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.979659" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.980312" 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-12T00:19:17.980016" elapsed="0.000325"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:17.980766" level="INFO">${reference} = netconf_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-12T00:19:17.980492" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:17.981154" level="INFO">${reference} = netconf_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-12T00:19:17.980977" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.981808" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard"
reference somewhere insid...</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-12T00:19:17.981323" elapsed="0.000514"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.982341" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:17.981983" elapsed="0.000387"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.982969" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.982515" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.983473" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:17.983180" 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-12T00:19:17.978838" elapsed="0.004738"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:17.973576" elapsed="0.010066"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:17.973235" elapsed="0.010451"/>
</kw>
<doc>Check that the element was really discarded.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.957073" elapsed="0.026652">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_get_and_check_config_candidate_to_confirm_discard&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:17.986637" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:17.986375" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.987889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.987779" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.987759" 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-12T00:19:17.992515" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:17.992407" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:17.992388" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.993565" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:17.993190" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:17.994041" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:17.993756" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:17.994111" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.994264" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:17.992828" elapsed="0.001460"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.994630" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.994868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:17.994731" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:17.994713" elapsed="0.000289"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:17.994487" elapsed="0.000542"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.994340" elapsed="0.000714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:17.992048" elapsed="0.003065"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:17.987477" elapsed="0.007691"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:17.987060" elapsed="0.008152"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:17.984433" elapsed="0.010830"/>
</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-12T00:19:17.996715" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-create-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-create-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:17.996846" 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-12T00:19:17.996484" elapsed="0.000392"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:17.996923" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:17.997074" 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-12T00:19:17.996007" elapsed="0.001095"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:17.998028" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.997844" elapsed="0.000616">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.998633" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.998790" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.997533" elapsed="0.001369">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:17.999064" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.999129" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.997244" elapsed="0.001982">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:17.999278" elapsed="0.000015"/>
</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-12T00:19:17.995718" elapsed="0.003651">Cannot open session, you need to establish a connection first.</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-12T00:19:17.999515" elapsed="0.000021"/>
</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-12T00:19:17.999690" 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-12T00:19:17.999850" 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-12T00:19:18.000006" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.000069" elapsed="0.000015"/>
</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-12T00:19:17.995424" elapsed="0.004739">Cannot open session, you need to establish a connection first.</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-12T00:19:18.001369" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.001006" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.000989" elapsed="0.000465"/>
</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-12T00:19:18.001588" elapsed="0.000369"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.006530" 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-12T00:19:18.006126" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.006800" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.006650" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.006631" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.007311" 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-12T00:19:18.007014" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.007755" level="INFO">${reference} = netconf_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-12T00:19:18.007481" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.008100" level="INFO">${reference} = netconf_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-12T00:19:18.007927" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.008619" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.008265" elapsed="0.000383"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.009097" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.008791" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.009717" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.009267" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.010205" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.009911" 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-12T00:19:18.005833" elapsed="0.004475"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.000799" elapsed="0.009558"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.000438" elapsed="0.009960"/>
</kw>
<doc>Use a create request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-12T00:19:17.983926" elapsed="0.026512">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_create&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.013646" elapsed="0.000248"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.013381" 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-12T00:19:18.014916" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.014806" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.014786" 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-12T00:19:18.019514" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.019406" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.019388" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.020618" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.020213" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.021125" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.020833" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.021197" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.021352" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.019811" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.021730" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.021962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.021829" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.021812" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.021583" elapsed="0.000477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.021431" elapsed="0.000654"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.019045" elapsed="0.003093"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.014500" elapsed="0.007694"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.014091" elapsed="0.008148"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.011186" elapsed="0.011105"/>
</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-12T00:19:18.023565" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-1-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.023711" 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-12T00:19:18.023353" elapsed="0.000387"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.023791" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.023939" 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-12T00:19:18.023047" elapsed="0.000919"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.024890" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.024706" elapsed="0.000654">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.025518" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.025687" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.024398" elapsed="0.001402">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.025947" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.026011" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.024106" elapsed="0.002000">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.026159" elapsed="0.000188"/>
</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-12T00:19:18.022744" elapsed="0.003686">Cannot open session, you need to establish a connection first.</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-12T00:19:18.026579" elapsed="0.000036"/>
</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-12T00:19:18.026760" 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-12T00:19:18.026920" 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-12T00:19:18.027153" elapsed="0.000023"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.027222" elapsed="0.000015"/>
</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-12T00:19:18.022453" elapsed="0.004867">Cannot open session, you need to establish a connection first.</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-12T00:19:18.028523" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.028158" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.028140" elapsed="0.000484"/>
</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-12T00:19:18.028765" elapsed="0.000316"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.033643" 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-12T00:19:18.033227" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.033889" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.033746" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.033728" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.034382" 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-12T00:19:18.034087" elapsed="0.000322"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.034829" level="INFO">${reference} = netconf_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-12T00:19:18.034552" elapsed="0.000303"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.035213" level="INFO">${reference} = netconf_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-12T00:19:18.035031" elapsed="0.000208"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.035738" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.035379" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.036215" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.035907" elapsed="0.000336"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.036832" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.036385" elapsed="0.000497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.037315" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.037024" elapsed="0.000338"/>
</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-12T00:19:18.032936" elapsed="0.004480"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.027949" elapsed="0.009517"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.027590" elapsed="0.009918"/>
</kw>
<doc>Use a create request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.010656" elapsed="0.026893">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_third&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.040524" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.040274" 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-12T00:19:18.041812" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.041650" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.041630" elapsed="0.000253"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.046480" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.046372" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.046353" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.047536" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.047150" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.048018" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.047726" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.048090" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.048244" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.046775" elapsed="0.001494"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.048601" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.048849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.048715" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.048698" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.048471" elapsed="0.000477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.048322" elapsed="0.000650"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.046012" elapsed="0.003013"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.041352" elapsed="0.007727"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.040943" elapsed="0.008180"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.038304" elapsed="0.010871"/>
</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-12T00:19:18.050419" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-2-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-2-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.050550" 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-12T00:19:18.050207" elapsed="0.000371"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.050640" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.050790" 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-12T00:19:18.049905" elapsed="0.000915"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.051766" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.051568" elapsed="0.000632">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.052354" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.052573" elapsed="0.000023"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.051275" elapsed="0.001432">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.052856" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.052959" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.050959" elapsed="0.002100">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.053111" elapsed="0.000014"/>
</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-12T00:19:18.049618" elapsed="0.003583">Cannot open session, you need to establish a connection first.</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-12T00:19:18.053345" elapsed="0.000022"/>
</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-12T00:19:18.053505" 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-12T00:19:18.053681" 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-12T00:19:18.053842" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.053906" elapsed="0.000015"/>
</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-12T00:19:18.049332" elapsed="0.004668">Cannot open session, you need to establish a connection first.</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-12T00:19:18.055273" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.054833" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.054815" 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-12T00:19:18.055498" elapsed="0.000541"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.060655" 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-12T00:19:18.060233" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.060900" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.060758" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.060739" elapsed="0.000223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.061394" 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-12T00:19:18.061097" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.061836" level="INFO">${reference} = netconf_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-12T00:19:18.061563" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.062184" level="INFO">${reference} = netconf_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-12T00:19:18.062010" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.062708" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.062351" elapsed="0.000385"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.063207" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.062880" elapsed="0.000355"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.063837" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.063378" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.064327" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.064030" elapsed="0.000380"/>
</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-12T00:19:18.059940" elapsed="0.004527"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.054622" elapsed="0.009895"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.054267" elapsed="0.010291"/>
</kw>
<doc>Use a merge request with the third batch to create the infrastructure.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.037768" elapsed="0.026829">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fourth&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.067560" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.067312" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.068802" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.068692" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.068672" 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-12T00:19:18.073442" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.073334" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.073316" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.074487" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.074106" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.074968" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.074679" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.075093" elapsed="0.000036"/>
</return>
<msg time="2026-04-12T00:19:18.075259" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.073740" elapsed="0.001544"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.075631" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.075865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.075730" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.075713" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.075486" elapsed="0.000478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.075337" elapsed="0.000651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.072971" elapsed="0.003071"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.068390" elapsed="0.007707"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.067978" elapsed="0.008163"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.065306" elapsed="0.010886"/>
</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-12T00:19:18.077647" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-3-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-3-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.077780" 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-12T00:19:18.077417" elapsed="0.000392"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.077857" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.078009" 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-12T00:19:18.076932" elapsed="0.001137"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.079010" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.078825" elapsed="0.000635">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.079631" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.079789" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.078512" elapsed="0.001388">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.080049" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.080113" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.078217" elapsed="0.001992">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.080262" elapsed="0.000015"/>
</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-12T00:19:18.076639" elapsed="0.003713">Cannot open session, you need to establish a connection first.</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-12T00:19:18.080497" elapsed="0.000022"/>
</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-12T00:19:18.080672" 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-12T00:19:18.080833" 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-12T00:19:18.080989" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.081053" elapsed="0.000015"/>
</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-12T00:19:18.076351" elapsed="0.004797">Cannot open session, you need to establish a connection first.</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-12T00:19:18.082346" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.081981" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.081963" elapsed="0.000467"/>
</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-12T00:19:18.082565" elapsed="0.000329"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.087478" 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-12T00:19:18.087075" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.087736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.087578" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.087560" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.088226" 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-12T00:19:18.087933" elapsed="0.000319"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.088683" level="INFO">${reference} = netconf_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-12T00:19:18.088394" elapsed="0.000316"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.089032" level="INFO">${reference} = netconf_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-12T00:19:18.088860" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.089536" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.089195" elapsed="0.000368"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.090042" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.089721" elapsed="0.000349"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.090712" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.090255" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.091242" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.090907" elapsed="0.000384"/>
</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-12T00:19:18.086773" elapsed="0.004574"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.081772" elapsed="0.009624"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.081416" elapsed="0.010021"/>
</kw>
<doc>Add a "name4" subelement to the element and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.064817" elapsed="0.026659">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_config_multiple_batch_merge_fifth&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.094515" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.094265" 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-12T00:19:18.095774" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.095663" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.095643" elapsed="0.000246"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.100316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.100209" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.100190" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.101352" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.100974" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.101832" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.101526" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.101903" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.102058" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.100594" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.102417" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.102664" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.102515" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.102498" elapsed="0.000244"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.102287" elapsed="0.000479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.102135" elapsed="0.000654"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.099848" elapsed="0.002994"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.095363" elapsed="0.007533"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.094938" elapsed="0.008002"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.092118" elapsed="0.010913"/>
</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-12T00:19:18.104309" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.104438" 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-12T00:19:18.104099" elapsed="0.000367"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.104512" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.104678" 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-12T00:19:18.103796" elapsed="0.000909"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.105628" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.105432" elapsed="0.000917">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.106508" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.106681" elapsed="0.000022"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.105139" elapsed="0.001656">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.106942" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.107005" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.104851" elapsed="0.002275">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.107180" elapsed="0.000015"/>
</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-12T00:19:18.103485" elapsed="0.003785">Cannot open session, you need to establish a connection first.</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-12T00:19:18.107415" elapsed="0.000022"/>
</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-12T00:19:18.107575" elapsed="0.000020"/>
</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-12T00:19:18.107753" elapsed="0.000024"/>
</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-12T00:19:18.107915" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.107977" elapsed="0.000015"/>
</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-12T00:19:18.103207" elapsed="0.004864">Cannot open session, you need to establish a connection first.</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-12T00:19:18.109265" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.108902" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.108884" elapsed="0.000465"/>
</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-12T00:19:18.109483" elapsed="0.000330"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.114331" 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-12T00:19:18.113934" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.114575" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.114433" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.114414" elapsed="0.000240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.115107" 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-12T00:19:18.114788" elapsed="0.000346"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.115533" level="INFO">${reference} = netconf_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-12T00:19:18.115277" elapsed="0.000281"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.115933" level="INFO">${reference} = netconf_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-12T00:19:18.115756" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.116441" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.116100" elapsed="0.000367"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.116939" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.116624" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.117544" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.117109" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.118047" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.117752" 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-12T00:19:18.113645" elapsed="0.004504"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.108694" elapsed="0.009504"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.108337" elapsed="0.009902"/>
</kw>
<doc>Commit the changes and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.091694" elapsed="0.026584">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.121280" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.121026" 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-12T00:19:18.122509" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.122398" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.122378" 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-12T00:19:18.127405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.127296" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.127278" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.128445" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.128067" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.128924" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.128637" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.128996" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.129149" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.127702" elapsed="0.001472"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.129503" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.129751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.129600" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.129584" elapsed="0.000276"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.129375" elapsed="0.000513"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.129226" elapsed="0.000687"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.126906" elapsed="0.003061"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.122111" elapsed="0.007911"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.121696" elapsed="0.008371"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.119002" elapsed="0.011117"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:18.131101" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.131241" 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-12T00:19:18.130861" elapsed="0.000408"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.131316" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.131464" 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-12T00:19:18.130535" elapsed="0.000957"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.132419" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.132235" elapsed="0.000645">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.133035" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.133188" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.131942" elapsed="0.001356">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.133444" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.133508" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.131649" elapsed="0.001953">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.133670" elapsed="0.000016"/>
</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-12T00:19:18.130266" elapsed="0.003496">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Multiple_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:18.133895" 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-12T00:19:18.135105" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.134733" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.134714" elapsed="0.000479"/>
</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-12T00:19:18.135327" elapsed="0.000324"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.141784" 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-12T00:19:18.141361" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.142029" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.141887" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.141869" elapsed="0.000223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.142524" 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-12T00:19:18.142225" elapsed="0.000326"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.142970" level="INFO">${reference} = netconf_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-12T00:19:18.142710" elapsed="0.000288"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.143433" level="INFO">${reference} = netconf_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-12T00:19:18.143254" elapsed="0.000206"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.143961" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.143599" elapsed="0.000389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.144436" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.144129" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.145054" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.144618" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.145537" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.145245" 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-12T00:19:18.141067" elapsed="0.004590"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.134508" elapsed="0.011199"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.134171" elapsed="0.011579"/>
</kw>
<doc>Check that the 3 subelements are now present in the running configuration.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.118479" elapsed="0.027315">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.148833" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.148562" 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-12T00:19:18.150051" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.149941" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.149921" 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-12T00:19:18.154526" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.154420" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.154401" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.155588" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.155210" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.156066" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.155781" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.156199" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:18.156357" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.154824" elapsed="0.001558"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.156732" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.156998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.156830" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.156813" elapsed="0.000263"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.156583" elapsed="0.000518"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.156434" elapsed="0.000691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.154061" elapsed="0.003118"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.149655" elapsed="0.007578"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.149232" elapsed="0.008045"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.146516" elapsed="0.010812"/>
</kw>
<kw name="Abort_ODL_Netconf_Connection">
<if>
<branch type="IF" condition="${ssh_netconf_pid} == -1">
<return>
<status status="PASS" start="2026-04-12T00:19:18.157842" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-12T00:19:18.157728" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.157710" elapsed="0.000213"/>
</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-12T00:19:18.158059" 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-12T00:19:18.158227" 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-12T00:19:18.158382" 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-12T00:19:18.158529" elapsed="0.000020"/>
</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-12T00:19:18.158696" 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-12T00:19:18.158843" 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-12T00:19:18.158992" elapsed="0.000019"/>
</kw>
<doc>Correctly close the Netconf connection and make sure it is really dead.</doc>
<status status="PASS" start="2026-04-12T00:19:18.157526" elapsed="0.001549"/>
</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-12T00:19:18.160437" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.160071" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.160052" elapsed="0.000472"/>
</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-12T00:19:18.160675" elapsed="0.000316"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.165539" 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-12T00:19:18.165141" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="PASS" start="2026-04-12T00:19:18.165802" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-12T00:19:18.165657" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.165638" elapsed="0.000246"/>
</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-12T00:19:18.166021" elapsed="0.000022"/>
</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-12T00:19:18.166181" elapsed="0.000020"/>
</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-12T00:19:18.166342" 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-12T00:19:18.166497" 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-12T00:19:18.166667" elapsed="0.000022"/>
</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-12T00:19:18.166825" 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-12T00:19:18.166976" 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-12T00:19:18.164849" elapsed="0.002203"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.159856" elapsed="0.007297"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.159313" elapsed="0.007883"/>
</kw>
<doc>Simulate session failure by disconnecting without terminating the session.</doc>
<status status="PASS" start="2026-04-12T00:19:18.145996" elapsed="0.021239"/>
</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-12T00:19:18.170155" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.169907" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.171404" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.171296" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.171277" 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-12T00:19:18.175939" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.175829" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.175811" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.177036" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.176653" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.177499" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.177212" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.177570" elapsed="0.000028"/>
</return>
<msg time="2026-04-12T00:19:18.177741" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.176271" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.178096" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.178327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.178193" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.178176" elapsed="0.000226"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.177967" elapsed="0.000459"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.177818" elapsed="0.000631"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.175448" elapsed="0.003053"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.170986" elapsed="0.007570"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.170555" elapsed="0.008046"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.167951" elapsed="0.010719"/>
</kw>
<kw name="Open_ODL_Netconf_Connection">
<kw name="Reopen_ODL_Netconf_Connection">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.187196" level="FAIL">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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="FAIL" start="2026-04-12T00:19:18.179685" elapsed="0.007550">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${hello}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.187391" elapsed="0.000023"/>
</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-12T00:19:18.187551" elapsed="0.000021"/>
</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-12T00:19:18.187727" 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-12T00:19:18.187893" 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-12T00:19:18.188045" elapsed="0.000020"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.188105" elapsed="0.000016"/>
</return>
<var>${hello}</var>
<doc>Reopen a closed netconf connection.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.179406" elapsed="0.008803">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:18.188352" elapsed="0.000022"/>
</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-12T00:19:18.188541" elapsed="0.000022"/>
</kw>
<return>
<value>${hello}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.188617" elapsed="0.000017"/>
</return>
<doc>Open a prepared netconf connecion.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.178819" elapsed="0.009898">Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:18.189919" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.189537" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.189519" elapsed="0.000546"/>
</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-12T00:19:18.190203" elapsed="0.000316"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.195218" 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-12T00:19:18.194694" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.195464" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.195321" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.195302" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.195979" 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-12T00:19:18.195677" elapsed="0.000329"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.196406" level="INFO">${reference} = netconf_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-12T00:19:18.196151" elapsed="0.000281"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.196771" level="INFO">${reference} = netconf_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-12T00:19:18.196579" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.197280" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure"
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-12T00:19:18.196939" elapsed="0.000368"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.197771" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.197448" elapsed="0.000351"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.198374" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"

Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:18.197939" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.198878" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.198566" elapsed="0.000360"/>
</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-12T00:19:18.194391" elapsed="0.004590"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.189324" elapsed="0.009706"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.188985" elapsed="0.010086"/>
</kw>
<doc>Reconnect to ODL Netconf and fail if that is not possible.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.167422" elapsed="0.031702">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_reconnect_to_odl_netconf_after_session_failure&amp;order=bug_status"

Variable '${ssh_password}' not found. Did you mean:
    ${PASSWORD}</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-12T00:19:18.202302" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.202053" 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-12T00:19:18.203552" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.203443" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.203424" 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-12T00:19:18.208109" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.208002" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.207984" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.209149" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.208771" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.209623" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.209323" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.209696" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.209850" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.208385" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.210204" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.210432" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.210300" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.210283" elapsed="0.000224"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.210075" elapsed="0.000455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.209926" elapsed="0.000627"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.207643" elapsed="0.002977"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.203158" elapsed="0.007520"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.202720" elapsed="0.008001"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.199933" elapsed="0.010840"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:18.211751" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.211885" 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-12T00:19:18.211521" elapsed="0.000392"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.211960" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.212108" 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-12T00:19:18.211215" elapsed="0.000920"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.213066" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.212879" elapsed="0.000642">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.213692" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.213849" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.212564" elapsed="0.001395">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.214105" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.214204" elapsed="0.000017"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.212274" elapsed="0.002029">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.214354" elapsed="0.000015"/>
</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-12T00:19:18.210919" elapsed="0.003525">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Check_Multiple_Batch_Data_Present">
<arg>${reply}</arg>
<status status="NOT RUN" start="2026-04-12T00:19:18.214574" 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-12T00:19:18.216072" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.215641" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.215621" elapsed="0.000538"/>
</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-12T00:19:18.216297" elapsed="0.000335"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.221203" 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-12T00:19:18.220802" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.221447" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.221306" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.221288" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.221956" 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-12T00:19:18.221657" elapsed="0.000326"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.222395" level="INFO">${reference} = netconf_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-12T00:19:18.222132" elapsed="0.000297"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.222786" level="INFO">${reference} = netconf_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-12T00:19:18.222584" elapsed="0.000230"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.223323" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure"
reference somew...</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-12T00:19:18.222960" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.223828" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_stat...</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-12T00:19:18.223492" elapsed="0.000364"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.224433" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.224004" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.224931" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.224637" 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-12T00:19:18.220493" elapsed="0.004541"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.215416" elapsed="0.009667"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.214870" elapsed="0.010255"/>
</kw>
<doc>Check that the 3 subelements are now present in the running configuration.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.199333" elapsed="0.025832">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_multiple_batch_data_in_running_config_after_session_failure&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.228150" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.227902" 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-12T00:19:18.229363" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.229253" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.229234" 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-12T00:19:18.234157" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.234049" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.234030" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.235221" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.234815" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.235703" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.235396" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.235775" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.235928" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.234437" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.236283" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.236510" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.236379" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.236362" elapsed="0.000222"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.236153" elapsed="0.000470"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.236004" elapsed="0.000644"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.233681" elapsed="0.003024"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.228971" elapsed="0.007795"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.228547" elapsed="0.008264"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.225933" elapsed="0.010930"/>
</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-12T00:19:18.238114" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.238250" 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-12T00:19:18.237903" elapsed="0.000375"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.238325" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.238473" 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-12T00:19:18.237582" elapsed="0.000918"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.239435" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.239254" elapsed="0.000636">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.240054" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.240204" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.238946" elapsed="0.001369">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.240505" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.240571" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.238656" elapsed="0.002029">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.240738" elapsed="0.000015"/>
</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-12T00:19:18.237297" elapsed="0.003531">Cannot open session, you need to establish a connection first.</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-12T00:19:18.240973" elapsed="0.000021"/>
</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-12T00:19:18.241131" elapsed="0.000020"/>
</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-12T00:19:18.241287" 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-12T00:19:18.241446" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.241509" elapsed="0.000015"/>
</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-12T00:19:18.237026" elapsed="0.004591">Cannot open session, you need to establish a connection first.</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-12T00:19:18.242832" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.242450" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.242432" elapsed="0.000486"/>
</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-12T00:19:18.243052" elapsed="0.000564"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.248292" 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-12T00:19:18.247891" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.248537" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.248394" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.248376" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.249056" 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-12T00:19:18.248759" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.249481" level="INFO">${reference} = netconf_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-12T00:19:18.249226" elapsed="0.000281"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.249851" level="INFO">${reference} = netconf_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-12T00:19:18.249669" elapsed="0.000208"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.250363" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.250020" elapsed="0.000370"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.250923" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.250532" elapsed="0.000420"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.251558" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.251094" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.252061" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.251768" elapsed="0.000381"/>
</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-12T00:19:18.247582" elapsed="0.004624"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.242234" elapsed="0.010021"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.241891" elapsed="0.010405"/>
</kw>
<doc>Add another subelement named "test" to the element and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.225435" elapsed="0.026901">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_edit_multiple_merge_data&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.255244" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.254979" 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-12T00:19:18.256465" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.256356" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.256336" 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-12T00:19:18.260976" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.260869" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.260851" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.262009" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.261629" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.262469" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.262185" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.262540" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.262711" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.261253" elapsed="0.001484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.263067" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.263315" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.263178" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.263161" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.262937" elapsed="0.000478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.262789" elapsed="0.000650"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.260499" elapsed="0.002993"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.256074" elapsed="0.007472"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.255659" elapsed="0.007930"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.253048" elapsed="0.010611"/>
</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-12T00:19:18.265084" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.265213" 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-12T00:19:18.264871" elapsed="0.000369"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.265288" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.265442" 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-12T00:19:18.264374" elapsed="0.001096"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.266496" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.266314" elapsed="0.000638">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.267109" elapsed="0.000052"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.267297" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.265954" elapsed="0.001454">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.267554" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.267633" elapsed="0.000018"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.265662" elapsed="0.002071">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.267786" elapsed="0.000015"/>
</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-12T00:19:18.264091" elapsed="0.003786">Cannot open session, you need to establish a connection first.</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-12T00:19:18.268024" elapsed="0.000022"/>
</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-12T00:19:18.268186" elapsed="0.000020"/>
</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-12T00:19:18.268343" 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-12T00:19:18.268501" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.268564" 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-12T00:19:18.263819" elapsed="0.004862">Cannot open session, you need to establish a connection first.</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-12T00:19:18.270018" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.269494" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.269476" elapsed="0.000633"/>
</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-12T00:19:18.270247" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.275146" 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-12T00:19:18.274729" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.275426" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.275249" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.275230" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.275939" 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-12T00:19:18.275641" elapsed="0.000325"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.276359" level="INFO">${reference} = netconf_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-12T00:19:18.276108" elapsed="0.000277"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.276718" level="INFO">${reference} = netconf_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-12T00:19:18.276529" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.277223" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.276883" elapsed="0.000367"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.277714" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.277391" elapsed="0.000352"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.278365" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.277927" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.278871" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.278559" elapsed="0.000360"/>
</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-12T00:19:18.274425" elapsed="0.004550"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.269287" elapsed="0.009738"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.268950" elapsed="0.010116"/>
</kw>
<doc>Commit the addition of the "test" subelement and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.252538" elapsed="0.026568">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.282362" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.282110" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.283619" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.283495" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.283476" 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-12T00:19:18.288088" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.287982" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.287963" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.289118" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.288741" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.289576" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.289292" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.289664" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.289820" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.288364" elapsed="0.001480"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.290180" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.290414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.290276" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.290259" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.290050" elapsed="0.000462"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.289897" elapsed="0.000639"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.287621" elapsed="0.002968"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.283208" elapsed="0.007452"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.282784" elapsed="0.007921"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.279866" elapsed="0.010893"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:18.291766" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-check-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-edit-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.291895" 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-12T00:19:18.291538" elapsed="0.000384"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.291968" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.292115" 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-12T00:19:18.291231" elapsed="0.000912"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.293061" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.292882" elapsed="0.000616">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.293668" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.293824" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.292572" elapsed="0.001362">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.294079" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.294144" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.292285" elapsed="0.001953">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.294290" elapsed="0.000015"/>
</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-12T00:19:18.290943" elapsed="0.003437">Cannot open session, you need to establish a connection first.</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-12T00:19:18.294529" elapsed="0.000022"/>
</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-12T00:19:18.294701" elapsed="0.000021"/>
</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-12T00:19:18.294855" 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-12T00:19:18.295007" 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-12T00:19:18.296446" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.296083" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.296064" elapsed="0.000469"/>
</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-12T00:19:18.296685" elapsed="0.000318"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.301658" 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-12T00:19:18.301235" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.301907" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.301763" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.301744" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.302402" 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-12T00:19:18.302105" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.302845" level="INFO">${reference} = netconf_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-12T00:19:18.302572" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.303220" level="INFO">${reference} = netconf_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-12T00:19:18.303017" elapsed="0.000230"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.303795" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.303426" elapsed="0.000396"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.304278" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.303966" elapsed="0.000340"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.304900" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.304450" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.305388" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.305094" 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-12T00:19:18.300942" elapsed="0.004549"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.295873" elapsed="0.009668"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.295322" elapsed="0.010260"/>
</kw>
<doc>Check that the "test" subelement exists and has correct value for "port" subelement.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.279333" elapsed="0.026306">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_edit&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.308615" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.308356" 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-12T00:19:18.309835" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.309721" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.309701" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.314446" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.314340" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.314320" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.315495" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.315100" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.315981" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.315689" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.316052" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.316212" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.314737" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.316573" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.316821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.316687" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.316669" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.316444" elapsed="0.000476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.316288" elapsed="0.000690"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.313979" elapsed="0.003056"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.309422" elapsed="0.007668"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.309017" elapsed="0.008117"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.306353" elapsed="0.010831"/>
</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-12T00:19:18.318565" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.318717" 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-12T00:19:18.318349" elapsed="0.000399"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.318798" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.318968" 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-12T00:19:18.317921" elapsed="0.001085"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.319976" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.319795" elapsed="0.000614">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.320565" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.320739" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.319484" elapsed="0.001366">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.320996" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.321059" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.319183" elapsed="0.001971">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.321206" elapsed="0.000015"/>
</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-12T00:19:18.317631" elapsed="0.003665">Cannot open session, you need to establish a connection first.</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-12T00:19:18.321441" elapsed="0.000022"/>
</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-12T00:19:18.321600" elapsed="0.000036"/>
</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-12T00:19:18.321776" 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-12T00:19:18.321938" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.322003" elapsed="0.000014"/>
</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-12T00:19:18.317343" elapsed="0.004754">Cannot open session, you need to establish a connection first.</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-12T00:19:18.323513" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.322936" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.322918" elapsed="0.000681"/>
</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-12T00:19:18.323754" elapsed="0.000318"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.328683" 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-12T00:19:18.328265" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.328970" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.328822" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.328803" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.329466" 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-12T00:19:18.329169" elapsed="0.000323"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.329911" level="INFO">${reference} = netconf_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-12T00:19:18.329653" elapsed="0.000284"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.330256" level="INFO">${reference} = netconf_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-12T00:19:18.330084" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.330786" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.330420" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.331287" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.330955" elapsed="0.000360"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.331907" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.331456" elapsed="0.000501"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.332391" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.332098" elapsed="0.000341"/>
</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-12T00:19:18.327967" elapsed="0.004526"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.322727" elapsed="0.009816"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.322362" elapsed="0.010222"/>
</kw>
<doc>Update the value of the "port" subelement of the "test" subelement and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.305840" elapsed="0.026799">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_update_multiple_modules_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.335592" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.335336" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.336832" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.336722" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.336702" 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-12T00:19:18.341299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.341193" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.341174" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.342426" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.341981" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.342908" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.342601" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.343012" elapsed="0.000032"/>
</return>
<msg time="2026-04-12T00:19:18.343202" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.341582" elapsed="0.001648"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.343563" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.343827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.343686" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.343667" elapsed="0.000237"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.343434" elapsed="0.000494"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.343284" elapsed="0.000668"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.340837" elapsed="0.003169"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.336422" elapsed="0.007638"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.336010" elapsed="0.008095"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.333292" elapsed="0.010864"/>
</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-12T00:19:18.346819" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.346951" 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-12T00:19:18.346584" elapsed="0.000394"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.347025" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.347189" 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-12T00:19:18.346267" elapsed="0.000949"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.348148" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.347965" elapsed="0.000623">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.348760" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.348914" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.347669" elapsed="0.001357">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.349171" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.349235" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.347363" elapsed="0.001967">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.349381" elapsed="0.000015"/>
</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-12T00:19:18.344590" elapsed="0.004881">Cannot open session, you need to establish a connection first.</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-12T00:19:18.349632" elapsed="0.000022"/>
</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-12T00:19:18.349795" 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-12T00:19:18.349953" 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-12T00:19:18.350107" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.350169" elapsed="0.000015"/>
</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-12T00:19:18.344315" elapsed="0.005949">Cannot open session, you need to establish a connection first.</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-12T00:19:18.351528" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.351139" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.351121" 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-12T00:19:18.351766" elapsed="0.000312"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.356637" 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-12T00:19:18.356223" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.356882" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.356739" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.356721" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.357380" 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-12T00:19:18.357079" elapsed="0.000327"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.357818" level="INFO">${reference} = netconf_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-12T00:19:18.357548" elapsed="0.000296"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.358162" level="INFO">${reference} = netconf_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-12T00:19:18.357990" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.358683" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.358326" elapsed="0.000384"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.359158" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.358851" elapsed="0.000366"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.359815" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.359364" elapsed="0.000502"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.360298" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.360005" elapsed="0.000341"/>
</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-12T00:19:18.355933" elapsed="0.004467"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.350929" elapsed="0.009520"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.350569" elapsed="0.009921"/>
</kw>
<doc>Commit the update and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.332842" elapsed="0.027689">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_update&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.363643" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.363381" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.364866" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.364756" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.364736" elapsed="0.000235"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.369441" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.369333" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.369315" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.370476" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.370100" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.370954" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.370666" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.371024" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.371193" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.369737" elapsed="0.001481"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.371555" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.371802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.371669" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.371651" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.371427" elapsed="0.000474"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.371276" elapsed="0.000649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.368973" elapsed="0.003004"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.364453" elapsed="0.007579"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.364045" elapsed="0.008032"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.361218" elapsed="0.010910"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:18.373078" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-check-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-update-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.373206" 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-12T00:19:18.372866" elapsed="0.000368"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.373280" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.373429" 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-12T00:19:18.372541" elapsed="0.000916"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.374374" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.374194" elapsed="0.000629">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.374978" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.375131" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.373903" elapsed="0.001360">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.375410" elapsed="0.000057"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.375514" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.373597" elapsed="0.002027">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.375677" elapsed="0.000015"/>
</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-12T00:19:18.372274" elapsed="0.003492">Cannot open session, you need to establish a connection first.</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-12T00:19:18.375954" elapsed="0.000022"/>
</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-12T00:19:18.376112" elapsed="0.000020"/>
</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-12T00:19:18.376264" elapsed="0.000020"/>
</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-12T00:19:18.376415" 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-12T00:19:18.376568" elapsed="0.000020"/>
</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-12T00:19:18.376765" 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-12T00:19:18.376916" 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-12T00:19:18.378327" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.377960" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.377942" elapsed="0.000471"/>
</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-12T00:19:18.378550" elapsed="0.000338"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.383566" 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-12T00:19:18.383118" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.383829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.383685" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.383666" elapsed="0.000226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.384428" 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-12T00:19:18.384125" elapsed="0.000330"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.384884" level="INFO">${reference} = netconf_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-12T00:19:18.384623" elapsed="0.000287"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.385229" level="INFO">${reference} = netconf_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-12T00:19:18.385056" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.385799" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.385394" elapsed="0.000432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.386276" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.385969" elapsed="0.000335"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.386892" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.386445" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.387398" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.387082" 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-12T00:19:18.382827" elapsed="0.004674"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.377749" elapsed="0.009839"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.377200" elapsed="0.010448"/>
</kw>
<doc>Check that the value of the "port" was really updated.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.360746" elapsed="0.026943">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_update&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.390675" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.390412" 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-12T00:19:18.391937" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.391828" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.391809" 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-12T00:19:18.396585" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.396477" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.396459" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.397634" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.397240" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.398103" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.397817" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.398175" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.398328" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.396879" elapsed="0.001474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.398705" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.398937" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.398805" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.398788" elapsed="0.000224"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.398553" elapsed="0.000482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.398405" elapsed="0.000654"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.396117" elapsed="0.002995"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.391525" elapsed="0.007641"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.391076" elapsed="0.008159"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.388404" elapsed="0.010886"/>
</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-12T00:19:18.400547" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.400697" 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-12T00:19:18.400336" elapsed="0.000391"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.400778" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.400926" 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-12T00:19:18.400035" elapsed="0.000918"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.401873" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.401689" elapsed="0.000616">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.402496" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.402669" elapsed="0.000022"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.401380" elapsed="0.001404">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.402932" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.402996" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.401093" elapsed="0.002000">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.403144" 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-12T00:19:18.399741" elapsed="0.003509">Cannot open session, you need to establish a connection first.</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-12T00:19:18.403404" elapsed="0.000022"/>
</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-12T00:19:18.403565" elapsed="0.000020"/>
</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-12T00:19:18.403740" 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-12T00:19:18.403897" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.403960" elapsed="0.000015"/>
</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-12T00:19:18.399450" elapsed="0.004605">Cannot open session, you need to establish a connection first.</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-12T00:19:18.405451" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.404887" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.404869" elapsed="0.000670"/>
</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-12T00:19:18.405693" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.410588" 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-12T00:19:18.410190" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.410851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.410708" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.410689" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.411363" 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-12T00:19:18.411047" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.411808" level="INFO">${reference} = netconf_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-12T00:19:18.411535" elapsed="0.000299"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.412153" level="INFO">${reference} = netconf_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-12T00:19:18.411980" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.412676" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.412317" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.413211" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.412896" elapsed="0.000344"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.413883" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.413381" elapsed="0.000592"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.414415" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.414119" 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-12T00:19:18.409899" elapsed="0.004620"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.404678" elapsed="0.009892"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.404321" elapsed="0.010307"/>
</kw>
<doc>Replace the content of the "test" with another completely different and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.387890" elapsed="0.026780">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_replace_multiple_modules_merge&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.417561" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.417312" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.418841" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.418731" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.418711" 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-12T00:19:18.423353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.423242" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.423222" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.424530" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.424009" elapsed="0.000549"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.425019" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.424728" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.425091" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.425245" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.423644" elapsed="0.001626"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.425647" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.425881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.425749" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.425732" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.425472" elapsed="0.000508"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.425323" elapsed="0.000681"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.422857" elapsed="0.003201"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.418385" elapsed="0.007727"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.417977" elapsed="0.008180"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.415361" elapsed="0.010847"/>
</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-12T00:19:18.427682" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.427812" 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-12T00:19:18.427453" elapsed="0.000415"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.427919" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.428073" 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-12T00:19:18.426954" elapsed="0.001146"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.429026" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.428844" elapsed="0.000617">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.429634" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.429791" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.428533" elapsed="0.001370">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.430051" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.430114" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.428244" elapsed="0.001966">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.430263" elapsed="0.000015"/>
</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-12T00:19:18.426660" elapsed="0.003693">Cannot open session, you need to establish a connection first.</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-12T00:19:18.430499" elapsed="0.000022"/>
</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-12T00:19:18.430677" 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-12T00:19:18.430838" 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-12T00:19:18.430995" elapsed="0.000019"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.431058" elapsed="0.000015"/>
</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-12T00:19:18.426368" elapsed="0.004785">Cannot open session, you need to establish a connection first.</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-12T00:19:18.432392" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.432029" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.432010" elapsed="0.000467"/>
</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-12T00:19:18.432627" elapsed="0.000315"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.437504" 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-12T00:19:18.437103" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.437765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.437619" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.437587" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.438255" 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-12T00:19:18.437961" elapsed="0.000321"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.438695" level="INFO">${reference} = netconf_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-12T00:19:18.438425" elapsed="0.000296"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.439040" level="INFO">${reference} = netconf_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-12T00:19:18.438868" elapsed="0.000197"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.439580" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.439232" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.440124" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.439809" elapsed="0.000344"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.440750" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.440297" elapsed="0.000504"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.441239" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.440944" 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-12T00:19:18.436813" elapsed="0.004529"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.431821" elapsed="0.009570"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.431457" elapsed="0.009976"/>
</kw>
<doc>Commit the replace and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.414872" elapsed="0.026602">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_multiple_modules_merge_replace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.444631" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.444365" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.445853" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.445744" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.445725" 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-12T00:19:18.450410" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.450303" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.450284" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.451463" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.451068" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.451947" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.451655" elapsed="0.000319"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.452019" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.452174" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.450703" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.452530" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.452779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.452644" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.452625" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.452401" elapsed="0.000477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.452251" elapsed="0.000651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.449939" elapsed="0.003015"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.445444" elapsed="0.007600"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.445035" elapsed="0.008056"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.442187" elapsed="0.010956"/>
</kw>
<kw name="Load_And_Send_Message">
<kw name="Get_Data">
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-12T00:19:18.454095" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-check-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-replace-check-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.454222" 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-12T00:19:18.453883" elapsed="0.000368"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.454297" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.454445" 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-12T00:19:18.453559" elapsed="0.000914"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.455430" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.455241" elapsed="0.000640">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.456038" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.456191" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.454921" elapsed="0.001380">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.456446" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.456511" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.454628" elapsed="0.001990">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.456673" elapsed="0.000015"/>
</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-12T00:19:18.453289" elapsed="0.003473">Cannot open session, you need to establish a connection first.</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-12T00:19:18.456908" elapsed="0.000022"/>
</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-12T00:19:18.457063" elapsed="0.000020"/>
</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-12T00:19:18.457214" elapsed="0.000020"/>
</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-12T00:19:18.457365" elapsed="0.000020"/>
</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-12T00:19:18.457516" elapsed="0.000020"/>
</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-12T00:19:18.457684" elapsed="0.000021"/>
</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-12T00:19:18.457839" elapsed="0.000020"/>
</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-12T00:19:18.457991" elapsed="0.000020"/>
</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-12T00:19:18.458141" elapsed="0.000020"/>
</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-12T00:19:18.458293" elapsed="0.000019"/>
</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-12T00:19:18.458443" elapsed="0.000019"/>
</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-12T00:19:18.458593" elapsed="0.000034"/>
</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-12T00:19:18.458762" elapsed="0.000020"/>
</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-12T00:19:18.458914" elapsed="0.000292"/>
</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-12T00:19:18.459374" elapsed="0.000022"/>
</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-12T00:19:18.459530" elapsed="0.000021"/>
</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-12T00:19:18.459702" elapsed="0.000021"/>
</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-12T00:19:18.459855" elapsed="0.000020"/>
</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-12T00:19:18.460006" elapsed="0.000020"/>
</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-12T00:19:18.460157" elapsed="0.000020"/>
</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-12T00:19:18.460309" elapsed="0.000020"/>
</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-12T00:19:18.460460" elapsed="0.000020"/>
</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-12T00:19:18.460624" elapsed="0.000021"/>
</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-12T00:19:18.460779" elapsed="0.000019"/>
</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-12T00:19:18.460929" elapsed="0.000020"/>
</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-12T00:19:18.461079" elapsed="0.000020"/>
</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-12T00:19:18.461230" 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-12T00:19:18.461381" 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-12T00:19:18.461532" elapsed="0.000020"/>
</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-12T00:19:18.461700" 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-12T00:19:18.461853" 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-12T00:19:18.463136" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.462770" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.462751" elapsed="0.000493"/>
</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-12T00:19:18.463387" elapsed="0.000336"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.468291" 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-12T00:19:18.467888" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.468536" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.468393" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.468375" elapsed="0.000224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.469051" 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-12T00:19:18.468752" elapsed="0.000326"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.469480" level="INFO">${reference} = netconf_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-12T00:19:18.469222" elapsed="0.000285"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.469846" level="INFO">${reference} = netconf_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-12T00:19:18.469670" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.470355" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.470013" elapsed="0.000404"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.470892" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.470564" elapsed="0.000357"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.471528" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.471062" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.472034" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.471737" elapsed="0.000345"/>
</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-12T00:19:18.467583" elapsed="0.004555"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.462484" elapsed="0.009703"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.462138" elapsed="0.010091"/>
</kw>
<doc>Check that the new content is there and the old content is gone.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.441694" elapsed="0.030575">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_check_multiple_modules_merge_replace&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.475216" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.474970" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.476489" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.476376" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.476357" 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-12T00:19:18.481217" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.481110" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.481091" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.482256" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.481877" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.482735" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.482432" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.482806" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.482962" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.481496" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.483332" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.483563" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.483430" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.483414" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.483189" elapsed="0.000490"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.483039" elapsed="0.000665"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.480745" elapsed="0.003013"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.476090" elapsed="0.007760"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.475675" elapsed="0.008221"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.472954" elapsed="0.010995"/>
</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-12T00:19:18.485211" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.485405" 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-12T00:19:18.484997" elapsed="0.000438"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.485482" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.485651" 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-12T00:19:18.484692" elapsed="0.000989"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.486595" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.486411" elapsed="0.000643">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.487211" elapsed="0.000051"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.487399" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.486118" elapsed="0.001393">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.487673" elapsed="0.000023"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.487739" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.485828" elapsed="0.002008">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.487888" elapsed="0.000015"/>
</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-12T00:19:18.484388" elapsed="0.003591">Cannot open session, you need to establish a connection first.</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-12T00:19:18.488124" elapsed="0.000022"/>
</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-12T00:19:18.488284" elapsed="0.000020"/>
</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-12T00:19:18.488442" 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-12T00:19:18.488597" elapsed="0.000034"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.488677" elapsed="0.000014"/>
</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-12T00:19:18.484111" elapsed="0.004662">Cannot open session, you need to establish a connection first.</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-12T00:19:18.489977" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.489595" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.489577" elapsed="0.000484"/>
</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-12T00:19:18.490197" elapsed="0.000540"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.495361" 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-12T00:19:18.494927" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.495625" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.495465" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.495446" elapsed="0.000282"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.496178" 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-12T00:19:18.495874" elapsed="0.000331"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.496625" level="INFO">${reference} = netconf_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-12T00:19:18.496352" elapsed="0.000301"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.496980" level="INFO">${reference} = netconf_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-12T00:19:18.496804" elapsed="0.000202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.497494" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.497148" elapsed="0.000373"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.498001" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.497686" elapsed="0.000344"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.498631" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.498172" elapsed="0.000510"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.499126" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.498831" 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-12T00:19:18.494633" elapsed="0.004596"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.489388" elapsed="0.009907"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.489046" elapsed="0.010291"/>
</kw>
<doc>Remove the testing elements and all their subelements and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.472469" elapsed="0.026907">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_remove_test_data&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.502224" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.501976" 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-12T00:19:18.503470" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.503361" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.503341" 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-12T00:19:18.507966" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.507860" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.507842" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.508994" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.508599" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.509471" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.509168" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.509542" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.509768" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.508239" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.510166" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.510399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.510265" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.510247" elapsed="0.000229"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.510035" elapsed="0.000465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.509881" elapsed="0.000643"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.507485" elapsed="0.003093"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.503048" elapsed="0.007614"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.502637" elapsed="0.008070"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.500025" elapsed="0.010734"/>
</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-12T00:19:18.512231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/merge-multiple-remove-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.512361" 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-12T00:19:18.512013" elapsed="0.000375"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.512436" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.512584" 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-12T00:19:18.511509" elapsed="0.001117"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.513538" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.513357" elapsed="0.000635">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.514149" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.514304" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.513062" elapsed="0.001354">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.514562" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.514643" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.512770" elapsed="0.001971">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.514793" 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-12T00:19:18.511196" elapsed="0.003689">Cannot open session, you need to establish a connection first.</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-12T00:19:18.515054" elapsed="0.000022"/>
</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-12T00:19:18.515218" elapsed="0.000020"/>
</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-12T00:19:18.515390" 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-12T00:19:18.515547" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.515626" elapsed="0.000016"/>
</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-12T00:19:18.510919" elapsed="0.004805">Cannot open session, you need to establish a connection first.</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-12T00:19:18.516911" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.516535" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.516517" 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-12T00:19:18.517173" elapsed="0.000321"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.522219" 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-12T00:19:18.521816" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.522471" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.522322" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.522304" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.522981" 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-12T00:19:18.522684" elapsed="0.000324"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.523430" level="INFO">${reference} = netconf_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-12T00:19:18.523152" elapsed="0.000304"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.523797" level="INFO">${reference} = netconf_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-12T00:19:18.523602" elapsed="0.000221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.524305" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.523963" elapsed="0.000369"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.524803" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.524474" elapsed="0.000357"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.525410" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.524980" elapsed="0.000479"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.525928" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.525598" elapsed="0.000378"/>
</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-12T00:19:18.521505" elapsed="0.004526"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.516329" elapsed="0.009752"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.515990" elapsed="0.010132"/>
</kw>
<doc>Commit the removal and check the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.499579" elapsed="0.026583">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_commit_test_data_removal&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.529372" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.529120" 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-12T00:19:18.530598" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.530488" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.530469" 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-12T00:19:18.535074" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.534967" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.534948" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.536202" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.535758" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.536724" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.536415" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.536797" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.536953" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.535380" elapsed="0.001597"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.537309" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.537539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.537407" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.537390" elapsed="0.000240"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.537179" elapsed="0.000476"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.537030" elapsed="0.000649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.534594" elapsed="0.003139"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.530205" elapsed="0.007584"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.529795" elapsed="0.008039"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.526895" elapsed="0.010991"/>
</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-12T00:19:18.539152" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/none-replace-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/none-replace-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.539294" 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-12T00:19:18.538942" elapsed="0.000390"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.539378" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.539526" 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-12T00:19:18.538638" elapsed="0.000921"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.540484" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.540302" elapsed="0.002000">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.542461" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.542631" elapsed="0.000022"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.540011" elapsed="0.002734">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.542891" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.542955" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.539716" elapsed="0.003335">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.543104" elapsed="0.000015"/>
</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-12T00:19:18.538319" elapsed="0.004876">Cannot open session, you need to establish a connection first.</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-12T00:19:18.543367" elapsed="0.000022"/>
</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-12T00:19:18.543528" 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-12T00:19:18.543703" 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-12T00:19:18.543900" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.543966" elapsed="0.000014"/>
</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-12T00:19:18.538045" elapsed="0.006015">Cannot open session, you need to establish a connection first.</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-12T00:19:18.544219" elapsed="0.000022"/>
</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-12T00:19:18.544386" 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-12T00:19:18.544551" 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-12T00:19:18.545771" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.545391" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.545373" elapsed="0.000484"/>
</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-12T00:19:18.545993" elapsed="0.000317"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.550881" 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-12T00:19:18.550466" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.551125" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.550983" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.550965" elapsed="0.000222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.551672" 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-12T00:19:18.551351" elapsed="0.000348"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.552103" level="INFO">${reference} = netconf_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-12T00:19:18.551849" elapsed="0.000280"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.552449" level="INFO">${reference} = netconf_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-12T00:19:18.552275" elapsed="0.000200"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.552973" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.552629" elapsed="0.000371"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.553457" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.553143" elapsed="0.000342"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.554077" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.553641" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.554562" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.554270" elapsed="0.000354"/>
</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-12T00:19:18.550173" elapsed="0.004509"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.545182" elapsed="0.009552"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.544845" elapsed="0.009964"/>
</kw>
<doc>Several requests in a (simplified) pattern typical for requests from netconf-connector.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.526362" elapsed="0.028490">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_connector_simplified_pattern&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.557958" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.557706" 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-12T00:19:18.559178" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.559068" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.559049" 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-12T00:19:18.563737" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.563626" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.563593" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.564776" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.564378" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.565237" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.564952" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.565308" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.565462" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.564014" elapsed="0.001473"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.565837" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.566131" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.565995" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.565976" elapsed="0.000230"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.565707" elapsed="0.000523"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.565541" elapsed="0.000714"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.563238" elapsed="0.003070"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.558784" elapsed="0.007580"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.558356" elapsed="0.008052"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.555581" elapsed="0.010878"/>
</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-12T00:19:18.567764" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/bug7791-1-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/bug7791-1-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.567895" 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-12T00:19:18.567533" elapsed="0.000391"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.567971" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.568119" 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-12T00:19:18.567196" elapsed="0.000952"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.569071" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.568890" elapsed="0.000617">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.569679" elapsed="0.000055"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.569874" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.568578" elapsed="0.001409">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.570135" elapsed="0.000020"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.570199" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.568290" elapsed="0.002005">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.570349" elapsed="0.000187"/>
</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-12T00:19:18.566911" elapsed="0.003725">Cannot open session, you need to establish a connection first.</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-12T00:19:18.570788" elapsed="0.000022"/>
</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-12T00:19:18.570952" 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-12T00:19:18.571114" 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-12T00:19:18.571286" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.571353" elapsed="0.000016"/>
</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-12T00:19:18.566635" elapsed="0.004814">Cannot open session, you need to establish a connection first.</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-12T00:19:18.571622" elapsed="0.000023"/>
</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-12T00:19:18.571792" 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-12T00:19:18.571955" 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-12T00:19:18.572118" elapsed="0.000021"/>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.573273" 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-12T00:19:18.572870" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.573520" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.573376" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.573357" elapsed="0.000226"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-12T00:19:18.573754" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.574831" 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-12T00:19:18.574462" elapsed="0.000429">'7791' does not contain '-'</status>
</kw>
<msg time="2026-04-12T00:19:18.574983" 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-12T00:19:18.574116" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.575522" 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-12T00:19:18.575161" elapsed="0.000387"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.576035" 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-12T00:19:18.575741" elapsed="0.000320"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.576495" 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-12T00:19:18.576205" elapsed="0.000316"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.577038" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791

Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-12T00:19:18.576677" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.577461" 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-12T00:19:18.577225" elapsed="0.000279"/>
</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-12T00:19:18.578151" 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-12T00:19:18.577813" elapsed="0.000425"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.577570" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.577551" elapsed="0.000747"/>
</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-12T00:19:18.572516" elapsed="0.005828"/>
</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-12T00:19:18.555049" elapsed="0.023342">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=7791

Cannot open session, you need to establish a connection first.</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-12T00:19:18.581473" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.581224" 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-12T00:19:18.582718" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.582592" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.582574" 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-12T00:19:18.587214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.587107" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.587089" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.588270" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.587892" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.588747" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.588445" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.588819" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.588973" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.587507" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.589330" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.589560" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.589427" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.589411" elapsed="0.000241"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.589200" elapsed="0.000475"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.589051" elapsed="0.000649"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.586742" elapsed="0.003012"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.582306" elapsed="0.007503"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.581893" elapsed="0.007962"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.579109" elapsed="0.010798"/>
</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-12T00:19:18.591163" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/delete-not-existing-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/delete-not-existing-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.591322" 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-12T00:19:18.590950" elapsed="0.000404"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.591405" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.591553" 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-12T00:19:18.590639" elapsed="0.000942"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.592545" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.592363" elapsed="0.000647">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.593167" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.593364" elapsed="0.000024"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.592068" elapsed="0.001414">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.593647" elapsed="0.000023"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.593715" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.591776" elapsed="0.002037">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.593866" elapsed="0.000187"/>
</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-12T00:19:18.590340" elapsed="0.003798">Cannot open session, you need to establish a connection first.</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-12T00:19:18.594289" elapsed="0.000022"/>
</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-12T00:19:18.594455" 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-12T00:19:18.594636" 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-12T00:19:18.594799" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.594864" elapsed="0.000016"/>
</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-12T00:19:18.590066" elapsed="0.004895">Cannot open session, you need to establish a connection first.</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-12T00:19:18.596183" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.595816" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.595797" elapsed="0.000472"/>
</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-12T00:19:18.596405" elapsed="0.000332"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.601294" 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-12T00:19:18.600893" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.601536" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.601395" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.601377" elapsed="0.000221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.602044" 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-12T00:19:18.601749" elapsed="0.000322"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.602469" level="INFO">${reference} = netconf_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-12T00:19:18.602214" elapsed="0.000281"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.602836" level="INFO">${reference} = netconf_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-12T00:19:18.602657" elapsed="0.000205"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.603354" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.603001" elapsed="0.000380"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.603846" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.603522" elapsed="0.000352"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.604486" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.604052" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.604992" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.604695" elapsed="0.000345"/>
</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-12T00:19:18.600589" elapsed="0.004507"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.595581" elapsed="0.009565"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.595228" elapsed="0.009961"/>
</kw>
<doc>Attempt to delete the elements again and check that it fails with the correct error.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.578591" elapsed="0.026638">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_delete_not_existing_element&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.608187" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.607938" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.609405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.609296" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.609276" 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-12T00:19:18.614081" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.613972" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.613954" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.615113" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.614735" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.615602" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.615287" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.615689" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.615845" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.614358" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.616201" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.616432" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.616299" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.616282" elapsed="0.000226"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.616071" elapsed="0.000461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.615922" elapsed="0.000634"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.613595" elapsed="0.003029"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.609012" elapsed="0.007672"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.608582" elapsed="0.008147"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.605898" elapsed="0.010883"/>
</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-12T00:19:18.618068" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/commit-no-transaction-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.618191" 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-12T00:19:18.617858" elapsed="0.000360"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.618265" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.618412" 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-12T00:19:18.617540" elapsed="0.000898"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.619366" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.619172" elapsed="0.000641">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.619967" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.620122" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.618882" elapsed="0.001352">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.620380" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.620445" elapsed="0.000015"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.618578" elapsed="0.001963">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.620594" elapsed="0.000029"/>
</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-12T00:19:18.617253" elapsed="0.003448">Cannot open session, you need to establish a connection first.</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-12T00:19:18.620847" elapsed="0.000021"/>
</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-12T00:19:18.621006" 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-12T00:19:18.621164" 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-12T00:19:18.621320" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.621384" elapsed="0.000015"/>
</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-12T00:19:18.616977" elapsed="0.004501">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.622637" 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-12T00:19:18.622221" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.622883" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.622740" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.622721" elapsed="0.000225"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-12T00:19:18.623093" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.624385" 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-12T00:19:18.623843" elapsed="0.000602">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-12T00:19:18.624539" 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-12T00:19:18.623483" elapsed="0.001081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.625070" 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-12T00:19:18.624734" elapsed="0.000362"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.625534" 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-12T00:19:18.625245" elapsed="0.000314"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.626048" 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-12T00:19:18.625717" elapsed="0.000357"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.626632" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-12T00:19:18.626254" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.627060" 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-12T00:19:18.626823" elapsed="0.000281"/>
</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-12T00:19:18.627761" 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-12T00:19:18.627411" elapsed="0.000398"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.627170" elapsed="0.000673"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.627152" 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-12T00:19:18.621885" elapsed="0.006029"/>
</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-12T00:19:18.605431" elapsed="0.022530">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</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-12T00:19:18.630983" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.630734" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.632216" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.632107" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.632088" 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-12T00:19:18.636703" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.636581" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.636563" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.637741" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.637348" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.638203" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.637916" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.638273" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.638427" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.636987" elapsed="0.001465"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.638800" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.639031" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.638899" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.638882" elapsed="0.000225"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.638670" elapsed="0.000460"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.638504" elapsed="0.000651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.636226" elapsed="0.002982"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.631822" elapsed="0.007440"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.631394" elapsed="0.007922"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.628697" elapsed="0.010673"/>
</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-12T00:19:18.640829" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/remove-not-existing-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/remove-not-existing-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.640962" 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-12T00:19:18.640411" elapsed="0.000610"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.641072" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.641225" 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-12T00:19:18.640109" elapsed="0.001144"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.642202" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.642010" elapsed="0.000641">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.642812" elapsed="0.000023"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.642968" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.641705" elapsed="0.001377">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.643234" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.643299" 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-12T00:19:18.641396" elapsed="0.002024">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.643474" elapsed="0.000015"/>
</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-12T00:19:18.639823" elapsed="0.003741">Cannot open session, you need to establish a connection first.</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-12T00:19:18.643725" elapsed="0.000022"/>
</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-12T00:19:18.643887" 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-12T00:19:18.644045" 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-12T00:19:18.644201" elapsed="0.000021"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.644266" elapsed="0.000015"/>
</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-12T00:19:18.639532" elapsed="0.004829">Cannot open session, you need to establish a connection first.</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-12T00:19:18.645542" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.645185" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.645167" elapsed="0.000475"/>
</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-12T00:19:18.645779" elapsed="0.000313"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.650657" 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-12T00:19:18.650230" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.650910" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.650765" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.650746" elapsed="0.000228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.651438" 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-12T00:19:18.651109" elapsed="0.000357"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.651890" level="INFO">${reference} = netconf_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-12T00:19:18.651628" elapsed="0.000289"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.652239" level="INFO">${reference} = netconf_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-12T00:19:18.652064" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.652773" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.652407" elapsed="0.000397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.653311" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.652997" elapsed="0.000343"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.653945" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.653484" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.654436" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.654140" 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-12T00:19:18.649933" elapsed="0.004608"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.644978" elapsed="0.009614"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.644639" elapsed="0.010014"/>
</kw>
<doc>Attempt to remove the "module" element again and check that the operation is "silently ignored".</doc>
<status status="FAIL" start="2026-04-12T00:19:18.628161" elapsed="0.026536">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_remove_not_existing_module&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.658012" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.657759" 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-12T00:19:18.659257" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.659144" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.659124" 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-12T00:19:18.663809" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.663700" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.663682" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.664875" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.664478" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.665338" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.665051" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.665409" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:18.665565" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.664113" elapsed="0.001477"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.665952" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.666185" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.666051" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.666034" elapsed="0.000228"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.665820" elapsed="0.000465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.665663" elapsed="0.000648"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.663312" elapsed="0.003052"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.658858" elapsed="0.007604"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.658420" elapsed="0.008090"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.655395" elapsed="0.011168"/>
</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-12T00:19:18.667895" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/remove-not-existing-commit-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/remove-not-existing-commit-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.668043" 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-12T00:19:18.667673" elapsed="0.000398"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.668119" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.668269" 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-12T00:19:18.667318" elapsed="0.000978"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.669235" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.669043" elapsed="0.000683">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.669881" elapsed="0.000022"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.670036" elapsed="0.000021"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.668748" elapsed="0.001404">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.670298" elapsed="0.000022"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.670363" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.668438" elapsed="0.002020">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.670511" elapsed="0.000204"/>
</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-12T00:19:18.667028" elapsed="0.003772">Cannot open session, you need to establish a connection first.</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-12T00:19:18.670950" elapsed="0.000023"/>
</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-12T00:19:18.671112" 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-12T00:19:18.671273" 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-12T00:19:18.671446" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.671511" elapsed="0.000055"/>
</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-12T00:19:18.666744" elapsed="0.004924">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Report Failure Due To Bug" owner="Utils" type="TEARDOWN">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.672824" 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-12T00:19:18.672403" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.673069" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.672926" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.672908" elapsed="0.000224"/>
</if>
<kw name="Comment" owner="BuiltIn">
<arg>Jira tickets are {PROJECT}-{NUMBER} while Bugzilla tickets are {NUMBER}</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-12T00:19:18.673288" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.674361" 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-12T00:19:18.674013" elapsed="0.000407">'4455' does not contain '-'</status>
</kw>
<msg time="2026-04-12T00:19:18.674510" 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-12T00:19:18.673666" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.675037" 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-12T00:19:18.674704" elapsed="0.000359"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.675568" 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-12T00:19:18.675249" elapsed="0.000346"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.676095" 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-12T00:19:18.675756" elapsed="0.000366"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.676640" level="INFO">Set test message to:
This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</msg>
<arg>${msg}${newline}${newline}${TEST_MESSAGE}</arg>
<doc>Sets message for the current test case.</doc>
<status status="PASS" start="2026-04-12T00:19:18.676265" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.677068" 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-12T00:19:18.676830" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;${include_bug_in_tags}&quot;==&quot;True&quot;">
<kw name="Set Tags" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.677760" 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-12T00:19:18.677404" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.677178" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.677160" elapsed="0.000706"/>
</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-12T00:19:18.672066" elapsed="0.005845"/>
</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-12T00:19:18.654907" elapsed="0.023052">This test fails due to https://bugs.opendaylight.org/show_bug.cgi?id=4455

Cannot open session, you need to establish a connection first.</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-12T00:19:18.680955" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-12T00:19:18.680704" 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-12T00:19:18.682173" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.682063" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.682044" 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-12T00:19:18.686855" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.686746" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.686727" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.687910" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.687510" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.688373" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.688086" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.688444" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.688597" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.687134" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.688981" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.689212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.689079" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.689061" elapsed="0.000227"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.688850" elapsed="0.000461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.688698" elapsed="0.000638"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-12T00:19:18.686367" elapsed="0.003023"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.681781" elapsed="0.007665"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-12T00:19:18.681353" elapsed="0.008139"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-12T00:19:18.678598" elapsed="0.010946"/>
</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-12T00:19:18.690862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/close-session-request.msg"&gt;/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/variables/netconf/MDSAL/close-session-request.msg&lt;/a&gt;'.</msg>
<msg time="2026-04-12T00:19:18.690988" 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-12T00:19:18.690645" elapsed="0.000371"/>
</kw>
<return>
<value>${data}</value>
<status status="PASS" start="2026-04-12T00:19:18.691063" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.691211" 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-12T00:19:18.690326" elapsed="0.000912"/>
</kw>
<kw name="Send_Message">
<kw name="Transmit_Message">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.692199" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${message}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.692016" elapsed="0.000635">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.692809" elapsed="0.000021"/>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.692965" elapsed="0.000020"/>
</kw>
<arg>${message}</arg>
<doc>Transmit message to Netconf connection and discard the echo of the message.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.691722" elapsed="0.001356">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until" owner="SSHLibrary">
<var>${reply}</var>
<arg>${ODL_NETCONF_PROMPT}</arg>
<doc>Consumes and returns the server output until ``expected`` is encountered.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.693225" elapsed="0.000021"/>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.693290" elapsed="0.000016"/>
</return>
<var>${reply}</var>
<arg>${request}</arg>
<doc>Send message to Netconf connection and get the reply.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.691415" elapsed="0.001972">Cannot open session, you need to establish a connection first.</status>
</kw>
<return>
<value>${reply}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.693440" elapsed="0.000015"/>
</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-12T00:19:18.690036" elapsed="0.003496">Cannot open session, you need to establish a connection first.</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-12T00:19:18.693710" elapsed="0.000023"/>
</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-12T00:19:18.693878" 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-12T00:19:18.694037" 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-12T00:19:18.694194" elapsed="0.000020"/>
</kw>
<return>
<value>${actual}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.694258" elapsed="0.000015"/>
</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-12T00:19:18.689757" elapsed="0.004597">Cannot open session, you need to establish a connection first.</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-12T00:19:18.695804" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.695193" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.695175" elapsed="0.000717"/>
</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-12T00:19:18.696032" elapsed="0.000317"/>
</kw>
<kw name="Report_Failure_And_Point_To_Linked_Bugs" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.700955" 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-12T00:19:18.700537" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="('${TEST_STATUS}' != 'FAIL') or ${test_skipped}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.701198" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.701056" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.701038" elapsed="0.000225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.701713" 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-12T00:19:18.701397" elapsed="0.000343"/>
</kw>
<kw name="Replace String Using Regexp" owner="String">
<msg time="2026-04-12T00:19:18.702145" level="INFO">${reference} = netconf_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-12T00:19:18.701886" elapsed="0.000286"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-12T00:19:18.702494" level="INFO">${reference} = netconf_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-12T00:19:18.702319" elapsed="0.000235"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.703064" level="INFO">${msg} = ... click for list of related bugs or create a new one if needed (with the
"netconf_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-12T00:19:18.702716" elapsed="0.000376"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.703562" level="INFO">${bugs} = "https://bugs.opendaylight.org/buglist.cgi?f1=cf_external_ref&amp;o1=substring&amp;v1=netconf_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-12T00:19:18.703238" elapsed="0.000352"/>
</kw>
<kw name="Set Test Message" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.704188" level="INFO">Set test message to:
... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.703753" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.704692" level="INFO">... click for list of related bugs or create a new one if needed (with the
"netconf_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_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-12T00:19:18.704383" 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-12T00:19:18.700247" elapsed="0.004549"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.694979" elapsed="0.009867"/>
</kw>
<doc>Test case teardown. Show linked bugs in case of failure.</doc>
<status status="PASS" start="2026-04-12T00:19:18.694637" elapsed="0.010251"/>
</kw>
<doc>Close the session and check that it was closed properly.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.678163" elapsed="0.026765">... click for list of related bugs or create a new one if needed (with the
"netconf_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_userfeatures_netty_txt_mdsal_northbound_close_session&amp;order=bug_status"

Cannot open session, you need to establish a connection first.</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-12T00:19:18.706041" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-12T00:19:18.705927" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.705908" elapsed="0.000218"/>
</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-12T00:19:18.706262" elapsed="0.000022"/>
</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-12T00:19:18.706431" elapsed="0.000021"/>
</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-12T00:19:18.706587" elapsed="0.000035"/>
</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-12T00:19:18.706757" elapsed="0.000024"/>
</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-12T00:19:18.706915" 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-12T00:19:18.707061" elapsed="0.000020"/>
</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-12T00:19:18.707211" elapsed="0.000020"/>
</kw>
<doc>Correctly close the Netconf connection and make sure it is really dead.</doc>
<status status="PASS" start="2026-04-12T00:19:18.705752" elapsed="0.001531"/>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:18.707514" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:18.707434" elapsed="0.000165"/>
</kw>
<doc>Close the Netconf connection and destroy all sessions in the requests library.</doc>
<status status="PASS" start="2026-04-12T00:19:18.705473" elapsed="0.002204"/>
</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-12T00:19:17.250757" elapsed="1.456949"/>
</suite>
<status status="FAIL" start="2026-04-12T00:19:17.249557" elapsed="1.459197"/>
</suite>
<suite id="s1-s4" name="CRUD" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/CRUD">
<suite id="s1-s4-s1" name="CRUD-RPC" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:18.803128" 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-12T00:19:18.798842" elapsed="0.004335"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:18.798622" elapsed="0.004619"/>
</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-12T00:19:18.808225" 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-12T00:19:18.804361" elapsed="0.003892"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.808440" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.808334" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.808313" elapsed="0.000192"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.809037" 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-12T00:19:18.808676" elapsed="0.000405"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.809555" level="INFO">${cluster_size} = 0</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-12T00:19:18.809243" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-12T00:19:18.810097" elapsed="0.000284"/>
</kw>
<msg time="2026-04-12T00:19:18.810483" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:18.810530" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:18.809760" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.811105" level="INFO">${int_of_members} = 0</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-12T00:19:18.810734" elapsed="0.000397"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.812136" 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-12T00:19:18.811871" elapsed="0.000293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.812566" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.812311" elapsed="0.000281"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.813054" 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-12T00:19:18.812764" elapsed="0.000317"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:18.815637" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.815427" elapsed="0.000285"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.813132" elapsed="0.002607"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.816300" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:18.815900" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.816929" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:18.816505" elapsed="0.000467"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.817517" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:18.817132" elapsed="0.000428"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-12T00:19:18.811373" elapsed="0.006261"/>
</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-12T00:19:18.804008" elapsed="0.013683"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.817869" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.817757" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.817738" 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-12T00:19:18.821162" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.820782" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.821695" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.821389" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.821768" elapsed="0.000031"/>
</return>
<msg time="2026-04-12T00:19:18.821925" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.820440" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:18.822284" elapsed="0.000023"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.822111" elapsed="0.000232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.822000" elapsed="0.000369"/>
</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-12T00:19:18.818153" elapsed="0.004270"/>
</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-12T00:19:18.822572" elapsed="0.000230"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:18.823109" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.822974" elapsed="0.000201"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.822856" elapsed="0.000344"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:18.803555" elapsed="0.019700"/>
</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-12T00:19:18.825911" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.825799" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.825781" 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-12T00:19:18.830825" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.830718" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.830700" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.831859" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.831459" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.832335" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.832045" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.832406" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:18.832559" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.831113" elapsed="0.001471"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.832944" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.833184" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:18.833042" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.833025" elapsed="0.000234"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.832806" elapsed="0.000477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.832652" elapsed="0.000654"/>
</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-12T00:19:18.830418" elapsed="0.002941"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.823870" elapsed="0.009542"/>
</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-12T00:19:18.823435" elapsed="0.010017"/>
</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-12T00:19:18.798299" elapsed="0.035201"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:18.833946" level="INFO">Creating Session using : alias=operational, url=http://:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5839b6d90&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-12T00:19:18.833659" elapsed="0.000499"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.834954" 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-12T00:19:18.834684" elapsed="0.000297"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.839116" 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-12T00:19:18.835140" elapsed="0.004023"/>
</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-12T00:19:18.843537" level="INFO">Creating Session using : alias=default, url=http://:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e583396850&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-12T00:19:18.843144" elapsed="0.000518"/>
</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-12T00:19:18.842735" elapsed="0.000999"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:18.839235" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.839217" elapsed="0.004575"/>
</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-12T00:19:18.849006" level="INFO">${odl_connection} = 1</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-12T00:19:18.848597" elapsed="0.000436"/>
</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-12T00:19:18.850669" level="INFO">Length is 0.</msg>
<msg time="2026-04-12T00:19:18.850748" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_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-12T00:19:18.850378" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:18.850931" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.852140" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-12T00:19:18.852415" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.851822" elapsed="0.001049">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:18.852928" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.851434" elapsed="0.001545"/>
</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="FAIL" start="2026-04-12T00:19:18.849947" elapsed="0.003137">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:18.853130" 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="FAIL" start="2026-04-12T00:19:18.849542" elapsed="0.003633"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.849213" elapsed="0.004054">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.853315" elapsed="0.000018"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.848240" elapsed="0.005172">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.853575" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:18.853758" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.853879" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.853840" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:18.853823" elapsed="0.000115"/>
</if>
<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-12T00:19:18.858226" elapsed="0.000028"/>
</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="FAIL" start="2026-04-12T00:19:18.844044" elapsed="0.014297">OSError: [Errno 16] Device or resource busy</status>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.834416" elapsed="0.024009">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:18.858590" elapsed="0.000037"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.798020" elapsed="0.060698">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s4-s1-t1" name="Start_Testtool" line="49">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.858816" elapsed="0.000396">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t2" name="Check_Device_Is_Not_Configured_At_Beginning" line="56">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:18.859387" elapsed="0.000466">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t3" name="Configure_Device_On_Netconf" line="61">
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:18.860029" elapsed="0.000394">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t4" name="Check_ODL_Has_Netconf_Connector_For_Device" line="70">
<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-12T00:19:18.860592" elapsed="0.000478">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t5" name="Wait_For_Device_To_Become_Connected" line="76">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.861239" elapsed="0.000389">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t6" name="Check_Device_Data_Is_Empty" line="80">
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.861796" elapsed="0.000340">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t7" name="Create_Device_Data_Label_Via_Xml" line="85">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.862300" elapsed="0.000423">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t8" name="Check_Device_Data_Label_Is_Created" line="90">
<doc>Get the device data label and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.862889" elapsed="0.000396">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t9" name="Modify_Device_Data_Label_Via_Xml" line="95">
<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-12T00:19:18.863472" elapsed="0.000449">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t10" name="Check_Device_Data_Label_Is_Modified" line="100">
<doc>Get the device data label and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.864087" elapsed="0.000401">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t11" name="Deconfigure_Device_From_Netconf_Temporarily" line="105">
<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-12T00:19:18.864669" elapsed="0.000739">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t12" name="Wait_For_Device_To_Be_Gone" line="118">
<doc>Wait for the device to completely disappear.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.865580" elapsed="0.000356">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t13" name="Configure_The_Device_Back" line="122">
<doc>Configure the device again.
This is the second step of the device configuration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:18.866101" elapsed="0.000409">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t14" name="Wait_For_Device_To_Reconnect" line="132">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.866697" elapsed="0.000359">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t15" name="Check_Modified_Device_Data_Is_Still_There" line="136">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.867223" elapsed="0.000436">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t16" name="Modify_Device_Data_Again" line="144">
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.867827" elapsed="0.000384">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t17" name="Check_Device_Data_Is_Modified_Again" line="149">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.868375" elapsed="0.000457">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t18" name="Modify_Device_Data_Label_Via_Json" line="154">
<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-12T00:19:18.869159" elapsed="0.000430">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t19" name="Check_Device_Data_Label_Is_Modified_Via_Json" line="161">
<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-12T00:19:18.869773" elapsed="0.000466">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t20" name="Create_Car_List" line="166">
<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-12T00:19:18.870405" elapsed="0.000423">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t21" name="Check_Car_List_Created" line="171">
<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-12T00:19:18.870994" elapsed="0.000417">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t22" name="Add_Device_Data_Item_1_Via_XML_Post" line="186">
<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-12T00:19:18.871673" elapsed="0.000420">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t23" name="Check_Item1_Is_Created" line="191">
<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-12T00:19:18.872258" elapsed="0.000436">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t24" name="Add_Device_Data_Item_2_Via_JSON_Post" line="205">
<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-12T00:19:18.872862" elapsed="0.000424">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t25" name="Check_Item2_Is_Created" line="210">
<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-12T00:19:18.873452" elapsed="0.000481">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t26" name="Delete_Device_Data" line="224">
<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-12T00:19:18.874163" elapsed="0.000530">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t27" name="Check_Device_Data_Is_Deleted" line="230">
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.874991" elapsed="0.000527">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t28" name="Deconfigure_Device_From_Netconf" line="235">
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:18.875711" elapsed="0.000552">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s1-t29" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="245">
<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-12T00:19:18.876440" elapsed="0.001266">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:18.878434" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:18.878360" elapsed="0.000155"/>
</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-12T00:19:18.880202" 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-12T00:19:18.879890" elapsed="0.000340"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.880566" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.880382" elapsed="0.000627">Cannot open session, you need to establish a connection first.</status>
</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="FAIL" start="2026-04-12T00:19:18.879360" elapsed="0.001768">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.881442" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.881285" elapsed="0.000736">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-12T00:19:18.886287" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.882187" elapsed="0.004133">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.879082" elapsed="0.007363">Several failures occurred:

1) Cannot open session, you need to establish a connection first.

2) Cannot open session, you need to establish a connection first.

3) Variable '${testtool_log}' not found.</status>
</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-12T00:19:18.878691" elapsed="0.007808"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-12T00:19:18.878135" elapsed="0.008414"/>
</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-12T00:19:18.710572" elapsed="0.176006">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<suite id="s1-s4-s2" name="CRUD" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:18.971469" 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-12T00:19:18.967193" elapsed="0.004351"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:18.966976" elapsed="0.004646"/>
</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-12T00:19:18.976450" 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-12T00:19:18.972688" elapsed="0.003791"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:18.976678" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.976559" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.976539" elapsed="0.000204"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.977255" 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-12T00:19:18.976898" elapsed="0.000401"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.977794" level="INFO">${cluster_size} = 0</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-12T00:19:18.977461" elapsed="0.000359"/>
</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-12T00:19:18.978364" elapsed="0.000304"/>
</kw>
<msg time="2026-04-12T00:19:18.978770" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:18.978817" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:18.978026" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.979377" level="INFO">${int_of_members} = 0</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-12T00:19:18.979008" elapsed="0.000395"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.980390" 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-12T00:19:18.980126" elapsed="0.000290"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.980837" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.980564" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.981303" 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-12T00:19:18.981017" elapsed="0.000312"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:18.983814" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.983628" elapsed="0.000259"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.981383" elapsed="0.002530"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.984470" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:18.984071" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.985085" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:18.984690" elapsed="0.000437"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.985680" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:18.985286" elapsed="0.000437"/>
</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-12T00:19:18.979678" elapsed="0.006102"/>
</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-12T00:19:18.972335" elapsed="0.013502"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.986016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.985902" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.985883" elapsed="0.000201"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.989292" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.988917" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.989780" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:18.989478" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:18.989851" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:18.990005" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.988575" elapsed="0.001454"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:18.990366" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.990189" elapsed="0.000236"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.990080" elapsed="0.000370"/>
</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-12T00:19:18.986299" elapsed="0.004204"/>
</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-12T00:19:18.990669" elapsed="0.000215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:18.991183" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:18.991050" elapsed="0.000231"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:18.990934" elapsed="0.000374"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:18.971907" elapsed="0.019456"/>
</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-12T00:19:18.994004" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.993895" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.993876" 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-12T00:19:18.998826" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:18.998719" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:18.998700" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:18.999873" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:18.999433" elapsed="0.000467"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.000343" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.000059" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.000413" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:19.000565" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:18.999112" elapsed="0.001477"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.000956" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.001204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:19.001053" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.001036" elapsed="0.000244"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.000816" elapsed="0.000487"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.000666" elapsed="0.000661"/>
</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-12T00:19:18.998417" elapsed="0.002962"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:18.991964" elapsed="0.009469"/>
</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-12T00:19:18.991531" elapsed="0.009944"/>
</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-12T00:19:18.966662" elapsed="0.034860"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.001969" level="INFO">Creating Session using : alias=operational, url=http://:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5833eb050&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-12T00:19:19.001692" elapsed="0.000425"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.002925" 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-12T00:19:19.002644" elapsed="0.000307"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.007818" 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-12T00:19:19.003107" elapsed="0.004760"/>
</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-12T00:19:19.012234" level="INFO">Creating Session using : alias=default, url=http://:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5833af0d0&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-12T00:19:19.011852" elapsed="0.000488"/>
</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-12T00:19:19.011362" elapsed="0.001047"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:19.007941" elapsed="0.004500"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.007922" elapsed="0.004544"/>
</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-12T00:19:19.017650" level="INFO">${odl_connection} = 2</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-12T00:19:19.017252" elapsed="0.000426"/>
</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-12T00:19:19.019326" level="INFO">Length is 0.</msg>
<msg time="2026-04-12T00:19:19.019403" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_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-12T00:19:19.019057" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:19.019630" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.020845" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-12T00:19:19.021085" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.020511" elapsed="0.000997">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.021565" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.020118" elapsed="0.001511"/>
</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="FAIL" start="2026-04-12T00:19:19.018621" elapsed="0.003116">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.021785" 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="FAIL" start="2026-04-12T00:19:19.018221" elapsed="0.003610"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.017892" elapsed="0.004033">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.021980" elapsed="0.000019"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.016955" elapsed="0.005128">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.022245" elapsed="0.000023"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.022411" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.022531" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.022493" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.022475" elapsed="0.000114"/>
</if>
<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-12T00:19:19.026873" elapsed="0.000029"/>
</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="FAIL" start="2026-04-12T00:19:19.012735" elapsed="0.014258">OSError: [Errno 16] Device or resource busy</status>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.002371" elapsed="0.024707">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.027245" elapsed="0.000023"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${device_type}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.027430" elapsed="0.000021"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-12T00:19:18.966370" elapsed="0.061193">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s4-s2-t1" name="Start_Testtool" line="45">
<doc>Deploy and start test tool, then wait for all its devices to become online.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.027644" elapsed="0.000394">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t2" name="Check_Device_Is_Not_Configured_At_Beginning" line="52">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.028209" elapsed="0.000440">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t3" name="Configure_Device_On_Netconf" line="57">
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.028820" elapsed="0.000386">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t4" name="Check_ODL_Has_Netconf_Connector_For_Device" line="62">
<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-12T00:19:19.029374" elapsed="0.000478">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t5" name="Wait_For_Device_To_Become_Connected" line="67">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.030018" elapsed="0.000374">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t6" name="Check_Device_Data_Is_Empty" line="71">
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.030552" elapsed="0.000360">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t7" name="Create_Device_Data_Label_Via_Xml" line="76">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.031072" elapsed="0.000408">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t8" name="Check_Device_Data_Label_Is_Created" line="81">
<doc>Get the device data label and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.031679" elapsed="0.000431">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t9" name="Modify_Device_Data_Label_Via_Xml" line="86">
<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-12T00:19:19.032281" elapsed="0.000433">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t10" name="Check_Device_Data_Label_Is_Modified" line="91">
<doc>Get the device data label and make sure it contains the modified content.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.032882" elapsed="0.000540">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t11" name="Deconfigure_Device_From_Netconf_Temporarily" line="96">
<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-12T00:19:19.033644" elapsed="0.000721">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t12" name="Wait_For_Device_To_Be_Gone" line="105">
<doc>Wait for the device to completely disappear.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.034533" elapsed="0.000362">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t13" name="Configure_The_Device_Back" line="109">
<doc>Configure the device again.
This is the second step of the device configuration.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.035103" elapsed="0.000461">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t14" name="Wait_For_Device_To_Reconnect" line="115">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.035753" elapsed="0.000356">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t15" name="Check_Modified_Device_Data_Is_Still_There" line="119">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.036270" elapsed="0.000413">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t16" name="Modify_Device_Data_Again" line="127">
<doc>Send a request to change the sample test data and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.036854" elapsed="0.000384">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t17" name="Check_Device_Data_Is_Modified_Again" line="132">
<doc>Get the device data and make sure it contains the created content.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.037399" elapsed="0.000406">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t18" name="Modify_Device_Data_Label_Via_Json" line="137">
<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-12T00:19:19.037969" elapsed="0.000420">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t19" name="Check_Device_Data_Label_Is_Modified_Via_Json" line="144">
<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-12T00:19:19.038556" elapsed="0.000559">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t20" name="Create_Car_List" line="149">
<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-12T00:19:19.039282" elapsed="0.000470">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t21" name="Check_Car_List_Created" line="154">
<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-12T00:19:19.039921" elapsed="0.000455">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t22" name="Add_Device_Data_Item_1_Via_XML_Post" line="169">
<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-12T00:19:19.040544" elapsed="0.000442">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t23" name="Check_Item1_Is_Created" line="174">
<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-12T00:19:19.041339" elapsed="0.000439">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t24" name="Add_Device_Data_Item_2_Via_JSON_Post" line="188">
<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-12T00:19:19.041948" elapsed="0.000419">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t25" name="Check_Item2_Is_Created" line="193">
<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-12T00:19:19.042533" elapsed="0.000471">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t26" name="Delete_Device_Data" line="207">
<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-12T00:19:19.043166" elapsed="0.000420">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t27" name="Check_Device_Data_Is_Deleted" line="213">
<doc>Get the device data and make sure it is empty again.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.043773" elapsed="0.000349">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t28" name="Deconfigure_Device_From_Netconf" line="218">
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.044289" elapsed="0.000411">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s4-s2-t29" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="224">
<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-12T00:19:19.044871" elapsed="0.001093">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.046754" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:19.046601" elapsed="0.000237"/>
</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-12T00:19:19.048497" 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-12T00:19:19.048185" elapsed="0.000340"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.048880" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.048693" elapsed="0.000612">Cannot open session, you need to establish a connection first.</status>
</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="FAIL" start="2026-04-12T00:19:19.047701" elapsed="0.001722">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.049756" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.049581" elapsed="0.000723">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.055000" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.050470" elapsed="0.004609">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.047412" elapsed="0.007796">Several failures occurred:

1) Cannot open session, you need to establish a connection first.

2) Cannot open session, you need to establish a connection first.

3) Variable '${testtool_log}' not found.</status>
</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-12T00:19:19.046993" elapsed="0.008269"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-12T00:19:19.046389" elapsed="0.008924"/>
</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-12T00:19:18.887293" elapsed="0.168048">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<status status="FAIL" start="2026-04-12T00:19:18.709369" elapsed="0.346921"/>
</suite>
<suite id="s1-s5" name="CRUD-ACTION" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/CRUD-ACTION">
<suite id="s1-s5-s1" name="CRUD-ACTION" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:19.144594" 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-12T00:19:19.140222" elapsed="0.004449"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:19.140006" elapsed="0.004729"/>
</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-12T00:19:19.149629" 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-12T00:19:19.145826" elapsed="0.003831"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.149844" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.149736" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.149716" elapsed="0.000194"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.150414" 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-12T00:19:19.150060" elapsed="0.000397"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.150950" level="INFO">${cluster_size} = 0</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-12T00:19:19.150635" elapsed="0.000341"/>
</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-12T00:19:19.151479" elapsed="0.000318"/>
</kw>
<msg time="2026-04-12T00:19:19.151898" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:19.151944" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:19.151146" elapsed="0.000821"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.152507" level="INFO">${int_of_members} = 0</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-12T00:19:19.152135" elapsed="0.000399"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.153493" 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-12T00:19:19.153231" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.153944" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.153681" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.154415" 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-12T00:19:19.154124" elapsed="0.000318"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.157144" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.156958" elapsed="0.000261"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.154551" elapsed="0.002695"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.157829" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:19.157406" elapsed="0.000468"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.158436" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:19.158037" elapsed="0.000442"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.159043" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:19.158657" elapsed="0.000429"/>
</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-12T00:19:19.152785" elapsed="0.006359"/>
</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-12T00:19:19.145467" elapsed="0.013732"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.159376" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.159264" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.159245" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.162545" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.162169" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.163035" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.162748" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.163106" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:19.163261" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.161845" elapsed="0.001441"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.163661" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.163447" elapsed="0.000276"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.163338" elapsed="0.000410"/>
</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-12T00:19:19.159691" elapsed="0.004110"/>
</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-12T00:19:19.163953" elapsed="0.000209"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.164463" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.164329" elapsed="0.000198"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.164212" elapsed="0.000340"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:19.145032" elapsed="0.019587"/>
</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-12T00:19:19.167251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.167142" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.167124" 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-12T00:19:19.172165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.172058" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.172040" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.173178" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.172795" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.173665" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.173364" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.173775" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:19.173931" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.172449" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.174307" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.174551" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:19.174406" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.174389" elapsed="0.000253"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.174168" elapsed="0.000498"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.174019" elapsed="0.000673"/>
</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-12T00:19:19.171773" elapsed="0.002972"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:19.165186" elapsed="0.009615"/>
</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-12T00:19:19.164774" elapsed="0.010069"/>
</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-12T00:19:19.139694" elapsed="0.035197"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.175312" level="INFO">Creating Session using : alias=operational, url=http://:8182/restconf/data, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5832445d0&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-12T00:19:19.175038" elapsed="0.000425"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.176267" 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-12T00:19:19.176003" elapsed="0.000290"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.180519" 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-12T00:19:19.176484" elapsed="0.004082"/>
</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-12T00:19:19.184908" level="INFO">Creating Session using : alias=default, url=http://:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e583248890&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-12T00:19:19.184525" elapsed="0.000491"/>
</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-12T00:19:19.184116" elapsed="0.000970"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:19.180652" elapsed="0.004466"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.180633" elapsed="0.004510"/>
</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-12T00:19:19.190303" level="INFO">${odl_connection} = 3</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-12T00:19:19.189920" elapsed="0.000410"/>
</kw>
<kw name="Flexible_Controller_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.191973" level="INFO">Length is 0.</msg>
<msg time="2026-04-12T00:19:19.192054" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_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-12T00:19:19.191697" 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-12T00:19:19.192236" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.193401" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-12T00:19:19.193697" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.193087" elapsed="0.001058">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.194202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.192735" elapsed="0.001517"/>
</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="FAIL" start="2026-04-12T00:19:19.191231" elapsed="0.003162">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.194443" 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="FAIL" start="2026-04-12T00:19:19.190848" elapsed="0.003640"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.190505" elapsed="0.004076">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.194648" elapsed="0.000020"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.189627" elapsed="0.005121">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.194912" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.195077" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.195198" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.195160" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.195142" elapsed="0.000115"/>
</if>
<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-12T00:19:19.199531" elapsed="0.000027"/>
</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="FAIL" start="2026-04-12T00:19:19.185395" elapsed="0.014276">OSError: [Errno 16] Device or resource busy</status>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.175747" elapsed="0.024009">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.199921" elapsed="0.000022"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<arg>${RPC_FILE}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.200097" elapsed="0.000020"/>
</kw>
<kw name="Install_And_Start_Testtool" owner="NetconfKeywords">
<arg>device-count=1</arg>
<arg>schemas=/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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="NOT RUN" start="2026-04-12T00:19:19.200318" elapsed="0.000023"/>
</kw>
<doc>Initialize SetupUtils. Setup everything needed for the test cases.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.139353" elapsed="0.061079">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s5-s1-t1" name="Check_Device_Is_Not_Configured_At_Beginning" line="44">
<doc>Sanity check making sure our device is not there. Fail if found.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.200491" elapsed="0.000459">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t2" name="Configure_Device_On_Netconf" line="49">
<doc>Make request to configure a testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.201128" elapsed="0.000386">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t3" name="Check_ODL_Has_Netconf_Connector_For_Device" line="58">
<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-12T00:19:19.201700" elapsed="0.000451">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t4" name="Wait_For_Device_To_Become_Connected" line="64">
<doc>Wait until the device becomes available through Netconf.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.202316" elapsed="0.000383">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t5" name="Check_Device_Data_Is_Empty" line="68">
<doc>Get the device data and make sure it is empty.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.202862" elapsed="0.000332">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t6" name="Invoke_Yang1.1_Action_Via_Xml_Post" line="73">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.203356" elapsed="0.000444">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t7" name="Invoke_Yang1.1_Action_Via_Json_Post" line="80">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.203965" elapsed="0.000406">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t8" name="Invoke_Yang1.1_Augmentation_Via_Xml_Post" line="87">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.204535" elapsed="0.000443">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t9" name="Invoke_Yang1.1_Augmentation_Via_Json_Post" line="92">
<doc>Send a sample test data label into the device and check that the request went OK.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.205139" elapsed="0.000419">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t10" name="Deconfigure_Device_From_Netconf" line="99">
<doc>Make request to deconfigure the testtool device on Netconf connector.</doc>
<tag>critical</tag>
<status status="FAIL" start="2026-04-12T00:19:19.205738" elapsed="0.000398">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s5-s1-t11" name="Check_Device_Going_To_Be_Gone_After_Deconfiguring" line="109">
<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-12T00:19:19.206301" elapsed="0.001098">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.208115" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:19.208041" elapsed="0.000144"/>
</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-12T00:19:19.209508" 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-12T00:19:19.209205" elapsed="0.000331"/>
</kw>
<kw name="Write Bare" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.209893" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<arg>${ctrl_c}</arg>
<doc>Writes the given ``text`` on the remote machine without appending a newline.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.209702" elapsed="0.000635">Cannot open session, you need to establish a connection first.</status>
</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="FAIL" start="2026-04-12T00:19:19.208997" elapsed="0.001457">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Read Until Prompt" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.210996" level="FAIL">Cannot open session, you need to establish a connection first.</msg>
<doc>Consumes and returns the server output until the prompt is found.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.210750" elapsed="0.000817">Cannot open session, you need to establish a connection first.</status>
</kw>
<kw name="Get File" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.216108" level="FAIL">Variable '${testtool_log}' not found.</msg>
<arg>${testtool_log}</arg>
<doc>Downloads file(s) from the remote machine to the local machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.211773" elapsed="0.004370">Variable '${testtool_log}' not found.</status>
</kw>
<doc>Stop testtool and download its log.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.208742" elapsed="0.007522">Several failures occurred:

1) Cannot open session, you need to establish a connection first.

2) Cannot open session, you need to establish a connection first.

3) Variable '${testtool_log}' not found.</status>
</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-12T00:19:19.208340" elapsed="0.007977"/>
</kw>
<doc>Teardown the test infrastructure, perform cleanup and release all resources.</doc>
<status status="PASS" start="2026-04-12T00:19:19.207829" elapsed="0.008544"/>
</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-12T00:19:19.058019" elapsed="0.158386">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<status status="FAIL" start="2026-04-12T00:19:19.056943" elapsed="0.160236"/>
</suite>
<suite id="s1-s6" name="Notifications" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/notifications">
<suite id="s1-s6-s1" name="Notifications Basic" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:19.308850" 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-12T00:19:19.304559" elapsed="0.004340"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:19.304342" elapsed="0.004622"/>
</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-12T00:19:19.313881" 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-12T00:19:19.310026" elapsed="0.003883"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.314095" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.313988" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.313967" elapsed="0.000191"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.314679" 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-12T00:19:19.314312" elapsed="0.000412"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.315277" level="INFO">${cluster_size} = 0</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-12T00:19:19.314887" elapsed="0.000417"/>
</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-12T00:19:19.315856" elapsed="0.000300"/>
</kw>
<msg time="2026-04-12T00:19:19.316259" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:19.316305" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:19.315469" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.316887" level="INFO">${int_of_members} = 0</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-12T00:19:19.316494" elapsed="0.000420"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.317899" 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-12T00:19:19.317632" elapsed="0.000294"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.318327" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.318075" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.318852" 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-12T00:19:19.318509" elapsed="0.000370"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.321520" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.321335" elapsed="0.000258"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.318930" elapsed="0.002710"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.322206" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:19.321807" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.322824" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:19.322413" elapsed="0.000455"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.323410" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:19.323029" elapsed="0.000424"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-12T00:19:19.317170" elapsed="0.006341"/>
</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-12T00:19:19.309689" elapsed="0.013878"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.323780" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.323652" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.323632" elapsed="0.000215"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.327033" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.326652" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.327503" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.327220" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.327573" elapsed="0.000045"/>
</return>
<msg time="2026-04-12T00:19:19.327774" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.326288" elapsed="0.001514"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.328141" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.327963" elapsed="0.000237"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.327854" elapsed="0.000372"/>
</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-12T00:19:19.324064" elapsed="0.004214"/>
</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-12T00:19:19.328430" elapsed="0.000221"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.328956" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.328818" elapsed="0.000201"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.328702" elapsed="0.000342"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:19.309240" elapsed="0.019857"/>
</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-12T00:19:19.331737" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.331596" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.331577" 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-12T00:19:19.336963" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.336855" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.336837" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.337972" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.337576" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.338486" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.338198" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.338558" elapsed="0.000029"/>
</return>
<msg time="2026-04-12T00:19:19.338729" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.337251" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.339095" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.339339" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:19.339194" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.339177" elapsed="0.000238"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.338953" elapsed="0.000485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.338806" elapsed="0.000656"/>
</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-12T00:19:19.336538" elapsed="0.002976"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:19.329675" elapsed="0.009893"/>
</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-12T00:19:19.329250" elapsed="0.010374"/>
</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-12T00:19:19.304033" elapsed="0.035653"/>
</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-12T00:19:19.353978" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.353869" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.353850" elapsed="0.000197"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.354332" level="INFO">index=3
host=
alias=None
port=22
timeout=10 seconds
newline=

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-12T00:19:19.354453" level="INFO">${current_ssh_connection_object} = index=3
host=
alias=None
port=22
timeout=10 seconds
newline=

prompt=&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-12T00:19:19.354202" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.354909" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:19.354650" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.355350" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-12T00:19:19.355109" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:19.356167" 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-12T00:19:19.355950" elapsed="0.000311">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-12T00:19:19.356372" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-12T00:19:19.356417" 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-12T00:19:19.355554" elapsed="0.000885"/>
</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-12T00:19:19.356755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:19.356514" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.356496" elapsed="0.000359"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-12T00:19:19.357599" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.357320" elapsed="0.000387">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.357768" elapsed="0.000017"/>
</return>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.357053" elapsed="0.000818">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.358037" elapsed="0.000022"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.358221" elapsed="0.000021"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.358426" elapsed="0.000022"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.358619" elapsed="0.000022"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-12T00:19:19.362228" elapsed="0.000141"/>
</kw>
<msg time="2026-04-12T00:19:19.362413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:19.361754" elapsed="0.000718"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.362648" elapsed="0.000024"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.362820" 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-12T00:19:19.359523" elapsed="0.003379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_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-12T00:19:19.358898" elapsed="0.004050"/>
</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-12T00:19:19.352143" elapsed="0.010879">Dictionary does not contain key '1'.</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-12T00:19:19.367156" elapsed="0.000027"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:19.367335" elapsed="0.000022"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:19.367506" 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-12T00:19:19.367715" elapsed="0.000023"/>
</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-12T00:19:19.367896" 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-12T00:19:19.368060" elapsed="0.000020"/>
</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-12T00:19:19.368230" 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-12T00:19:19.368404" 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-12T00:19:19.368566" elapsed="0.000019"/>
</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-12T00:19:19.368748" elapsed="0.000021"/>
</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-12T00:19:19.368926" elapsed="0.000019"/>
</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-12T00:19:19.369086" elapsed="0.000020"/>
</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-12T00:19:19.369247" elapsed="0.000020"/>
</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-12T00:19:19.369619" elapsed="0.000026"/>
</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-12T00:19:19.303731" elapsed="0.066001">Dictionary does not contain key '1'.</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-12T00:19:19.369790" elapsed="0.000336">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.370304" elapsed="0.000339">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.370816" elapsed="0.000302">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.371288" elapsed="0.000289">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.371807" elapsed="0.000325">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.372306" elapsed="0.000366">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.372844" elapsed="0.000565">Parent suite setup failed:
Dictionary does not contain key '1'.</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-12T00:19:19.373582" elapsed="0.000464">Parent suite setup failed:
Dictionary does not contain key '1'.</status>
</test>
<kw name="Teardown_Everything" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.374796" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:19.374719" elapsed="0.000126"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-12T00:19:19.374992" elapsed="0.000114"/>
</kw>
<doc>Close connections.
Tear down imported Resources.</doc>
<status status="PASS" start="2026-04-12T00:19:19.374486" elapsed="0.000672"/>
</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-12T00:19:19.218852" elapsed="0.156336">Suite setup failed:
Dictionary does not contain key '1'.</status>
</suite>
<status status="FAIL" start="2026-04-12T00:19:19.217772" elapsed="0.158207"/>
</suite>
<suite id="s1-s7" name="KeyAuth" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/suites/netconf/KeyAuth">
<suite id="s1-s7-s1" name="Keyauth" source="/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/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-12T00:19:19.462207" 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-12T00:19:19.457804" elapsed="0.004450"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-12T00:19:19.457565" elapsed="0.004751"/>
</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-12T00:19:19.467239" 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-12T00:19:19.463381" elapsed="0.003886"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.467449" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.467346" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.467325" elapsed="0.000188"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.468058" 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-12T00:19:19.467684" elapsed="0.000418"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.468572" level="INFO">${cluster_size} = 0</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-12T00:19:19.468262" elapsed="0.000336"/>
</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-12T00:19:19.469112" elapsed="0.000281"/>
</kw>
<msg time="2026-04-12T00:19:19.469489" level="INFO">${status} = PASS</msg>
<msg time="2026-04-12T00:19:19.469536" level="INFO">${possibly_int_of_members} = 0</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-12T00:19:19.468779" elapsed="0.000780"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.470120" level="INFO">${int_of_members} = 0</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-12T00:19:19.469747" elapsed="0.000399"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.471107" 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-12T00:19:19.470845" elapsed="0.000289"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.471543" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.471288" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.472059" 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-12T00:19:19.471769" elapsed="0.000318"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.474795" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.474598" elapsed="0.000306"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.472138" elapsed="0.002795"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.475500" level="INFO">${ClusterManagement__member_index_list} = []</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-12T00:19:19.475095" elapsed="0.000450"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.476137" level="INFO">${ClusterManagement__index_to_ip_mapping} = {}</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-12T00:19:19.475721" elapsed="0.000460"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.476743" level="INFO">${ClusterManagement__session_list} = []</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-12T00:19:19.476340" elapsed="0.000448"/>
</kw>
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="PASS" start="2026-04-12T00:19:19.470380" elapsed="0.006500"/>
</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-12T00:19:19.463037" elapsed="0.013900"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.477116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.477002" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.476984" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.480317" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.479940" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.480806" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.480501" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.480877" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:19.481031" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.479568" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<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="NOT RUN" start="2026-04-12T00:19:19.481387" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.481216" elapsed="0.000230"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.481108" elapsed="0.000363"/>
</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-12T00:19:19.477400" elapsed="0.004125"/>
</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-12T00:19:19.481693" elapsed="0.000215"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.482210" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.482076" elapsed="0.000197"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.481958" elapsed="0.000340"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-12T00:19:19.462590" elapsed="0.019762"/>
</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-12T00:19:19.485032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.484922" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.484903" 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-12T00:19:19.490009" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.489903" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.489885" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.491012" level="INFO">${return_list_reference} = []</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-12T00:19:19.490633" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.491480" level="INFO">${return_list_copy} = []</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-12T00:19:19.491196" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-12T00:19:19.491550" elapsed="0.000030"/>
</return>
<msg time="2026-04-12T00:19:19.491722" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-12T00:19:19.490294" elapsed="0.001469"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.492158" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.492415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-12T00:19:19.492260" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.492239" elapsed="0.000257"/>
</if>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-12T00:19:19.492017" elapsed="0.000504"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.491864" elapsed="0.000681"/>
</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-12T00:19:19.489618" elapsed="0.002981"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-12T00:19:19.482939" elapsed="0.009731"/>
</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-12T00:19:19.482502" elapsed="0.010209"/>
</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-12T00:19:19.457261" elapsed="0.035499"/>
</kw>
<kw name="Setup_NetconfKeywords" owner="NetconfKeywords">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.493542" 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-12T00:19:19.493264" elapsed="0.000305"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-12T00:19:19.497905" 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-12T00:19:19.493781" elapsed="0.004171"/>
</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-12T00:19:19.502337" level="INFO">Creating Session using : alias=default, url=http://:8182, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x71e5833cdf50&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-12T00:19:19.501957" elapsed="0.000507"/>
</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-12T00:19:19.501532" elapsed="0.001000"/>
</kw>
<status status="PASS" start="2026-04-12T00:19:19.498025" elapsed="0.004539"/>
</branch>
<status status="PASS" start="2026-04-12T00:19:19.498007" elapsed="0.004582"/>
</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-12T00:19:19.507886" level="INFO">${odl_connection} = 4</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-12T00:19:19.507442" elapsed="0.000471"/>
</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-12T00:19:19.509564" level="INFO">Length is 0.</msg>
<msg time="2026-04-12T00:19:19.509659" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_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-12T00:19:19.509288" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-12T00:19:19.509843" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-12T00:19:19.511028" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-12T00:19:19.511293" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.510701" elapsed="0.001069">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.511827" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.510330" elapsed="0.001551"/>
</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="FAIL" start="2026-04-12T00:19:19.508827" elapsed="0.003158">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-12T00:19:19.512033" 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="FAIL" start="2026-04-12T00:19:19.508424" elapsed="0.003654"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Controller machine.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.508092" elapsed="0.004076">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${odl_connection}</value>
<status status="NOT RUN" start="2026-04-12T00:19:19.512217" elapsed="0.000018"/>
</return>
<var>${odl}</var>
<doc>Open a connection to the ODL system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.507146" elapsed="0.005167">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/../../tools/deployment/search.sh</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.512474" elapsed="0.000022"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.512698" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="not (${tools_system_connect})">
<return>
<status status="NOT RUN" start="2026-04-12T00:19:19.512821" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-12T00:19:19.512783" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-12T00:19:19.512765" elapsed="0.000116"/>
</if>
<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-12T00:19:19.517224" elapsed="0.000028"/>
</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="FAIL" start="2026-04-12T00:19:19.502858" elapsed="0.014484">OSError: [Errno 16] Device or resource busy</status>
</kw>
<doc>Setup the environment for the other keywords of this Resource to work properly.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.493002" elapsed="0.024424">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-04-12T00:19:19.517597" elapsed="0.000036"/>
</kw>
<kw name="Run Netopeer Docker Container">
<doc>Start a new docker container for netopeer server.</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.517799" elapsed="0.000022"/>
</kw>
<kw name="Add Netconf Key">
<doc>Add Netconf Southbound key containing details about device private key and passphrase</doc>
<status status="NOT RUN" start="2026-04-12T00:19:19.517943" elapsed="0.000021"/>
</kw>
<doc>Get the suite ready for callhome test cases.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.456987" elapsed="0.061056">OSError: [Errno 16] Device or resource busy</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-12T00:19:19.518101" elapsed="0.000449">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</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-12T00:19:19.518741" elapsed="0.000540">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</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-12T00:19:19.519447" elapsed="0.000408">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</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-12T00:19:19.520022" elapsed="0.000418">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</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-12T00:19:19.520626" elapsed="0.001095">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Suite Teardown" type="TEARDOWN">
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-12T00:19:19.522468" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-12T00:19:19.522393" elapsed="0.000140"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-12T00:19:19.522695" elapsed="0.000109"/>
</kw>
<doc>Tearing down the setup.</doc>
<status status="PASS" start="2026-04-12T00:19:19.522180" elapsed="0.000677"/>
</kw>
<doc>Test suite to verify the device mount using public key based auth.</doc>
<status status="FAIL" start="2026-04-12T00:19:19.377519" elapsed="0.145367">Suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</suite>
<status status="FAIL" start="2026-04-12T00:19:19.376432" elapsed="0.147196"/>
</suite>
<status status="FAIL" start="2026-04-12T00:19:15.279371" elapsed="4.245226"/>
</suite>
<statistics>
<total>
<stat pass="1" fail="137" 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-userfeatures-netty.txt" id="s1" pass="1" fail="137" skip="0">netconf-userfeatures-netty.txt</stat>
<stat name="Ready" id="s1-s1" pass="0" fail="6" skip="0">netconf-userfeatures-netty.txt.Ready</stat>
<stat name="Netconfready" id="s1-s1-s1" pass="0" fail="6" skip="0">netconf-userfeatures-netty.txt.Ready.Netconfready</stat>
<stat name="Apidocs" id="s1-s2" pass="0" fail="1" skip="0">netconf-userfeatures-netty.txt.Apidocs</stat>
<stat name="Apidocs" id="s1-s2-s1" pass="0" fail="1" skip="0">netconf-userfeatures-netty.txt.Apidocs.Apidocs</stat>
<stat name="MDSAL" id="s1-s3" pass="1" fail="48" skip="0">netconf-userfeatures-netty.txt.MDSAL</stat>
<stat name="Northbound" id="s1-s3-s1" pass="1" fail="48" skip="0">netconf-userfeatures-netty.txt.MDSAL.Northbound</stat>
<stat name="CRUD" id="s1-s4" pass="0" fail="58" skip="0">netconf-userfeatures-netty.txt.CRUD</stat>
<stat name="CRUD-RPC" id="s1-s4-s1" pass="0" fail="29" skip="0">netconf-userfeatures-netty.txt.CRUD.CRUD-RPC</stat>
<stat name="CRUD" id="s1-s4-s2" pass="0" fail="29" skip="0">netconf-userfeatures-netty.txt.CRUD.CRUD</stat>
<stat name="CRUD-ACTION" id="s1-s5" pass="0" fail="11" skip="0">netconf-userfeatures-netty.txt.CRUD-ACTION</stat>
<stat name="CRUD-ACTION" id="s1-s5-s1" pass="0" fail="11" skip="0">netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION</stat>
<stat name="Notifications" id="s1-s6" pass="0" fail="8" skip="0">netconf-userfeatures-netty.txt.Notifications</stat>
<stat name="Notifications Basic" id="s1-s6-s1" pass="0" fail="8" skip="0">netconf-userfeatures-netty.txt.Notifications.Notifications Basic</stat>
<stat name="KeyAuth" id="s1-s7" pass="0" fail="5" skip="0">netconf-userfeatures-netty.txt.KeyAuth</stat>
<stat name="Keyauth" id="s1-s7-s1" pass="0" fail="5" skip="0">netconf-userfeatures-netty.txt.KeyAuth.Keyauth</stat>
</suite>
</statistics>
<errors>
<msg time="2026-04-12T00:19:18.721486" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.723043" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.725684" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.726190" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.734168" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.734907" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD-RPC' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.891880" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.893595" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.895302" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.895818" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.903978" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:18.904722" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-userfeatures-netty.txt.CRUD.CRUD' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.063230" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.064732" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.066356" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.066866" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.074882" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.075643" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-userfeatures-netty.txt.CRUD-ACTION.CRUD-ACTION' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.224314" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/KarafKeywords.robot' on line 9: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.225623" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/SSHKeywords.robot' on line 16: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.226095" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/Utils.robot' on line 4: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.235785" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NetconfKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.237258" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/NexusKeywords.robot' on line 20: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
<msg time="2026-04-12T00:19:19.239174" level="WARN">Error in file '/w/workspace/netconf-csit-1node-userfeatures-netty-all-vanadium/test/csit/libraries/RemoteBash.robot' on line 25: Suite 'netconf-userfeatures-netty.txt.Notifications.Notifications Basic' has already imported library 'SSHLibrary' with different arguments. This import is ignored.</msg>
</errors>
</robot>
