<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-05T00:27:01.493408" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-callhome.txt" source="/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/suites/netconf/callhome">
<suite id="s1-s1" name="Callhome" source="/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/suites/netconf/callhome/callhome.robot">
<kw name="Suite Setup" owner="NetconfCallHome" type="SETUP">
<kw name="Install Docker Compose on tools system" owner="NetconfCallHome">
<kw name="Open_Connection_To_Tools_System" owner="SSHKeywords">
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-05T00:27:01.986155" level="INFO">${tools_connection} = 1</msg>
<var>${tools_connection}</var>
<arg>${ip_address}</arg>
<arg>prompt=${prompt}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-05T00:27:01.985675" elapsed="0.000519"/>
</kw>
<kw name="Flexible_Mininet_Login" owner="SSHKeywords">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-05T00:27:01.988284" level="INFO">Length is 0.</msg>
<msg time="2026-04-05T00:27:01.988374" level="INFO">${pwd_length} = 0</msg>
<var>${pwd_length}</var>
<arg>${password}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-04-05T00:27:01.987874" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-05T00:27:01.988556" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-05T00:27:01.989937" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-04-05T00:27:01.990468" level="FAIL">OSError: [Errno 16] Device or resource busy</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.989454" elapsed="0.003893">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-05T00:27:01.993413" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.989112" elapsed="0.004367"/>
</kw>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.987394" elapsed="0.006213">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-04-05T00:27:01.993658" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Flexible SSH Login</arg>
<arg>user=${user}</arg>
<arg>password=${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.986935" elapsed="0.006770"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.986376" elapsed="0.007451">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${tools_connection}</value>
<status status="NOT RUN" start="2026-04-05T00:27:01.993894" elapsed="0.000027"/>
</return>
<var>${netopeer_conn_id}</var>
<doc>Open a connection to the tools system at ${ip_address} and return its identifier.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.985249" elapsed="0.008761">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${netopeer_conn_id}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.994167" elapsed="0.000023"/>
</kw>
<kw name="Write" owner="SSHLibrary">
<arg>sudo curl -L "https://github.com/docker/compose/releases/download/1.11.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.994318" elapsed="0.000021"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<var>${output}</var>
<arg>30s</arg>
<arg>2s</arg>
<arg>SSHLibrary.Read_Until_Prompt</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.994920" elapsed="0.000027"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>sudo chmod +x /usr/local/bin/docker-compose</arg>
<arg>return_stdout=True</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.995090" elapsed="0.000021"/>
</kw>
<doc>Install docker-compose on tools system.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.981682" elapsed="0.013535">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Pull Netopeer2 Docker Image" owner="NetconfCallHome">
<doc>Pulls the netopeer image from the docker repository.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.995385" elapsed="0.000025"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/docker-compose.yaml</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.995530" elapsed="0.000020"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/init_configuration.sh</arg>
<arg>.</arg>
<doc>Uploads file(s) from the local machine to the remote machine.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.995670" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sed -i -e 's/ODL_SYSTEM_IP/${ODL_SYSTEM_IP}/g' docker-compose.yaml</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:01.995834" elapsed="0.000021"/>
</kw>
<kw name="Set_Variable_If_At_Least_Sulfur" owner="CompareStream">
<var>${netconf_cl_ssh_port}</var>
<arg>4334</arg>
<arg>6666</arg>
<doc>Compare sulfur to vanadium and return ${value_if_true} if vanadium is at least sulfur, return ${value_if_false} otherwise.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.002358" elapsed="0.000027"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sed -i -e 's/NETCONF_CH_SSH/${netconf_cl_ssh_port}/g' docker-compose.yaml</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.002521" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>sed -i -e 's/NETCONF_CH_TLS/4335/g' docker-compose.yaml</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.002664" elapsed="0.000020"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<var>${substring1}</var>
<arg>"connection-status":"connected"</arg>
<arg>"netconf-node-topology:connection-status":"connected"</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-05T00:27:02.009178" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${substring2}</var>
<arg>"node-id":"netopeer2"</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.009398" elapsed="0.000022"/>
</kw>
<kw name="Set_Variable_If_At_Least_Scandium" owner="CompareStream">
<var>${substring3}</var>
<arg>"available-capabilities"</arg>
<arg>"netconf-node-topology:available-capabilities"</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-05T00:27:02.015873" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${netconf_mount_expected_values}</var>
<arg>${substring1}</arg>
<arg>${substring2}</arg>
<arg>${substring3}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016044" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${netconf_mount_expected_values}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016218" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_GLOBAL_CREDENTIALS_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/create_global_credentials.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016377" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_SSH_DEVICE_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/create_ssh_device.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016536" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_SSH_DEVICE_REQ_HOST_KEY_ONLY}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/create_device_hostkey_only.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016694" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_TLS_DEVICE_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/create_tls_device.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.016867" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_KEYSTORE_ENTRY_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/add_keystore_entry.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017026" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_PRIVATE_KEY_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/add_private_key.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017207" elapsed="0.000026"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_TRUSTED_CERTIFICATE}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-vanadium/test/csit/libraries/../variables/netconf/callhome/json/add_trusted_certificate.json</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017372" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<arg>ssh-keygen -q -t rsa -b 2048 -N '' -m pem -f ./incorrect_ssh_host_rsa_key</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017522" elapsed="0.000020"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<var>${incorrect_public_key}</var>
<arg>awk '{print $2}' incorrect_ssh_host_rsa_key.pub</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017663" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${INCORRECT_PUB_KEY}</arg>
<arg>${incorrect_public_key}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-05T00:27:02.017836" elapsed="0.000021"/>
</kw>
<doc>Get the suite ready for callhome test cases.</doc>
<status status="FAIL" start="2026-04-05T00:27:01.981377" elapsed="0.036571">OSError: [Errno 16] Device or resource busy</status>
</kw>
<test id="s1-s1-t1" name="CallHome over SSH with correct device credentials" line="17">
<doc>Correct credentials should result to successful mount. CONNECTED should be the device status.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.018019" elapsed="0.000593">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t2" name="CallHome over SSH with incorrect device credentials" line="34">
<doc>Correct credentials should result to successful mount. CONNECTED should be the device status.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.018923" elapsed="0.000533">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t3" name="CallHome over SSH with correct global credentials" line="53">
<doc>CallHome SSH device registered with global credentials should result to successful mount.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.019822" elapsed="0.000707">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t4" name="CallHome over SSH with incorrect global credentials" line="71">
<doc>CallHome SSH device registered with wrong global credentials should fail to mount.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.020960" elapsed="0.000588">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t5" name="CallHome with Incorrect Node-id" line="91">
<doc>CallHome from device that does not have an entry in per-device credential with result to mount point failure.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.021881" elapsed="0.000558">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t6" name="CallHome with Rogue Devices" line="111">
<doc>A Rogue Device will fail to callhome and wont be able to mount because the keys are not added in whitelist.
FAILED_NOT_ALLOWED should be the device status.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.022615" elapsed="0.000611">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<test id="s1-s1-t7" name="CallHome over TLS with correct certificate and key" line="131">
<doc>Using correct certificate and key pair should result to successful mount. CONNECTED should be the device status.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.023490" elapsed="0.000558">Parent suite setup failed:
OSError: [Errno 16] Device or resource busy</status>
</test>
<kw name="Suite Teardown" owner="NetconfCallHome" type="TEARDOWN">
<kw name="Uninstall Docker Compose on tools system" owner="NetconfCallHome">
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-05T00:27:02.025472" level="INFO">Executing command 'pip uninstall docker-compose'.</msg>
<msg time="2026-04-05T00:27:02.025629" level="INFO">${stdout} = None</msg>
<msg time="2026-04-05T00:27:02.025710" level="INFO">${stderr} = None</msg>
<msg time="2026-04-05T00:27:02.025757" level="INFO">${rc} = None</msg>
<msg time="2026-04-05T00:27:02.025818" level="FAIL">Connection not open</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<var>${rc}</var>
<arg>pip uninstall docker-compose</arg>
<arg>return_stdout=True</arg>
<arg>return_stderr=True</arg>
<arg>return_rc=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.025247" elapsed="0.001102">Connection not open</status>
</kw>
<doc>Uninstall docker-compose on tools system</doc>
<status status="FAIL" start="2026-04-05T00:27:02.024916" elapsed="0.001572">Connection not open</status>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-04-05T00:27:02.026705" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-05T00:27:02.026620" elapsed="0.000138"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-04-05T00:27:02.026897" elapsed="0.000105"/>
</kw>
<doc>Tearing down the setup.</doc>
<status status="FAIL" start="2026-04-05T00:27:02.024677" elapsed="0.002424">Connection not open</status>
</kw>
<doc>Test suite to verify callhome functionality over SSH transport protocol. Registration in OpenDaylight
Controller happens via restconf interface. Netopeer2-server docker container plays a role of the
netconf device with call-home feature. Docker-compose file is used to configure netopeer2 docker
container(netconf configuration templates, host-key).</doc>
<status status="FAIL" start="2026-04-05T00:27:01.533905" elapsed="0.493256">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Connection not open</status>
</suite>
<status status="FAIL" start="2026-04-05T00:27:01.494916" elapsed="0.533415"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="7" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="netconf-callhome.txt" id="s1" pass="0" fail="7" skip="0">netconf-callhome.txt</stat>
<stat name="Callhome" id="s1-s1" pass="0" fail="7" skip="0">netconf-callhome.txt.Callhome</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
