# Copyright (c) 2023 Canonical Ltd., Chi Wai Chan # This file is part of the sos project: https://github.com/sosreport/sos # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # version 2 of the GNU General Public License. # # See the LICENSE file in the source distribution for further information. import subprocess import unittest from unittest.mock import patch from sos.collector.exceptions import JujuNotInstalledException from sos.collector.transports.juju import JujuSSH class MockCmdLineOpts(object): ssh_user = "user_abc" sudo_pw = "pw_abc" root_password = "root_pw_abc" class JujuSSHTest(unittest.TestCase): def setUp(self): self.juju_ssh = JujuSSH( commons={ "cmdlineopts": MockCmdLineOpts, "tmpdir": "/tmp/sos-juju/", "need_sudo": False, }, address="model_abc:unit_abc", ) @patch("sos.collector.transports.juju.subprocess.check_output") def test_check_juju_installed_err(self, mock_subprocess_check_output): """Raise error if juju is not installed.""" mock_subprocess_check_output.side_effect = ( subprocess.CalledProcessError(returncode="127", cmd="cmd_abc") ) with self.assertRaises(JujuNotInstalledException): self.juju_ssh._check_juju_installed() @patch("sos.collector.transports.juju.subprocess.check_output") def test_check_juju_installed_true(self, mock_subprocess_check_output): """Return True if juju is installed.""" result = self.juju_ssh._check_juju_installed() assert result @patch("sos.collector.transports.juju.subprocess.check_output") def test_chmod(self, mock_subprocess_check_output): self.juju_ssh._chmod(fname="file_abc") mock_subprocess_check_output.assert_called_with( f"{self.juju_ssh.remote_exec} sudo chmod o+r file_abc", stderr=subprocess.STDOUT, shell=True, ) @patch( "sos.collector.transports.juju.JujuSSH._check_juju_installed", return_value=True, ) def test_connect(self, mock_result): self.juju_ssh.connect(password=None) assert self.juju_ssh.connected def test_remote_exec(self): assert ( self.juju_ssh.remote_exec == "juju ssh -m model_abc unit_abc" ) @patch( "sos.collector.transports.juju.sos_get_command_output", return_value={"status": 0}, ) @patch("sos.collector.transports.juju.JujuSSH._chmod", return_value=True) def test_retrieve_file(self, mock_chmod, mock_sos_get_cmd_output): self.juju_ssh._retrieve_file(fname="file_abc", dest="/tmp/sos-juju/") mock_sos_get_cmd_output.assert_called_with( "juju scp -m model_abc -- -r unit_abc:file_abc /tmp/sos-juju/" ) # vim: set et ts=4 sw=4 :