<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-22T02:07:37.113513" rpa="false" schemaversion="5">
<suite id="s1" name="daexim-clustering-basic.txt">
<suite id="s1-s1" name="010-Special-Export" source="/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/suites/daexim/010-special-export.robot">
<kw name="ClusterManagement_Setup" owner="ClusterManagement" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.725712" 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-22T02:07:37.721920" elapsed="0.003834"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-22T02:07:37.726002" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:37.725871" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:37.725842" elapsed="0.000239"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.726624" 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-22T02:07:37.726236" elapsed="0.000439"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.727196" 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-22T02:07:37.726844" elapsed="0.000382"/>
</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-22T02:07:37.727813" elapsed="0.000306"/>
</kw>
<msg time="2026-04-22T02:07:37.728231" level="INFO">${status} = PASS</msg>
<msg time="2026-04-22T02:07:37.728284" 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-22T02:07:37.727411" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.728896" 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-22T02:07:37.728499" elapsed="0.000425"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.729944" 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-22T02:07:37.729665" elapsed="0.000308"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.730406" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-22T02:07:37.730117" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.730944" 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-22T02:07:37.730600" elapsed="0.000373"/>
</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-22T02:07:37.733493" elapsed="0.000027"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:37.733292" elapsed="0.000278"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.731034" elapsed="0.002567"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.734114" 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-22T02:07:37.733750" elapsed="0.000409"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.734718" 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-22T02:07:37.734313" elapsed="0.000450"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.735256" 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-22T02:07:37.734911" elapsed="0.000389"/>
</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-22T02:07:37.729177" elapsed="0.006204"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-22T02:07:37.721264" elapsed="0.014180"/>
</kw>
<test id="s1-s1-t1" name="Create and Cancel Export" line="13">
<kw name="Verify Export Status" owner="DaeximKeywords">
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.743132" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:37.742823" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:37.743210" elapsed="0.000041"/>
</return>
<msg time="2026-04-22T02:07:37.743398" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:37.742472" elapsed="0.000953"/>
</kw>
<kw name="Post_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Post_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.756352" level="INFO">/rests/operations/data-export-import:status-export</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.756089" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.756800" level="INFO"/>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.756557" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.757301" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.757049" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.757750" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.757504" elapsed="0.000291"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.758748" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-22T02:07:37.758531" elapsed="0.000245"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-22T02:07:37.759101" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-22T02:07:37.758918" elapsed="0.000210"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-22T02:07:37.759266" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.759956" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.759703" elapsed="0.000298"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-22T02:07:37.760046" elapsed="0.000032"/>
</return>
<msg time="2026-04-22T02:07:37.760210" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-22T02:07:37.757988" elapsed="0.002248"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:37.762872" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.762556" elapsed="0.001007">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:37.760310" elapsed="0.003346">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.763833" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.763692" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:37.760291" elapsed="0.003636">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.764285" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.764443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:37.764403" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-22T02:07:37.764383" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.764655" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.764723" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<arg>explicit_status_codes=${explicit_status_codes}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>POST data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.753476" elapsed="0.011362">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.764917" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Post_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.
Response status code must be one of values from ${explicit_status_codes} if specified or one of set
created from all positive HTTP status codes together with ${additional_allowed_status_codes}.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.750949" elapsed="0.014071">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.765083" elapsed="0.000015"/>
</return>
<var>${response_json}</var>
<arg>${STATUS_EXPORT_URL}</arg>
<arg>${EMPTY}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.740315" elapsed="0.024862">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.765333" elapsed="0.000024"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<var>${response_json}</var>
<arg>${response_json}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.765503" elapsed="0.000020"/>
</kw>
<kw name="Verify Export Status Message" owner="DaeximKeywords">
<arg>${status}</arg>
<arg>${response_json}</arg>
<doc>Verify export restconf response message is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.765736" elapsed="0.000024"/>
</kw>
<arg>${EXPORT_INITIAL_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="FAIL" start="2026-04-22T02:07:37.736016" elapsed="0.029835">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Schedule Export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.766156" elapsed="0.000025"/>
</kw>
<kw name="Verify Export Status" owner="DaeximKeywords">
<arg>${EXPORT_SCHEDULED_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.766387" elapsed="0.000037"/>
</kw>
<kw name="Cancel Export" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Cancel the export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.766609" elapsed="0.000023"/>
</kw>
<kw name="Verify Export Status" owner="DaeximKeywords">
<arg>${EXPORT_INITIAL_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.766819" elapsed="0.000023"/>
</kw>
<doc>schedule and cancel export of a cluster</doc>
<tag>cancel export</tag>
<status status="FAIL" start="2026-04-22T02:07:37.735512" elapsed="0.031471">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<test id="s1-s1-t2" name="Schedule Absolute Time Export With UTC" line="22">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-22T02:07:37.768004" level="INFO">${time} = 2026-04-22T02:07:47Z</msg>
<var>${time}</var>
<arg>UTC</arg>
<arg>00:00:10</arg>
<arg>%Y-%m-%dT%H:%M:%SZ</arg>
<arg>${FALSE}</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-22T02:07:37.767669" elapsed="0.000362"/>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<if>
<branch type="IF" condition="${include}">
<kw name="Set Variable" owner="BuiltIn">
<var>${file}</var>
<arg>${EXPORT_INCLUDE_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.772419" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.772235" elapsed="0.000251"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.772995" level="INFO">${file} = /w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json</msg>
<var>${file}</var>
<arg>${exclude}</arg>
<arg>${EXPORT_EXCLUDE_FILE}</arg>
<arg>${EXPORT_FILE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:37.772650" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-04-22T02:07:37.772513" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:37.772215" elapsed="0.000871"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-22T02:07:37.773494" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json"&gt;/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json&lt;/a&gt;'.</msg>
<msg time="2026-04-22T02:07:37.773636" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "${time}",
    "data-export-import:local-node-only": "${flag}"
   }
 }
</msg>
<var>${json}</var>
<arg>${file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-22T02:07:37.773332" elapsed="0.000331"/>
</kw>
<kw name="Replace Variables" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.774151" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "2026-04-22T02:07:47Z",
    "data-export-import:local-node-only": "false"
   }
 }
</msg>
<var>${json}</var>
<arg>${json}</arg>
<doc>Replaces variables in the given text with their current values.</doc>
<status status="PASS" start="2026-04-22T02:07:37.773801" elapsed="0.000377"/>
</kw>
<kw name="Cleanup The Export Files" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.775014" level="INFO">${host_index} = 1</msg>
<var>${host_index}</var>
<arg>${host_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:37.774703" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_And_Check_Member_List_Or_All" owner="ClusterManagement">
<kw name="Delete_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.786804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:37.786503" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:37.786880" elapsed="0.000032"/>
</return>
<msg time="2026-04-22T02:07:37.787037" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:37.786141" elapsed="0.000921"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.789777" level="INFO">network-topology:network-topology/topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.789530" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:37.792027" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.791825" elapsed="0.000576">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:37.789891" elapsed="0.002587">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.792656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.792517" elapsed="0.000200"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:37.789872" elapsed="0.002870">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.793082" elapsed="0.000025"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.793154" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-04-22T02:07:37.787314" elapsed="0.005946">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.793318" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>${uri}</arg>
<arg>${member_index}</arg>
<doc>Send a DELETE with the supplied uri to member 1.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.785764" elapsed="0.007665">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>Check_No_Content_Member_List_Or_All</arg>
<arg>uri=${uri}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.793627" elapsed="0.000022"/>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.793701" elapsed="0.000015"/>
</return>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Send a DELETE with the supplied uri to the member ${member_index}.
Then check the data is removed from all members in ${member_index_list}.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.783424" elapsed="0.010375">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<arg>ClusterManagement.Delete And Check Member List Or All</arg>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.775181" elapsed="0.018680"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.795305" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.795028" elapsed="0.000389">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.795635" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.796062" elapsed="0.000022"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.796126" elapsed="0.000016"/>
</return>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.794642" elapsed="0.001588">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.796324" level="INFO">${output1} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output1}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.794004" elapsed="0.002346"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.797784" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.797301" elapsed="0.000584">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.798099" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.798278" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.798338" elapsed="0.000016"/>
</return>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.796921" elapsed="0.001544">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.798560" level="INFO">${output2} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output2}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.796514" elapsed="0.002071"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.799457" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.799175" elapsed="0.000374">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.799760" elapsed="0.000030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.799945" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.800006" elapsed="0.000016"/>
</return>
<var>${output}</var>
<arg>ls -lart ${WORKSPACE}/${BUNDLEFOLDER}</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.798797" elapsed="0.001310">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.800257" elapsed="0.000021"/>
</kw>
<kw name="Should Not Match Regexp" owner="BuiltIn">
<arg>${output}</arg>
<arg>daexim</arg>
<doc>Fails if ``string`` matches ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.800420" elapsed="0.000022"/>
</kw>
<arg>${controller_index}</arg>
<doc>Verify if the export directory exists and delete the files if needed</doc>
<status status="FAIL" start="2026-04-22T02:07:37.774382" elapsed="0.026146">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<var>${response_json}</var>
<arg>${SCHEDULE_EXPORT_URL}</arg>
<arg>${json}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.804717" elapsed="0.000058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.804925" elapsed="0.000021"/>
</kw>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Schedule Export job</doc>
<status status="FAIL" start="2026-04-22T02:07:37.768295" elapsed="0.036740">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20 sec</arg>
<arg>5 sec</arg>
<arg>DaeximKeywords.Verify Scheduled Export Timestamp</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.805187" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>20 sec</arg>
<arg>5 sec</arg>
<arg>DaeximKeywords.Verify Export Status</arg>
<arg>${EXPORT_COMPLETE_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.805373" elapsed="0.000021"/>
</kw>
<kw name="Verify Export Files" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify if the backedup files are present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.805630" elapsed="0.000024"/>
</kw>
<doc>Schedule export at a particular time</doc>
<tag>absolute time export</tag>
<status status="FAIL" start="2026-04-22T02:07:37.767195" elapsed="0.038585">Dictionary does not contain key '1'.</status>
</test>
<test id="s1-s1-t3" name="Schedule Absolute Time Export With Localtime" line="41">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-22T02:07:37.806754" level="INFO">${time} = 2026-04-22T02:07:47+000</msg>
<var>${time}</var>
<arg>local</arg>
<arg>00:00:10</arg>
<arg>%Y-%m-%dT%H:%M:%S+000</arg>
<arg>${FALSE}</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-22T02:07:37.806448" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Schedule Export" owner="DaeximKeywords">
<if>
<branch type="IF" condition="${include}">
<kw name="Set Variable" owner="BuiltIn">
<var>${file}</var>
<arg>${EXPORT_INCLUDE_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.811511" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.811325" elapsed="0.000245"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.812062" level="INFO">${file} = /w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json</msg>
<var>${file}</var>
<arg>${exclude}</arg>
<arg>${EXPORT_EXCLUDE_FILE}</arg>
<arg>${EXPORT_FILE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:37.811728" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-22T02:07:37.811594" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:37.811304" elapsed="0.000847"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-22T02:07:37.812431" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json"&gt;/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json&lt;/a&gt;'.</msg>
<msg time="2026-04-22T02:07:37.812556" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "${time}",
    "data-export-import:local-node-only": "${flag}"
   }
 }
</msg>
<var>${json}</var>
<arg>${file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-22T02:07:37.812280" elapsed="0.000302"/>
</kw>
<kw name="Replace Variables" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.813073" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "2026-04-22T02:07:47+000",
    "data-export-import:local-node-only": "false"
   }
 }
</msg>
<var>${json}</var>
<arg>${json}</arg>
<doc>Replaces variables in the given text with their current values.</doc>
<status status="PASS" start="2026-04-22T02:07:37.812720" elapsed="0.000380"/>
</kw>
<kw name="Cleanup The Export Files" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.813921" level="INFO">${host_index} = 1</msg>
<var>${host_index}</var>
<arg>${host_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:37.813611" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_And_Check_Member_List_Or_All" owner="ClusterManagement">
<kw name="Delete_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.825559" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:37.825241" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:37.825632" elapsed="0.000030"/>
</return>
<msg time="2026-04-22T02:07:37.825784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:37.824913" elapsed="0.000896"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.828551" level="INFO">network-topology:network-topology/topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.828281" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:37.830810" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.830616" elapsed="0.000498">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:37.828665" elapsed="0.002522">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.831352" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.831218" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:37.828646" elapsed="0.002807">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.831800" elapsed="0.000025"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.831906" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-04-22T02:07:37.826062" elapsed="0.005952">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.832073" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>${uri}</arg>
<arg>${member_index}</arg>
<doc>Send a DELETE with the supplied uri to member 1.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.824537" elapsed="0.007632">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>Check_No_Content_Member_List_Or_All</arg>
<arg>uri=${uri}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.832329" elapsed="0.000022"/>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.832417" elapsed="0.000016"/>
</return>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Send a DELETE with the supplied uri to the member ${member_index}.
Then check the data is removed from all members in ${member_index_list}.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.822341" elapsed="0.010173">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<arg>ClusterManagement.Delete And Check Member List Or All</arg>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.814089" elapsed="0.018485"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.833818" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.833552" elapsed="0.000354">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.834121" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.834301" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.834397" elapsed="0.000017"/>
</return>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.833138" elapsed="0.001370">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.834604" level="INFO">${output1} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output1}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.832720" elapsed="0.001909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.835851" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.835584" elapsed="0.000357">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.836153" elapsed="0.000222"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.836539" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.836602" elapsed="0.000015"/>
</return>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.835179" elapsed="0.001524">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.836798" level="INFO">${output2} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output2}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.834779" elapsed="0.002044"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.837691" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.837427" elapsed="0.000350">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.837988" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.838166" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.838227" elapsed="0.000016"/>
</return>
<var>${output}</var>
<arg>ls -lart ${WORKSPACE}/${BUNDLEFOLDER}</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.837030" elapsed="0.001296">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.838510" elapsed="0.000022"/>
</kw>
<kw name="Should Not Match Regexp" owner="BuiltIn">
<arg>${output}</arg>
<arg>daexim</arg>
<doc>Fails if ``string`` matches ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.838695" elapsed="0.000022"/>
</kw>
<arg>${controller_index}</arg>
<doc>Verify if the export directory exists and delete the files if needed</doc>
<status status="FAIL" start="2026-04-22T02:07:37.813290" elapsed="0.025516">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<var>${response_json}</var>
<arg>${SCHEDULE_EXPORT_URL}</arg>
<arg>${json}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.842954" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.843126" elapsed="0.000020"/>
</kw>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Schedule Export job</doc>
<status status="FAIL" start="2026-04-22T02:07:37.807401" elapsed="0.035831">Dictionary does not contain key '1'.</status>
</kw>
<arg>*</arg>
<arg>Schedule Export</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-04-22T02:07:37.806935" elapsed="0.036467"/>
</kw>
<doc>Schedule export at a particular time</doc>
<tag>absolute time export</tag>
<status status="PASS" start="2026-04-22T02:07:37.805969" elapsed="0.037547"/>
</test>
<test id="s1-s1-t4" name="Schedule Absolute Time Export In Past" line="47">
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-22T02:07:37.844427" level="INFO">${time} = 2026-04-22T02:07:27Z</msg>
<var>${time}</var>
<arg>UTC</arg>
<arg>-00:00:10</arg>
<arg>%Y-%m-%dT%H:%M:%SZ</arg>
<arg>${FALSE}</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-22T02:07:37.844116" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Expect Error" owner="BuiltIn">
<kw name="Schedule Export" owner="DaeximKeywords">
<if>
<branch type="IF" condition="${include}">
<kw name="Set Variable" owner="BuiltIn">
<var>${file}</var>
<arg>${EXPORT_INCLUDE_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.849156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.848983" elapsed="0.000232"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.849737" level="INFO">${file} = /w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json</msg>
<var>${file}</var>
<arg>${exclude}</arg>
<arg>${EXPORT_EXCLUDE_FILE}</arg>
<arg>${EXPORT_FILE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:37.849394" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-22T02:07:37.849241" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:37.848963" elapsed="0.000872"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-22T02:07:37.850103" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json"&gt;/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/schedule_export.json&lt;/a&gt;'.</msg>
<msg time="2026-04-22T02:07:37.850228" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "${time}",
    "data-export-import:local-node-only": "${flag}"
   }
 }
