<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.5 (Python 3.11.10 on linux)" generated="2026-09-22T14:06:16.214014" rpa="false" schemaversion="5">
<suite id="s1" name="netconf-callhome.txt" source="/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/suites/netconf/callhome">
<suite id="s1-s1" name="Callhome" source="/w/workspace/netconf-csit-1node-callhome-only-titanium/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-09-22T14:06:16.627568" 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-09-22T14:06:16.627169" elapsed="0.000438"/>
</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-09-22T14:06:16.629686" level="INFO">Length is 0.</msg>
<msg time="2026-09-22T14:06:16.629770" 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-09-22T14:06:16.629186" elapsed="0.000612"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-09-22T14:06:16.629958" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-09-22T14:06:16.631117" level="INFO">Logging into ':22' as 'jenkins'.</msg>
<msg time="2026-09-22T14:06:16.631661" 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-09-22T14:06:16.630851" elapsed="0.003946">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-09-22T14:06:16.634858" 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-09-22T14:06:16.630494" elapsed="0.004432"/>
</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-09-22T14:06:16.628761" elapsed="0.006288">OSError: [Errno 16] Device or resource busy</status>
</kw>
<msg time="2026-09-22T14:06:16.635095" 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-09-22T14:06:16.628294" elapsed="0.006844"/>
</kw>
<doc>Call Flexible SSH Login, but with default values suitable for Mininet machine.</doc>
<status status="FAIL" start="2026-09-22T14:06:16.627774" elapsed="0.007474">OSError: [Errno 16] Device or resource busy</status>
</kw>
<return>
<value>${tools_connection}</value>
<status status="NOT RUN" start="2026-09-22T14:06:16.635308" elapsed="0.000025"/>
</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-09-22T14:06:16.626739" elapsed="0.008674">OSError: [Errno 16] Device or resource busy</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${netopeer_conn_id}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.635600" elapsed="0.000021"/>
</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-09-22T14:06:16.635754" elapsed="0.000020"/>
</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-09-22T14:06:16.636388" elapsed="0.000022"/>
</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-09-22T14:06:16.636583" elapsed="0.000019"/>
</kw>
<doc>Install docker-compose on tools system.</doc>
<status status="FAIL" start="2026-09-22T14:06:16.625306" elapsed="0.011392">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-09-22T14:06:16.636847" elapsed="0.000023"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/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-09-22T14:06:16.637030" elapsed="0.000019"/>
</kw>
<kw name="Put File" owner="SSHLibrary">
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/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-09-22T14:06:16.637209" elapsed="0.000019"/>
</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-09-22T14:06:16.637383" elapsed="0.000018"/>
</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 titanium and return ${value_if_true} if titanium is at least sulfur, return ${value_if_false} otherwise.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.639540" elapsed="0.000025"/>
</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-09-22T14:06:16.639735" elapsed="0.000019"/>
</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-09-22T14:06:16.639919" 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 titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.642072" elapsed="0.000026"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.642299" elapsed="0.000020"/>
</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 titanium and return ${value_if_true} if titanium is at least scandium, return ${value_if_false} otherwise.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.644446" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${netconf_mount_expected_values}</var>
<arg>${substring1}</arg>
<arg>${substring2}</arg>
<arg>${substring3}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.644605" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${netconf_mount_expected_values}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.644791" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_GLOBAL_CREDENTIALS_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/create_global_credentials.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.644980" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_SSH_DEVICE_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/create_ssh_device.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.645178" elapsed="0.000019"/>
</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-titanium/test/csit/libraries/../variables/netconf/callhome/json/create_device_hostkey_only.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.645360" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${CREATE_TLS_DEVICE_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/create_tls_device.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.645539" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_KEYSTORE_ENTRY_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/add_keystore_entry.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.645716" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_PRIVATE_KEY_REQ}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/add_private_key.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.645891" elapsed="0.000028"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ADD_TRUSTED_CERTIFICATE}</arg>
<arg>/w/workspace/netconf-csit-1node-callhome-only-titanium/test/csit/libraries/../variables/netconf/callhome/json/add_trusted_certificate.json</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.646080" elapsed="0.000018"/>
</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-09-22T14:06:16.646271" elapsed="0.000019"/>
</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-09-22T14:06:16.646442" elapsed="0.000017"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${INCORRECT_PUB_KEY}</arg>
<arg>${incorrect_public_key}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-09-22T14:06:16.646623" elapsed="0.000018"/>
</kw>
<doc>Get the suite ready for callhome test cases.</doc>
<status status="FAIL" start="2026-09-22T14:06:16.624998" elapsed="0.021724">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-09-22T14:06:16.646795" elapsed="0.000560">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-09-22T14:06:16.647634" elapsed="0.000457">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-09-22T14:06:16.648363" elapsed="0.000544">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-09-22T14:06:16.649294" elapsed="0.000561">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-09-22T14:06:16.650195" elapsed="0.000583">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-09-22T14:06:16.651124" elapsed="0.000678">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-09-22T14:06:16.652098" elapsed="0.000543">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-09-22T14:06:16.654328" level="INFO">Executing command 'pip uninstall docker-compose'.</msg>
<msg time="2026-09-22T14:06:16.654477" level="INFO">${stdout} = None</msg>
<msg time="2026-09-22T14:06:16.654549" level="INFO">${stderr} = None</msg>
<msg time="2026-09-22T14:06:16.654590" level="INFO">${rc} = None</msg>
<msg time="2026-09-22T14:06:16.654629" 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-09-22T14:06:16.654080" elapsed="0.000884">Connection not open</status>
</kw>
<doc>Uninstall docker-compose on tools system</doc>
<status status="FAIL" start="2026-09-22T14:06:16.653779" elapsed="0.001308">Connection not open</status>
</kw>
<kw name="Delete All Sessions" owner="RequestsLibrary">
<msg time="2026-09-22T14:06:16.655304" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-09-22T14:06:16.655225" elapsed="0.000157"/>
</kw>
<kw name="Close All Connections" owner="SSHLibrary">
<doc>Closes all open connections.</doc>
<status status="PASS" start="2026-09-22T14:06:16.655551" elapsed="0.000099"/>
</kw>
<doc>Tearing down the setup.</doc>
<status status="FAIL" start="2026-09-22T14:06:16.653501" elapsed="0.002242">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-09-22T14:06:16.253424" elapsed="0.402376">Suite setup failed:
OSError: [Errno 16] Device or resource busy

Also suite teardown failed:
Connection not open</status>
</suite>
<status status="FAIL" start="2026-09-22T14:06:16.215544" elapsed="0.441517"/>
</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>
