X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Ftests%2Funit%2Ftest_libjuju.py;h=c5f80cf75b138b429ac7f6efc76e156ba9dc05ef;hp=fde6817a1441c8ad89388685c9bc844d3a61569e;hb=60a3a96717d7c36ba7a65573da59a6bc039f5e28;hpb=eb8943a887e2fb8cce0240382811f9e504f3c7fb diff --git a/n2vc/tests/unit/test_libjuju.py b/n2vc/tests/unit/test_libjuju.py index fde6817..c5f80cf 100644 --- a/n2vc/tests/unit/test_libjuju.py +++ b/n2vc/tests/unit/test_libjuju.py @@ -20,7 +20,12 @@ import juju import kubernetes from juju.errors import JujuAPIError import logging -from .utils import FakeMachine, FakeApplication +from .utils import ( + FakeApplication, + FakeMachine, + FakeManualMachine, + FakeUnit, +) from n2vc.libjuju import Libjuju from n2vc.exceptions import ( JujuControllerFailedConnecting, @@ -53,7 +58,7 @@ class LibjujuTestCase(asynctest.TestCase): self.loop = asyncio.get_event_loop() self.db = Mock() mock_base64_to_cacert.return_value = cacert - Connection._load_vca_connection_data = Mock() + # Connection._load_vca_connection_data = Mock() vca_connection = Connection(AsyncMock()) vca_connection._data = ConnectionData( **{ @@ -103,7 +108,7 @@ class GetControllerTest(LibjujuTestCase): with self.assertRaises(JujuControllerFailedConnecting): controller = self.loop.run_until_complete(self.libjuju.get_controller()) self.assertIsNone(controller) - mock_disconnect_controller.assert_called_once() + mock_disconnect_controller.assert_called() def test_same_endpoint_get_controller(self, mock_api_endpoints, mock_connect): self.libjuju.endpoints = ["127.0.0.1:17070"] @@ -228,8 +233,14 @@ class GetExecutedActionsTest(LibjujuTestCase): executed_actions = self.loop.run_until_complete( self.libjuju.get_executed_actions("model") ) - expected_result = [{'id': 'id', 'action': 'action_name', - 'status': 'status', 'output': 'completed'}] + expected_result = [ + { + "id": "id", + "action": "action_name", + "status": "status", + "output": "completed", + } + ] self.assertListEqual(expected_result, executed_actions) self.assertIsInstance(executed_actions, list) @@ -259,7 +270,8 @@ class GetApplicationConfigsTest(LibjujuTestCase): mock_get_model.return_value = None with self.assertRaises(JujuError): self.loop.run_until_complete( - self.libjuju.get_application_configs("model", "app")) + self.libjuju.get_application_configs("model", "app") + ) mock_get_controller.assert_called_once() mock_disconnect_controller.assert_called_once() @@ -275,8 +287,9 @@ class GetApplicationConfigsTest(LibjujuTestCase): mock_get_controller, ): mock_get_application.return_value = FakeApplication() - application_configs = self.loop.run_until_complete(self.libjuju - .get_application_configs("model", "app")) + application_configs = self.loop.run_until_complete( + self.libjuju.get_application_configs("model", "app") + ) self.assertEqual(application_configs, ["app_config"]) @@ -763,7 +776,6 @@ class ExecuteActionTest(LibjujuTestCase): mock_get_model, mock_get_controller, ): - mock_get_model.return_value = juju.model.Model() mock__get_application.return_value = FakeApplication() output = None @@ -816,7 +828,7 @@ class ExecuteActionTest(LibjujuTestCase): mock_disconnect_controller.assert_called() mock_disconnect_model.assert_called() - def test_succesful_exec( + def test_successful_exec( self, mock_get_action_status, mock_get_action_output, @@ -1102,12 +1114,12 @@ class DestroyApplicationTest(LibjujuTestCase): super(DestroyApplicationTest, self).setUp() def test_success( - self, - mock_get_controller, - mock_get_model, - mock_disconnect_controller, - mock_get_application, - mock_disconnect_model, + self, + mock_get_controller, + mock_get_model, + mock_disconnect_controller, + mock_get_application, + mock_disconnect_model, ): mock_get_application.return_value = FakeApplication() mock_get_model.return_value = None @@ -1123,12 +1135,12 @@ class DestroyApplicationTest(LibjujuTestCase): mock_disconnect_model.assert_called_once() def test_no_application( - self, - mock_get_controller, - mock_get_model, - mock_disconnect_controller, - mock_get_application, - mock_disconnect_model, + self, + mock_get_controller, + mock_get_model, + mock_disconnect_controller, + mock_get_application, + mock_disconnect_model, ): mock_get_model.return_value = None mock_get_application.return_value = None @@ -1143,12 +1155,12 @@ class DestroyApplicationTest(LibjujuTestCase): mock_get_application.assert_called() def test_exception( - self, - mock_get_controller, - mock_get_model, - mock_disconnect_controller, - mock_get_application, - mock_disconnect_model, + self, + mock_get_controller, + mock_get_model, + mock_disconnect_controller, + mock_get_application, + mock_disconnect_model, ): mock_get_application.return_value = FakeApplication mock_get_model.return_value = None @@ -1214,7 +1226,6 @@ class ConfigureApplicationTest(LibjujuTestCase): mock_get_model, mock_get_controller, ): - mock_get_application.return_value = FakeApplication() self.loop.run_until_complete( @@ -1236,7 +1247,6 @@ class ConfigureApplicationTest(LibjujuTestCase): mock_get_model, mock_get_controller, ): - mock_get_application.side_effect = Exception() with self.assertRaises(Exception): @@ -1258,7 +1268,6 @@ class ConfigureApplicationTest(LibjujuTestCase): mock_get_model, mock_get_controller, ): - result = {"error": "not found", "response": "response", "request-id": 1} mock_get_controller.side_effect = JujuAPIError(result) @@ -1283,7 +1292,6 @@ class ConfigureApplicationTest(LibjujuTestCase): mock_get_model, mock_get_controller, ): - result = {"error": "not found", "response": "response", "request-id": 1} mock_get_model.side_effect = JujuAPIError(result) @@ -1887,3 +1895,375 @@ class GetK8sCloudCredentials(LibjujuTestCase): "Cannot set both token and user/pass", ) self.assertTrue(exception_raised) + + +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_application") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_controller") +@asynctest.mock.patch("n2vc.juju_watcher.JujuModelWatcher.wait_for_model") +class ScaleApplicationTest(LibjujuTestCase): + def setUp(self): + super(ScaleApplicationTest, self).setUp() + + @asynctest.mock.patch("asyncio.sleep") + def test_scale_application( + self, + mock_sleep, + mock_wait_for_model, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_application, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + self.loop.run_until_complete(self.libjuju.scale_application("model", "app", 2)) + mock_wait_for_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_application( + self, + mock_wait_for, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_application, + mock_get_model, + mock_get_controller, + ): + mock_get_application.return_value = None + mock_get_model.return_value = juju.model.Model() + with self.assertRaises(JujuApplicationNotFound): + self.loop.run_until_complete( + self.libjuju.scale_application("model", "app", 2) + ) + mock_disconnect_controller.assert_called() + mock_disconnect_model.assert_called() + + def test_exception( + self, + mock_wait_for, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_application, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = None + mock_get_application.return_value = FakeApplication() + with self.assertRaises(Exception): + self.loop.run_until_complete( + self.libjuju.scale_application("model", "app", 2, total_timeout=0) + ) + mock_disconnect_controller.assert_called_once() + + +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_application") +class GetUnitNumberTest(LibjujuTestCase): + def setUp(self): + super(GetUnitNumberTest, self).setUp() + + def test_successful_get_unit_number( + self, + mock_get_applications, + ): + mock_get_applications.return_value = FakeApplication() + model = juju.model.Model() + result = self.libjuju._get_application_count(model, "app") + self.assertEqual(result, 2) + + def test_non_existing_application( + self, + mock_get_applications, + ): + mock_get_applications.return_value = None + model = juju.model.Model() + result = self.libjuju._get_application_count(model, "app") + self.assertEqual(result, None) + + +@asynctest.mock.patch("juju.model.Model.machines", new_callable=asynctest.PropertyMock) +class GetMachineInfoTest(LibjujuTestCase): + def setUp(self): + super(GetMachineInfoTest, self).setUp() + + def test_successful( + self, + mock_machines, + ): + machine_id = "existing_machine" + model = juju.model.Model() + mock_machines.return_value = {"existing_machine": FakeManualMachine()} + machine, series = self.libjuju._get_machine_info( + machine_id=machine_id, + model=model, + ) + self.assertIsNotNone(machine, series) + + def test_exception( + self, + mock_machines, + ): + machine_id = "not_existing_machine" + machine = series = None + model = juju.model.Model() + mock_machines.return_value = {"existing_machine": FakeManualMachine()} + with self.assertRaises(JujuMachineNotFound): + machine, series = self.libjuju._get_machine_info( + machine_id=machine_id, + model=model, + ) + self.assertIsNone(machine, series) + + +class GetUnitTest(LibjujuTestCase): + def setUp(self): + super(GetUnitTest, self).setUp() + + def test_successful(self): + result = self.libjuju._get_unit(FakeApplication(), "existing_machine_id") + self.assertIsInstance(result, FakeUnit) + + def test_return_none(self): + result = self.libjuju._get_unit(FakeApplication(), "not_existing_machine_id") + self.assertIsNone(result) + + +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_application") +class CheckApplicationExists(LibjujuTestCase): + def setUp(self): + super(CheckApplicationExists, self).setUp() + + def test_successful( + self, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + result = self.loop.run_until_complete( + self.libjuju.check_application_exists( + "model", + "app", + ) + ) + self.assertEqual(result, True) + + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_application( + self, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = None + result = self.loop.run_until_complete( + self.libjuju.check_application_exists( + "model", + "app", + ) + ) + self.assertEqual(result, False) + + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_application") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_machine_info") +class AddUnitTest(LibjujuTestCase): + def setUp(self): + super(AddUnitTest, self).setUp() + + @asynctest.mock.patch("n2vc.juju_watcher.JujuModelWatcher.wait_for") + @asynctest.mock.patch("asyncio.sleep") + def test_successful( + self, + mock_sleep, + mock_wait_for, + mock_get_machine_info, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + mock_get_machine_info.return_value = FakeMachine(), "series" + self.loop.run_until_complete( + self.libjuju.add_unit( + "existing_app", + "model", + "machine", + ) + ) + + mock_wait_for.assert_called_once() + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_app( + self, + mock_get_machine_info, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = None + with self.assertRaises(JujuApplicationNotFound): + self.loop.run_until_complete( + self.libjuju.add_unit( + "existing_app", + "model", + "machine", + ) + ) + + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_machine( + self, + mock_get_machine_info, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + mock_get_machine_info.side_effect = JujuMachineNotFound() + with self.assertRaises(JujuMachineNotFound): + self.loop.run_until_complete( + self.libjuju.add_unit( + "existing_app", + "model", + "machine", + ) + ) + + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.get_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_model") +@asynctest.mock.patch("n2vc.libjuju.Libjuju.disconnect_controller") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_application") +@asynctest.mock.patch("n2vc.libjuju.Libjuju._get_unit") +class DestroyUnitTest(LibjujuTestCase): + def setUp(self): + super(DestroyUnitTest, self).setUp() + + @asynctest.mock.patch("asyncio.sleep") + def test_successful( + self, + mock_sleep, + mock_get_unit, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + + self.loop.run_until_complete( + self.libjuju.destroy_unit("app", "model", "machine", 0) + ) + + mock_get_unit.assert_called() + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_app( + self, + mock_get_unit, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = None + + with self.assertRaises(JujuApplicationNotFound): + self.loop.run_until_complete( + self.libjuju.destroy_unit("app", "model", "machine") + ) + + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once() + + def test_no_unit( + self, + mock_get_unit, + mock_get_application, + mock_disconnect_controller, + mock_disconnect_model, + mock_get_model, + mock_get_controller, + ): + mock_get_model.return_value = juju.model.Model() + mock_get_application.return_value = FakeApplication() + mock_get_unit.return_value = None + + with self.assertRaises(JujuError): + self.loop.run_until_complete( + self.libjuju.destroy_unit("app", "model", "machine") + ) + + mock_get_unit.assert_called_once() + mock_get_application.assert_called_once() + mock_get_controller.assert_called_once() + mock_get_model.assert_called_once() + mock_disconnect_controller.assert_called_once() + mock_disconnect_model.assert_called_once()