</msg>
<var>${json}</var>
<arg>${file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-22T02:07:37.849966" elapsed="0.000288"/>
</kw>
<kw name="Replace Variables" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.850771" level="INFO">${json} =  {
   "input": {
    "data-export-import:run-at": "2026-04-22T02:07:27Z",
    "data-export-import:local-node-only": "false"
   }
 }
</msg>
<var>${json}</var>
<arg>${json}</arg>
<doc>Replaces variables in the given text with their current values.</doc>
<status status="PASS" start="2026-04-22T02:07:37.850421" elapsed="0.000377"/>
</kw>
<kw name="Cleanup The Export Files" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.851624" level="INFO">${host_index} = 1</msg>
<var>${host_index}</var>
<arg>${host_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:37.851289" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Delete_And_Check_Member_List_Or_All" owner="ClusterManagement">
<kw name="Delete_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.863216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:37.862919" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:37.863287" elapsed="0.000031"/>
</return>
<msg time="2026-04-22T02:07:37.863454" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:37.862595" elapsed="0.000884"/>
</kw>
<kw name="Delete_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.866185" level="INFO">network-topology:network-topology/topology</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.865936" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="DELETE On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:37.868496" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.868278" elapsed="0.000542">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:37.866295" elapsed="0.002600">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="DELETE On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a DELETE request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.869059" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:37.868926" elapsed="0.000194"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:37.866277" elapsed="0.002866">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>additional_allowed_status_codes=${additional_allowed_status_codes}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.869515" elapsed="0.000025"/>
</kw>
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.869635" elapsed="0.000017"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<doc>DELETE resource at URI, check status_code and return response text..</doc>
<status status="FAIL" start="2026-04-22T02:07:37.863726" elapsed="0.006016">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.869801" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>${uri}</arg>
<arg>${member_index}</arg>
<doc>Send a DELETE with the supplied uri to member 1.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.862198" elapsed="0.007699">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>Check_No_Content_Member_List_Or_All</arg>
<arg>uri=${uri}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.870059" elapsed="0.000021"/>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.870131" elapsed="0.000016"/>
</return>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Send a DELETE with the supplied uri to the member ${member_index}.
Then check the data is removed from all members in ${member_index_list}.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.860032" elapsed="0.010196">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<arg>ClusterManagement.Delete And Check Member List Or All</arg>
<arg>${TOPOLOGY_URL}</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.851792" elapsed="0.018497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.871555" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.871271" elapsed="0.000370">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.871855" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.872037" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.872098" elapsed="0.000015"/>
</return>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.870883" elapsed="0.001313">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.872291" level="INFO">${output1} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output1}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>sudo rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.870469" elapsed="0.001848"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.873530" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.873252" elapsed="0.000363">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.873832" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.874203" elapsed="0.000021"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.874265" elapsed="0.000016"/>
</return>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.872874" elapsed="0.001525">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-22T02:07:37.874495" level="INFO">${output2} = ('FAIL', "Dictionary does not contain key '1'.")</msg>
<var>${output2}</var>
<arg>ClusterManagement.Run Bash Command On Member</arg>
<arg>rm -rf ${WORKSPACE}/${BUNDLEFOLDER}/daexim;clear</arg>
<arg>${host_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-22T02:07:37.872481" elapsed="0.002040"/>
</kw>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.875376" level="FAIL">Dictionary does not contain key '1'.</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.875103" elapsed="0.000359">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.875672" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.875856" elapsed="0.000020"/>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.875916" elapsed="0.000015"/>
</return>
<var>${output}</var>
<arg>ls -lart ${WORKSPACE}/${BUNDLEFOLDER}</arg>
<arg>${host_index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.874727" elapsed="0.001287">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.876163" elapsed="0.000020"/>
</kw>
<kw name="Should Not Match Regexp" owner="BuiltIn">
<arg>${output}</arg>
<arg>daexim</arg>
<doc>Fails if ``string`` matches ``pattern`` as a regular expression.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.876343" elapsed="0.000035"/>
</kw>
<arg>${controller_index}</arg>
<doc>Verify if the export directory exists and delete the files if needed</doc>
<status status="FAIL" start="2026-04-22T02:07:37.850987" elapsed="0.025481">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Post_As_Json_To_Member" owner="ClusterManagement">
<var>${response_json}</var>
<arg>${SCHEDULE_EXPORT_URL}</arg>
<arg>${json}</arg>
<arg>${controller_index}</arg>
<doc>Send a POST with the supplied uri and data to member ${member_index}.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.880640" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${response_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.880815" elapsed="0.000020"/>
</kw>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Schedule Export job</doc>
<status status="FAIL" start="2026-04-22T02:07:37.845052" elapsed="0.035872">Dictionary does not contain key '1'.</status>
</kw>
<arg>*</arg>
<arg>Schedule Export</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>${time}</arg>
<doc>Runs the keyword and checks that the expected error occurred.</doc>
<status status="PASS" start="2026-04-22T02:07:37.844617" elapsed="0.036391"/>
</kw>
<doc>Schedule export at a particular time</doc>
<tag>absolute time export</tag>
<status status="PASS" start="2026-04-22T02:07:37.843694" elapsed="0.037432"/>
</test>
<test id="s1-s1-t5" name="Create Module Exclude Export" line="53">
<kw name="Schedule Exclude Export" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.882553" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${controller_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:37.882196" elapsed="0.000384"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.883341" 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-22T02:07:37.883075" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.883512" elapsed="0.000017"/>
</return>
<var>${host}</var>
<arg>${controller_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.882775" elapsed="0.000837">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<arg>${controller_index}</arg>
<arg>500</arg>
<arg>${TRUE}</arg>
<arg>${module}</arg>
<arg>${store}</arg>
<doc>Schedule Export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.883853" elapsed="0.000030"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10 sec</arg>
<arg>5 sec</arg>
<arg>Verify Export Status</arg>
<arg>complete</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.884033" elapsed="0.000021"/>
</kw>
<kw name="Verify Export Files" owner="DaeximKeywords">
<arg>${controller_index}</arg>
<doc>Verify if the backedup files are present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.884258" elapsed="0.000023"/>
</kw>
<kw name="Copy Export Directory To Test VM" owner="DaeximKeywords">
<arg>${host}</arg>
<doc>This keyword copies the daexim folder genereated in the controller to robot vm. This is done to editing if needed on the json files</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.884534" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${export_file}</var>
<arg>'${store}' == 'operational'</arg>
<arg>${EXP_OPER_FILE}</arg>
<arg>${EXP_DATA_FILE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.884698" elapsed="0.000021"/>
</kw>
<kw name="Join Path" owner="OperatingSystem">
<var>${file_path}</var>
<arg>${EXP_DIR}${host}</arg>
<arg>${export_file}</arg>
<doc>Joins the given path part(s) to the given base path.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.884856" elapsed="0.000020"/>
</kw>
<return>
<value>${file_path}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.884922" elapsed="0.000015"/>
</return>
<var>${file1}</var>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>config</arg>
<arg>network-topology</arg>
<doc>Schedules a export with exclude option. Returns the file that has the excluded export.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.881851" elapsed="0.003167">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Grep File" owner="OperatingSystem">
<var>${lines1}</var>
<arg>${file1}</arg>
<arg>network-topology:</arg>
<doc>Returns the lines of the specified file that match the ``pattern``.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.885171" elapsed="0.000021"/>
</kw>
<kw name="Should Be Empty" owner="BuiltIn">
<arg>${lines1}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.885324" elapsed="0.000021"/>
</kw>
<kw name="Schedule Exclude Export" owner="DaeximKeywords">
<var>${file2}</var>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>operational</arg>
<arg>opendaylight-inventory</arg>
<doc>Schedules a export with exclude option. Returns the file that has the excluded export.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.885580" elapsed="0.000023"/>
</kw>
<kw name="Grep File" owner="OperatingSystem">
<var>${lines2}</var>
<arg>${file2}</arg>
<arg>opendaylight-inventory:</arg>
<doc>Returns the lines of the specified file that match the ``pattern``.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.885744" elapsed="0.000020"/>
</kw>
<kw name="Should Be Empty" owner="BuiltIn">
<arg>${lines2}</arg>
<doc>Verifies that the given item is empty.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.885897" elapsed="0.000020"/>
</kw>
<doc>schedule export with exclude option on a cluster</doc>
<tag>exclude export</tag>
<status status="FAIL" start="2026-04-22T02:07:37.881315" elapsed="0.004727">Dictionary does not contain key '1'.</status>
</test>
<test id="s1-s1-t6" name="Create Wildcard Exclude Export" line="66">
<kw name="Schedule Exclude Export" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.887464" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${controller_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:37.887129" elapsed="0.000362"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:37.888471" 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-22T02:07:37.888186" elapsed="0.000378">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.888625" elapsed="0.000017"/>
</return>
<var>${host}</var>
<arg>${controller_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.887690" elapsed="0.001034">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<arg>${controller_index}</arg>
<arg>500</arg>
<arg>${TRUE}</arg>
<arg>${module}</arg>
<arg>${store}</arg>
<doc>Schedule Export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889002" elapsed="0.000025"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10 sec</arg>
<arg>5 sec</arg>
<arg>Verify Export Status</arg>
<arg>complete</arg>
<arg>${controller_index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889180" elapsed="0.000021"/>
</kw>
<kw name="Verify Export Files" owner="DaeximKeywords">
<arg>${controller_index}</arg>
<doc>Verify if the backedup files are present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889419" elapsed="0.000024"/>
</kw>
<kw name="Copy Export Directory To Test VM" owner="DaeximKeywords">
<arg>${host}</arg>
<doc>This keyword copies the daexim folder genereated in the controller to robot vm. This is done to editing if needed on the json files</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889674" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${export_file}</var>
<arg>'${store}' == 'operational'</arg>
<arg>${EXP_OPER_FILE}</arg>
<arg>${EXP_DATA_FILE}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889838" elapsed="0.000020"/>
</kw>
<kw name="Join Path" owner="OperatingSystem">
<var>${file_path}</var>
<arg>${EXP_DIR}${host}</arg>
<arg>${export_file}</arg>
<doc>Joins the given path part(s) to the given base path.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.889994" elapsed="0.000020"/>
</kw>
<return>
<value>${file_path}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.890060" elapsed="0.000016"/>
</return>
<var>${file1}</var>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>config</arg>
<arg>*</arg>
<doc>Schedules a export with exclude option. Returns the file that has the excluded export.</doc>
<status status="FAIL" start="2026-04-22T02:07:37.886778" elapsed="0.003380">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Get File" owner="OperatingSystem">
<var>${lines1}</var>
<arg>${file1}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.890335" elapsed="0.000022"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${lines1}</arg>
<arg>{}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.890515" elapsed="0.000020"/>
</kw>
<kw name="Schedule Exclude Export" owner="DaeximKeywords">
<var>${file2}</var>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>operational</arg>
<arg>*</arg>
<doc>Schedules a export with exclude option. Returns the file that has the excluded export.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.890733" elapsed="0.000023"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<var>${lines2}</var>
<arg>${file2}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.890899" elapsed="0.000020"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${lines2}</arg>
<arg>{}</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:37.891050" elapsed="0.000020"/>
</kw>
<doc>schedule export with wildstar exclude option</doc>
<tag>wildcard exclude export</tag>
<status status="FAIL" start="2026-04-22T02:07:37.886229" elapsed="0.004966">Dictionary does not contain key '1'.</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-22T02:07:37.891803" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-22T02:07:37.891723" elapsed="0.000131"/>
</kw>
<doc>Test suite for verifying basic variations of export API including checking statuses</doc>
<status status="FAIL" start="2026-04-22T02:07:37.155452" elapsed="0.736436"/>
</suite>
<suite id="s1-s2" name="110-Cluster-Local-Export-Basic" source="/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/suites/daexim/110-cluster-local-export-basic.robot">
<kw name="ClusterManagement_Setup" owner="ClusterManagement" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.967897" 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-22T02:07:37.964160" elapsed="0.003768"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-22T02:07:37.968140" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:37.968017" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:37.967994" elapsed="0.000214"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.968693" 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-22T02:07:37.968355" elapsed="0.000382"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.969198" 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-22T02:07:37.968885" elapsed="0.000339"/>
</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-22T02:07:37.969712" elapsed="0.000282"/>
</kw>
<msg time="2026-04-22T02:07:37.970097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-22T02:07:37.970146" 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-22T02:07:37.969388" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.970808" 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-22T02:07:37.970430" elapsed="0.000404"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.971787" 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-22T02:07:37.971524" elapsed="0.000290"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.972204" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-22T02:07:37.971947" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.972678" 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-22T02:07:37.972386" elapsed="0.000320"/>
</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-22T02:07:37.975107" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:37.974933" elapsed="0.000297"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-22T02:07:37.972762" elapsed="0.002500"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.975785" 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-22T02:07:37.975427" elapsed="0.000402"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.976329" 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-22T02:07:37.975978" elapsed="0.000408"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.976879" 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-22T02:07:37.976535" elapsed="0.000387"/>
</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-22T02:07:37.971065" elapsed="0.005919"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-22T02:07:37.963814" elapsed="0.013234"/>
</kw>
<test id="s1-s2-t1" name="Create Basic Local Export" line="11">
<kw name="Mount Netconf Endpoint" owner="DaeximKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.978474" level="INFO">${ENDPOINT} = CONTROLLER1</msg>
<var>${ENDPOINT}</var>
<arg>${endpoint}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:37.978152" elapsed="0.000349"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:37.995825" elapsed="0.000432"/>
</kw>
<msg time="2026-04-22T02:07:37.996316" 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-22T02:07:37.995475" elapsed="0.000915"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to vanadium and return ../variables/daexim/scandium/netconf_mount.json if vanadium is at least ${lower_bound},
return ../variables/daexim/calcium/netconf_mount.json otherwise.</doc>
<status status="PASS" start="2026-04-22T02:07:37.995077" elapsed="0.001393"/>
</kw>
<msg time="2026-04-22T02:07:37.996515" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-22T02:07:37.986811" elapsed="0.009749"/>
</kw>
<msg time="2026-04-22T02:07:37.996675" level="INFO">${dictionary} = ../variables/daexim/scandium/netconf_mount.json</msg>
<var>${dictionary}</var>
<arg>${NETCONF_PAYLOAD_JSON_SCANDIUM}</arg>
<arg>${NETCONF_PAYLOAD_JSON_CALCIUM}</arg>
<doc>Compare scandium to vanadium and return ${value_if_true} if vanadium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-22T02:07:37.986447" elapsed="0.010253"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-22T02:07:37.997006" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/scandium/netconf_mount.json"&gt;/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/scandium/netconf_mount.json&lt;/a&gt;'.</msg>
<msg time="2026-04-22T02:07:37.997177" level="INFO">${json} = {
  "node": {
    "node-id": "${ENDPOINT}",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-passw...</msg>
<var>${json}</var>
<arg>/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/libraries/${dictionary}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-22T02:07:37.996850" elapsed="0.000353"/>
</kw>
<kw name="Replace Variables" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.997696" level="INFO">${json} = {
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-passw...</msg>
<var>${json}</var>
<arg>${json}</arg>
<doc>Replaces variables in the given text with their current values.</doc>
<status status="PASS" start="2026-04-22T02:07:37.997348" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:37.998111" level="INFO">{
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-password-unencrypted": {
            "username": "admin",
            "password": "admin"
        }
    }
  }
}
</msg>
<arg>${json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:37.997870" elapsed="0.000287"/>
</kw>
<kw name="Put_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.005094" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:38.004793" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:38.005171" elapsed="0.000033"/>
</return>
<msg time="2026-04-22T02:07:38.005327" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:38.004461" elapsed="0.000891"/>
</kw>
<kw name="Put_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.010707" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=CONTROLLER1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.010457" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.011181" level="INFO">{
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-password-unencrypted": {
            "username": "admin",
            "password": "admin"
        }
    }
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.010940" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.011630" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.011381" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.012064" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.011814" elapsed="0.000294"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:38.012894" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-22T02:07:38.012696" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-22T02:07:38.013232" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-22T02:07:38.013059" elapsed="0.000198"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-22T02:07:38.013404" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.013991" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.013747" elapsed="0.000288"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-22T02:07:38.014077" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.014247" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-22T02:07:38.012294" elapsed="0.001977"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:38.016611" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.016304" elapsed="0.000668">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:38.014344" elapsed="0.002710">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.017218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:38.017085" elapsed="0.000199"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:38.014325" elapsed="0.002982">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.017660" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.017787" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:38.017751" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-22T02:07:38.017734" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.017975" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.018040" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.007974" elapsed="0.010168">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.018223" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Put_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.005565" elapsed="0.012752">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.018391" elapsed="0.000016"/>
</return>
<var>${resp}</var>
<arg>${NETCONF_NODE_URL}=${endpoint}</arg>
<arg>${json}</arg>
<arg>${host_index}</arg>
<doc>Send a PUT with the supplied uri and data to member ${member_index}.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.003924" elapsed="0.014560">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.018636" elapsed="0.000021"/>
</kw>
<arg>${NETCONF_EP_NAME}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Mount a netconf endpoint</doc>
<status status="FAIL" start="2026-04-22T02:07:37.977787" elapsed="0.040950">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Cleanup Cluster Export Files" owner="DaeximKeywords">
<doc>This keyword cleansup export files of a cluster</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.018958" elapsed="0.000023"/>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<arg>500</arg>
<arg>${FALSE}</arg>
<arg>${EMPTY}</arg>
<arg>${EMPTY}</arg>
<arg>true</arg>
<doc>Schedule Export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.019221" elapsed="0.000023"/>
</kw>
<kw name="Verify Export Status" owner="DaeximKeywords">
<arg>${EXPORT_SCHEDULED_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.019496" elapsed="0.000024"/>
</kw>
<kw name="Verify Export Status" owner="DaeximKeywords">
<arg>${EXPORT_SKIPPED_STATUS}</arg>
<arg>${SECOND_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.019707" elapsed="0.000023"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10 sec</arg>
<arg>5 sec</arg>
<arg>DaeximKeywords.Verify Export Status</arg>
<arg>${EXPORT_COMPLETE_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.019870" elapsed="0.000021"/>
</kw>
<kw name="Verify Export Files" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Verify if the backedup files are present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.020285" elapsed="0.000024"/>
</kw>
<kw name="Verify Export Files Not Present" owner="DaeximKeywords">
<arg>${THIRD_CONTROLLER_INDEX}</arg>
<doc>Verify if the backedup files are not present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.020543" elapsed="0.000024"/>
</kw>
<kw name="Verify Export Files Not Present" owner="DaeximKeywords">
<arg>${SECOND_CONTROLLER_INDEX}</arg>
<doc>Verify if the backedup files are not present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.020781" elapsed="0.000023"/>
</kw>
<kw name="Verify Netconf Mount" owner="DaeximKeywords">
<arg>${NETCONF_EP_NAME}</arg>
<arg>${THIRD_CONTROLLER_INDEX}</arg>
<doc>Verify if a netconf endpoint is mounted</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.021012" elapsed="0.000023"/>
</kw>
<doc>schedule a basic export/backup on a cluster node, with controller mounting itself as a netconf device.Verifies if the export is limited to a local node.</doc>
<tag>create backup</tag>
<status status="FAIL" start="2026-04-22T02:07:37.977107" elapsed="0.044070">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-22T02:07:38.021712" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-22T02:07:38.021625" elapsed="0.000136"/>
</kw>
<doc>Test suite for verifying basic export only on a local node with a netconf mount on a cluster</doc>
<status status="FAIL" start="2026-04-22T02:07:37.892567" elapsed="0.129226"/>
</suite>
<suite id="s1-s3" name="120-Cluster-Export-Basic" source="/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/suites/daexim/120-cluster-export-basic.robot">
<kw name="ClusterManagement_Setup" owner="ClusterManagement" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.095970" 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-22T02:07:38.092334" elapsed="0.003664"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-22T02:07:38.096179" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:38.096075" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.096056" elapsed="0.000187"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.096702" 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-22T02:07:38.096394" elapsed="0.000350"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.097196" 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-22T02:07:38.096891" elapsed="0.000331"/>
</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-22T02:07:38.097709" elapsed="0.000278"/>
</kw>
<msg time="2026-04-22T02:07:38.098105" level="INFO">${status} = PASS</msg>
<msg time="2026-04-22T02:07:38.098153" 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-22T02:07:38.097385" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.098714" 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-22T02:07:38.098332" elapsed="0.000408"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.099669" 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-22T02:07:38.099407" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.100080" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-22T02:07:38.099827" elapsed="0.000278"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.100549" 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-22T02:07:38.100244" elapsed="0.000331"/>
</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-22T02:07:38.102987" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.102806" elapsed="0.000253"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.100633" elapsed="0.002455"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.103611" 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-22T02:07:38.103238" elapsed="0.000414"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.104141" 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-22T02:07:38.103798" elapsed="0.000384"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.104728" 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-22T02:07:38.104392" elapsed="0.000377"/>
</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-22T02:07:38.098962" elapsed="0.005865"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-22T02:07:38.092032" elapsed="0.012850"/>
</kw>
<test id="s1-s3-t1" name="Create Basic Export" line="11">
<kw name="Mount Netconf Endpoint" owner="DaeximKeywords">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.106230" level="INFO">${ENDPOINT} = CONTROLLER1</msg>
<var>${ENDPOINT}</var>
<arg>${endpoint}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:38.105909" elapsed="0.000347"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set_Variable_If_At_Least" owner="CompareStream">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Set Variable If" owner="BuiltIn">
<arg>${Stream_dict}[${ODL_STREAM}] &gt;= ${Stream_dict}[${lower_bound}]</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:38.123579" elapsed="0.000437"/>
</kw>
<msg time="2026-04-22T02:07:38.124068" 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-22T02:07:38.123218" elapsed="0.000906"/>
</kw>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Compare ${lower_bound} to vanadium and return ../variables/daexim/scandium/netconf_mount.json if vanadium is at least ${lower_bound},
return ../variables/daexim/calcium/netconf_mount.json otherwise.</doc>
<status status="PASS" start="2026-04-22T02:07:38.122850" elapsed="0.001348"/>
</kw>
<msg time="2026-04-22T02:07:38.124241" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Set_Variable_If_At_Least</arg>
<arg>scandium</arg>
<arg>${value_if_true}</arg>
<arg>${value_if_false}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-22T02:07:38.114613" elapsed="0.009669"/>
</kw>
<msg time="2026-04-22T02:07:38.124398" level="INFO">${dictionary} = ../variables/daexim/scandium/netconf_mount.json</msg>
<var>${dictionary}</var>
<arg>${NETCONF_PAYLOAD_JSON_SCANDIUM}</arg>
<arg>${NETCONF_PAYLOAD_JSON_CALCIUM}</arg>
<doc>Compare scandium to vanadium and return ${value_if_true} if vanadium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="PASS" start="2026-04-22T02:07:38.114222" elapsed="0.010201"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-22T02:07:38.124716" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/scandium/netconf_mount.json"&gt;/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/variables/daexim/scandium/netconf_mount.json&lt;/a&gt;'.</msg>
<msg time="2026-04-22T02:07:38.124867" level="INFO">${json} = {
  "node": {
    "node-id": "${ENDPOINT}",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-passw...</msg>
<var>${json}</var>
<arg>/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/libraries/${dictionary}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-22T02:07:38.124565" elapsed="0.000329"/>
</kw>
<kw name="Replace Variables" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.125398" level="INFO">${json} = {
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-passw...</msg>
<var>${json}</var>
<arg>${json}</arg>
<doc>Replaces variables in the given text with their current values.</doc>
<status status="PASS" start="2026-04-22T02:07:38.125032" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.125806" level="INFO">{
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-password-unencrypted": {
            "username": "admin",
            "password": "admin"
        }
    }
  }
}
</msg>
<arg>${json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.125566" elapsed="0.000286"/>
</kw>
<kw name="Put_As_Json_To_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.131346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-22T02:07:38.131032" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-22T02:07:38.131435" elapsed="0.000031"/>
</return>
<msg time="2026-04-22T02:07:38.131588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-22T02:07:38.130703" elapsed="0.000911"/>
</kw>
<kw name="Put_As_Json_To_Uri" owner="TemplatedRequests">
<kw name="Put_To_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.136964" level="INFO">/rests/data/network-topology:network-topology/topology=topology-netconf/node=CONTROLLER1</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.136718" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.137402" level="INFO">{
  "node": {
    "node-id": "CONTROLLER1",
    "netconf-node": {
        "host": "127.0.0.1",
        "port": "1830",
        "tcp-only": "false",
        "keepalive-delay": "0",
        "login-password-unencrypted": {
            "username": "admin",
            "password": "admin"
        }
    }
  }
}
</msg>
<arg>${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.137150" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.137829" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${content_type}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.137586" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.138259" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.138010" elapsed="0.000292"/>
</kw>
<kw name="Join_Two_Headers" owner="TemplatedRequests">
<kw name="Copy Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:38.139128" level="INFO">${accumulator} = {'Content-Type': 'application/json'}</msg>
<var>${accumulator}</var>
<arg>${first}</arg>
<doc>Returns a copy of the given dictionary.</doc>
<status status="PASS" start="2026-04-22T02:07:38.138930" elapsed="0.000225"/>
</kw>
<kw name="Get Dictionary Items" owner="Collections">
<msg time="2026-04-22T02:07:38.139489" level="INFO">${items_to_add} = []</msg>
<var>${items_to_add}</var>
<arg>${second}</arg>
<doc>Returns items of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-04-22T02:07:38.139292" elapsed="0.000223"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${accumulator}</arg>
<arg>@{items_to_add}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-22T02:07:38.139651" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.140256" level="INFO">{'Content-Type': 'application/json'}</msg>
<arg>${accumulator}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-22T02:07:38.140005" elapsed="0.000296"/>
</kw>
<return>
<value>${accumulator}</value>
<status status="PASS" start="2026-04-22T02:07:38.140344" elapsed="0.000044"/>
</return>
<msg time="2026-04-22T02:07:38.140685" level="INFO">${headers} = {'Content-Type': 'application/json'}</msg>
<var>${headers}</var>
<arg>first=${content_type}</arg>
<arg>second=${accept}</arg>
<doc>Take two dicts, join them, return result. Second argument values take precedence.</doc>
<status status="PASS" start="2026-04-22T02:07:38.138503" elapsed="0.002209"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="PUT On Session" owner="RequestsLibrary">
<msg time="2026-04-22T02:07:38.143087" level="FAIL">Non-existing index or alias 'ClusterManagement__session_1'.</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.142794" elapsed="0.000656">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<status status="FAIL" start="2026-04-22T02:07:38.140792" elapsed="0.002741">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</branch>
<branch type="ELSE">
<kw name="PUT On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>${uri}</arg>
<arg>data=${data}</arg>
<arg>headers=${headers}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a PUT request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.143697" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:38.143565" elapsed="0.000197"/>
</branch>
<status status="FAIL" start="2026-04-22T02:07:38.140773" elapsed="0.003012">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.144128" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.144254" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:38.144218" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-22T02:07:38.144201" elapsed="0.000115"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.144457" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.144524" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>content_type=${HEADERS_YANG_JSON}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>PUT data to given URI, check status code and return response text.
${content_type} and ${accept} are mandatory Python objects with headers to use.
If ${normalize_json}, normalize text before returning.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.134254" elapsed="0.010374">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.144699" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>data=${data}</arg>
<arg>session=${session}</arg>
<doc>Specify JSON headers and return Put_To_Uri normalized response text.
Yang json content type is used as a workaround to RequestsLibrary json conversion eagerness.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.131809" elapsed="0.012983">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.144851" elapsed="0.000015"/>
</return>
<var>${resp}</var>
<arg>${NETCONF_NODE_URL}=${endpoint}</arg>
<arg>${json}</arg>
<arg>${host_index}</arg>
<doc>Send a PUT with the supplied uri and data to member ${member_index}.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.130154" elapsed="0.014787">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${resp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.145093" elapsed="0.000020"/>
</kw>
<arg>${NETCONF_EP_NAME}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Mount a netconf endpoint</doc>
<status status="FAIL" start="2026-04-22T02:07:38.105544" elapsed="0.039649">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</kw>
<kw name="Cleanup Cluster Export Files" owner="DaeximKeywords">
<doc>This keyword cleansup export files of a cluster</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.145427" elapsed="0.000024"/>
</kw>
<kw name="Schedule Export" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Schedule Export job</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.145698" elapsed="0.000024"/>
</kw>
<kw name="Verify Export Status" owner="DaeximKeywords">
<arg>${EXPORT_SCHEDULED_STATUS}</arg>
<arg>${SECOND_CONTROLLER_INDEX}</arg>
<doc>Verify export status is as expected</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.145908" elapsed="0.000022"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>10 sec</arg>
<arg>5 sec</arg>
<arg>DaeximKeywords.Verify Export Status</arg>
<arg>${EXPORT_COMPLETE_STATUS}</arg>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.146082" elapsed="0.000021"/>
</kw>
<kw name="Verify Export Files" owner="DaeximKeywords">
<arg>${SECOND_CONTROLLER_INDEX}</arg>
<doc>Verify if the backedup files are present in the controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.146332" elapsed="0.000022"/>
</kw>
<kw name="Verify Netconf Mount" owner="DaeximKeywords">
<arg>${NETCONF_EP_NAME}</arg>
<arg>${THIRD_CONTROLLER_INDEX}</arg>
<doc>Verify if a netconf endpoint is mounted</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.146928" elapsed="0.000025"/>
</kw>
<doc>schedule a basic export/backup on a cluster, with controller mounting itself as a netconf device</doc>
<tag>create backup</tag>
<status status="FAIL" start="2026-04-22T02:07:38.104946" elapsed="0.042147">Non-existing index or alias 'ClusterManagement__session_1'.</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-22T02:07:38.147650" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-22T02:07:38.147562" elapsed="0.000138"/>
</kw>
<doc>Test suite for verifying basic export with a netconf mount on a cluster</doc>
<status status="FAIL" start="2026-04-22T02:07:38.022490" elapsed="0.125242"/>
</suite>
<suite id="s1-s4" name="130-Cluster-Import-Basic" source="/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/suites/daexim/130-cluster-import-basic.robot">
<kw name="ClusterManagement_Setup" owner="ClusterManagement" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.222415" 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-22T02:07:38.218771" elapsed="0.003675"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-22T02:07:38.222632" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:38.222525" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.222505" elapsed="0.000191"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.223143" 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-22T02:07:38.222834" elapsed="0.000351"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.223660" 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-22T02:07:38.223330" elapsed="0.000356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:38.224158" elapsed="0.000296"/>
</kw>
<msg time="2026-04-22T02:07:38.224555" level="INFO">${status} = PASS</msg>
<msg time="2026-04-22T02:07:38.224602" 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-22T02:07:38.223835" elapsed="0.000790"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.225157" 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-22T02:07:38.224788" elapsed="0.000394"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.226144" 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-22T02:07:38.225856" elapsed="0.000314"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.226573" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-22T02:07:38.226303" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.227023" 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-22T02:07:38.226738" 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-22T02:07:38.229452" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.229253" elapsed="0.000272"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.227103" elapsed="0.002452"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.230063" 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-22T02:07:38.229701" elapsed="0.000404"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.230614" 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-22T02:07:38.230251" elapsed="0.000404"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.231132" 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-22T02:07:38.230800" elapsed="0.000374"/>
</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-22T02:07:38.225423" elapsed="0.005809"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-22T02:07:38.218468" elapsed="0.012820"/>
</kw>
<test id="s1-s4-t1" name="Create Basic Import" line="11">
<kw name="Cleanup Cluster Export Files" owner="DaeximKeywords">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.234757" 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-22T02:07:38.234375" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.235221" 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-22T02:07:38.234933" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.235292" elapsed="0.000031"/>
</return>
<msg time="2026-04-22T02:07:38.235478" 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-22T02:07:38.234002" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Cleanup The Export Files" owner="DaeximKeywords">
<arg>${index}</arg>
<doc>Verify if the export directory exists and delete the files if needed</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.235919" elapsed="0.000025"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.235721" elapsed="0.000256"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.235600" elapsed="0.000405"/>
</for>
<doc>This keyword cleansup export files of a cluster</doc>
<status status="PASS" start="2026-04-22T02:07:38.231933" elapsed="0.004126"/>
</kw>
<kw name="Stop_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.241201" 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-22T02:07:38.240811" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.241680" 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-22T02:07:38.241389" elapsed="0.000318"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.241753" elapsed="0.000030"/>
</return>
<msg time="2026-04-22T02:07:38.241910" level="INFO">${stop_index_list} = []</msg>
<var>${stop_index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-22T02:07:38.240448" elapsed="0.001497"/>
</kw>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.242894" 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-22T02:07:38.242518" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.243354" 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-22T02:07:38.243065" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.243441" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.243595" level="INFO">${index_list} = []</msg>
<var>${index_list}</var>
<arg>given_list=${original_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-22T02:07:38.242141" elapsed="0.001480"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.245014" 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-22T02:07:38.244640" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.245487" 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-22T02:07:38.245185" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.245558" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.245712" 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-22T02:07:38.244271" elapsed="0.001466"/>
</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-22T02:07:38.246115" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.245905" elapsed="0.000272"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.245790" elapsed="0.000413"/>
</for>
<arg>command=${NODE_STOP_COMMAND}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-22T02:07:38.243809" elapsed="0.002447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.246905" level="INFO">${updated_index_list} = []</msg>
<var>${updated_index_list}</var>
<arg>@{index_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-22T02:07:38.246615" elapsed="0.000316"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${updated_index_list}</arg>
<arg>@{stop_index_list}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="PASS" start="2026-04-22T02:07:38.247068" elapsed="0.000217"/>
</kw>
<if>
<branch type="IF" condition="not ${confirm}">
<return>
<value>${updated_index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.247478" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-22T02:07:38.247357" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.247339" elapsed="0.000204"/>
</if>
<for flavor="IN">
<iter>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>${timeout}</arg>
<arg>2s</arg>
<arg>Verify_Karaf_Is_Not_Running_On_Member</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.247824" elapsed="0.000022"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.247698" elapsed="0.000188"/>
</iter>
<var>${index}</var>
<value>@{stop_index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.247582" elapsed="0.000330"/>
</for>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.250974" 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-22T02:07:38.250594" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.251492" 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-22T02:07:38.251183" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.251564" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.251719" 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-22T02:07:38.250219" elapsed="0.001525"/>
</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-22T02:07:38.252083" elapsed="0.000024"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.251921" elapsed="0.000223"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.251801" elapsed="0.000370"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-22T02:07:38.248092" elapsed="0.004134"/>
</kw>
<return>
<value>${updated_index_list}</value>
<status status="PASS" start="2026-04-22T02:07:38.252267" elapsed="0.000028"/>
</return>
<doc>If the list is empty, stops all ODL instances. Otherwise stop members based on ${stop_index_list}
If ${confirm} is True, verify stopped instances are not there anymore.
The KW will return a list of available members: ${updated index_list}=${original_index_list}-${member_index_list}</doc>
<status status="PASS" start="2026-04-22T02:07:38.236374" elapsed="0.016034"/>
</kw>
<kw name="Start_Members_From_List_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.264511" level="INFO">${base_command} = /tmp/karaf-0.24.0/bin/start</msg>
<var>${base_command}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/bin/start</arg>
<arg>${NODE_START_COMMAND}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:38.264028" elapsed="0.000512"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.265086" level="INFO">${command} = /tmp/karaf-0.24.0/bin/start</msg>
<var>${command}</var>
<arg>"""${export_java_home}""" != ""</arg>
<arg>export JAVA_HOME="${export_java_home}"; ${base_command}</arg>
<arg>${base_command}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:38.264719" elapsed="0.000394"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-22T02:07:38.265575" level="INFO">${epoch} = 1776823658.265493</msg>
<var>${epoch}</var>
<arg>time_zone=UTC</arg>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-04-22T02:07:38.265269" elapsed="0.000334"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.266206" level="INFO">${gc_filepath} = /tmp/karaf-0.24.0/data/log/gc_1776823658.265493.log</msg>
<var>${gc_filepath}</var>
<arg>"""${karaf_home}""" != ""</arg>
<arg>${karaf_home}/data/log/gc_${epoch}.log</arg>
<arg>${GC_LOG_PATH}/gc_${epoch}.log</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:38.265771" elapsed="0.000463"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.266865" level="INFO">${gc_options} = -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/tmp/karaf-0.24.0/data/log/gc_1776823658.265493.log</msg>
<var>${gc_options}</var>
<arg>"docker" not in """${node_start_command}"""</arg>
<arg>-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${gc_filepath}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-22T02:07:38.266429" elapsed="0.000463"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.268327" 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-22T02:07:38.267958" elapsed="0.000395"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.268809" 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-22T02:07:38.268513" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.268891" elapsed="0.000028"/>
</return>
<msg time="2026-04-22T02:07:38.269045" 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-22T02:07:38.267597" elapsed="0.001472"/>
</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-22T02:07:38.269425" elapsed="0.000033"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.269240" elapsed="0.000254"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.269120" elapsed="0.000399"/>
</for>
<arg>command=${command} ${gc_options}</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-22T02:07:38.267087" elapsed="0.002496"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify_Members_Are_Ready" owner="ClusterManagement">
<if>
<branch type="IF" condition="${verify_cluster_sync}">
<kw name="Check_Cluster_Is_In_Sync" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.280286" 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-22T02:07:38.279913" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.280758" 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-22T02:07:38.280473" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.280828" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.281020" 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-22T02:07:38.279566" elapsed="0.001479"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Sync_Status_Of_Member" owner="ClusterManagement">
<var>${status}</var>
<arg>member_index=${index}</arg>
<doc>Obtain IP, two GETs from jolokia URIs, return combined sync status as string.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.281482" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="'True' == '${status}'">
<continue>
<status status="NOT RUN" start="2026-04-22T02:07:38.281615" elapsed="0.000019"/>
</continue>
<status status="NOT RUN" start="2026-04-22T02:07:38.281575" elapsed="0.000085"/>
</branch>
<status status="NOT RUN" start="2026-04-22T02:07:38.281558" elapsed="0.000124"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Index ${index} has incorrect status: ${status}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.281809" elapsed="0.000021"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.281255" elapsed="0.000607"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.281096" elapsed="0.000791"/>
</for>
<arg>${member_index_list}</arg>
<doc>Fail if no-sync is detected on a member from list (or any).</doc>
<status status="PASS" start="2026-04-22T02:07:38.279181" elapsed="0.002773"/>
</kw>
<status status="PASS" start="2026-04-22T02:07:38.278896" elapsed="0.003089"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.278878" elapsed="0.003131"/>
</if>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Verify_Restconf_Is_Available" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.283601" 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-22T02:07:38.283034" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.284066" 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-22T02:07:38.283776" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.284138" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.284291" 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-22T02:07:38.282683" elapsed="0.001633"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<var>${session}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.284661" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.288395" elapsed="0.000026"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.284500" elapsed="0.003962"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.284381" elapsed="0.004108"/>
</for>
<arg>${member_index_list}</arg>
<status status="PASS" start="2026-04-22T02:07:38.282305" elapsed="0.006237"/>
</kw>
<status status="PASS" start="2026-04-22T02:07:38.282062" elapsed="0.006509"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.282047" elapsed="0.006547"/>
</if>
<if>
<branch type="IF" condition="${verify_system_status} and (&quot;${service_list}&quot; != &quot;[[]]&quot;)">
<kw name="Check Status Of Services Is OPERATIONAL" owner="ClusterManagement">
<arg>@{service_list}</arg>
<doc>This keyword will verify whether all the services are operational in all the ODL nodes</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.288956" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-22T02:07:38.288649" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-22T02:07:38.288633" elapsed="0.000404"/>
</if>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Verifies the specified readiness conditions for the given listed members after startup.
If ${verify_cluster_sync}, verifies the datastores have synced with the rest of the cluster.
If True, verifies RESTCONF is available.
If ${verify_system_status}, verifies the system services are OPERATIONAL.</doc>
<status status="PASS" start="2026-04-22T02:07:38.278489" elapsed="0.010594"/>
</kw>
<arg>${timeout}</arg>
<arg>10s</arg>
<arg>Verify_Members_Are_Ready</arg>
<arg>${member_index_list}</arg>
<arg>${wait_for_sync}</arg>
<arg>${verify_restconf}</arg>
<arg>${check_system_status}</arg>
<arg>${service_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-22T02:07:38.269726" elapsed="0.019414"/>
</kw>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement" type="TEARDOWN">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.292279" 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-22T02:07:38.291904" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.292749" 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-22T02:07:38.292465" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-22T02:07:38.292818" elapsed="0.000029"/>
</return>
<msg time="2026-04-22T02:07:38.292975" 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-22T02:07:38.291523" elapsed="0.001476"/>
</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-22T02:07:38.293314" elapsed="0.000069"/>
</kw>
<var name="${index}"/>
<status status="NOT RUN" start="2026-04-22T02:07:38.293159" elapsed="0.000265"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.293050" elapsed="0.000400"/>
</for>
<arg>command=netstat -pnatu | grep 2550</arg>
<doc>Cycle through indices (or all), run command on each.</doc>
<status status="PASS" start="2026-04-22T02:07:38.289407" elapsed="0.004096"/>
</kw>
<doc>If the list is empty, start all cluster members. Otherwise, start members based on present indices.
If ${wait_for_sync}, wait for cluster sync on listed members.
Optionally karaf_home can be overriden. Optionally specific JAVA_HOME is used for starting.
Garbage collection is unconditionally logged to files. TODO: Make that reasonable conditional?</doc>
<status status="PASS" start="2026-04-22T02:07:38.256655" elapsed="0.036896"/>
</kw>
<kw name="Copy Config Data To Controller" owner="DaeximKeywords">
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-22T02:07:38.294414" level="INFO">${host_index} = 1</msg>
<var>${host_index}</var>
<arg>${host_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-22T02:07:38.294082" elapsed="0.000359"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-22T02:07:38.295211" 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-22T02:07:38.294940" elapsed="0.000368">Dictionary does not contain key '1'.</status>
</kw>
<return>
<value>${ip_address}</value>
<status status="NOT RUN" start="2026-04-22T02:07:38.295383" elapsed="0.000018"/>
</return>
<var>${host}</var>
<arg>${host_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="FAIL" start="2026-04-22T02:07:38.294641" elapsed="0.000849">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Return ConnnectionID" owner="DaeximKeywords">
<var>${connections}</var>
<arg>${host}</arg>
<doc>Returns the connection of any host. Defaults to controller</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.295674" elapsed="0.000024"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<arg>${connections}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.295834" elapsed="0.000026"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<var>${dictionary}</var>
<arg>${DAEXIM_DATA_DIRECTORY_SCANDIUM}</arg>
<arg>${DAEXIM_DATA_DIRECTORY_CALCIUM}</arg>
<doc>Compare scandium to vanadium and return ${value_if_true} if vanadium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.303697" elapsed="0.000026"/>
</kw>
<kw name="Put Directory" owner="SSHLibrary">
<arg>/w/workspace/daexim-csit-3node-clustering-basic-only-vanadium/test/csit/libraries/${dictionary}</arg>
<arg>${WORKSPACE}/${BUNDLEFOLDER}/</arg>
<arg>mode=664</arg>
<doc>Uploads a directory, including its content, from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.303874" elapsed="0.000021"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.304028" elapsed="0.000019"/>
</kw>
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>This keyword copies the daexim folder under variables folder to the Controller</doc>
<status status="FAIL" start="2026-04-22T02:07:38.293757" elapsed="0.010373">Dictionary does not contain key '1'.</status>
</kw>
<kw name="Schedule Import" owner="DaeximKeywords">
<arg>${FIRST_CONTROLLER_INDEX}</arg>
<doc>Schedule an Import API</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.304407" elapsed="0.000024"/>
</kw>
<kw name="Sleep" owner="BuiltIn">
<arg>5 sec</arg>
<arg>Wait for completion of import processing</arg>
<doc>Pauses the test executed for the given time.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.304561" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>30 sec</arg>
<arg>5 sec</arg>
<arg>DaeximKeywords.Verify Netconf Mount</arg>
<arg>${NETCONF_EP_NAME}</arg>
<arg>${THIRD_CONTROLLER_INDEX}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-22T02:07:38.304719" elapsed="0.000020"/>
</kw>
<doc>schedule a basic import/restore with data containg controller mounting itself as a netconf device on a cluster</doc>
<tag>create restore</tag>
<status status="FAIL" start="2026-04-22T02:07:38.231341" elapsed="0.073536">Dictionary does not contain key '1'.</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-22T02:07:38.305350" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-22T02:07:38.305271" elapsed="0.000146"/>
</kw>
<doc>Test suite for verifying basic import on a cluster</doc>
<status status="FAIL" start="2026-04-22T02:07:38.148344" elapsed="0.157106"/>
</suite>
<status status="FAIL" start="2026-04-22T02:07:37.114977" elapsed="1.191162"/>
</suite>
<statistics>
<total>
<stat pass="2" fail="7" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="2" fail="1" skip="0">absolute time export</stat>
<stat pass="0" fail="1" skip="0">cancel export</stat>
<stat pass="0" fail="2" skip="0">create backup</stat>
<stat pass="0" fail="1" skip="0">create restore</stat>
<stat pass="0" fail="1" skip="0">exclude export</stat>
<stat pass="0" fail="1" skip="0">wildcard exclude export</stat>
</tag>
<suite>
<stat name="daexim-clustering-basic.txt" id="s1" pass="2" fail="7" skip="0">daexim-clustering-basic.txt</stat>
<stat name="010-Special-Export" id="s1-s1" pass="2" fail="4" skip="0">daexim-clustering-basic.txt.010-Special-Export</stat>
<stat name="110-Cluster-Local-Export-Basic" id="s1-s2" pass="0" fail="1" skip="0">daexim-clustering-basic.txt.110-Cluster-Local-Export-Basic</stat>
<stat name="120-Cluster-Export-Basic" id="s1-s3" pass="0" fail="1" skip="0">daexim-clustering-basic.txt.120-Cluster-Export-Basic</stat>
<stat name="130-Cluster-Import-Basic" id="s1-s4" pass="0" fail="1" skip="0">daexim-clustering-basic.txt.130-Cluster-Import-Basic</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
