diff --git a/unit_tests/utilitites/test_zaza_utilitites_local_utils.py b/unit_tests/utilitites/test_zaza_utilitites_local_utils.py index 0667676..8d91849 100644 --- a/unit_tests/utilitites/test_zaza_utilitites_local_utils.py +++ b/unit_tests/utilitites/test_zaza_utilitites_local_utils.py @@ -8,6 +8,30 @@ class TestLocalUtils(ut_utils.BaseTestCase): def setUp(self): super(TestLocalUtils, self).setUp() + # Juju Status Object and data + self.key = "instance-id" + self.key_data = "machine-uuid" + self.machine = "1" + self.machine_data = {self.key: self.key_data} + self.unit = "app/1" + self.unit_data = {"machine": self.machine} + self.application = "app" + self.application_data = {"units": {self.unit: self.unit_data}} + self.subordinate_application = "subordinate_application" + self.subordinate_application_data = { + "subordinate-to": [self.application]} + self.juju_status = mock.MagicMock() + self.juju_status.name = "juju_status_object" + self.juju_status.applications.get.return_value = self.application_data + self.juju_status.machines.get.return_value = self.machine_data + + # Model + self.patch_object(_local_utils, "model") + self.patch_object(_local_utils.lifecycle_utils, "get_juju_model") + self.model_name = "model-name" + self.get_juju_model.return_value = self.model_name + self.model.get_status.return_value = self.juju_status + def test_get_yaml_config(self): self.patch("builtins.open", new_callable=mock.mock_open(), @@ -87,3 +111,75 @@ class TestLocalUtils(ut_utils.BaseTestCase): _local_utils.get_network_config(net_topology), _data[net_topology]) self.get_undercloud_env_vars.assert_called_once_with() + + def test_get_full_juju_status(self): + self.assertEqual(_local_utils.get_full_juju_status(), self.juju_status) + self.model.get_status.assert_called_once_with(self.model_name) + + def test_get_application_status(self): + self.patch_object(_local_utils, "get_full_juju_status") + self.get_full_juju_status.return_value = self.juju_status + + # Full status juju object return + self.assertEqual( + _local_utils.get_application_status(), self.juju_status) + self.get_full_juju_status.assert_called_once() + + # Application only dictionary return + self.assertEqual( + _local_utils.get_application_status(application=self.application), + self.application_data) + + # Unit no application dictionary return + self.assertEqual( + _local_utils.get_application_status(unit=self.unit), + self.unit_data) + + def test_get_machine_status(self): + self.patch_object(_local_utils, "get_full_juju_status") + self.get_full_juju_status.return_value = self.juju_status + + # All machine data + self.assertEqual( + _local_utils.get_machine_status(self.machine), + self.machine_data) + self.get_full_juju_status.assert_called_once() + + # Request a specific key + self.assertEqual( + _local_utils.get_machine_status(self.machine, self.key), + self.key_data) + + def test_get_machines_for_application(self): + self.patch_object(_local_utils, "get_application_status") + self.get_application_status.return_value = self.application_data + + # Machine data + self.assertEqual( + _local_utils.get_machines_for_application(self.application), + [self.machine]) + self.get_application_status.assert_called_once() + + # Subordinate application has no units + def _get_application_status(application): + _apps = { + self.application: self.application_data, + self.subordinate_application: + self.subordinate_application_data} + return _apps[application] + self.get_application_status.side_effect = _get_application_status + + self.assertEqual( + _local_utils.get_machines_for_application( + self.subordinate_application), + [self.machine]) + + def test_get_machine_uuids_for_application(self): + self.patch_object(_local_utils, "get_machines_for_application") + self.get_machines_for_application.return_value = [self.machine] + + self.assertEqual( + _local_utils.get_machine_uuids_for_application(self.application), + [self.machine_data.get("instance-id")]) + self.get_machines_for_application.assert_called_once_with( + self.application) diff --git a/zaza/utilities/_local_utils.py b/zaza/utilities/_local_utils.py index ace6991..493be55 100644 --- a/zaza/utilities/_local_utils.py +++ b/zaza/utilities/_local_utils.py @@ -290,10 +290,14 @@ def get_application_status(application=None, unit=None): """ status = get_full_juju_status() + + if unit and not application: + application = unit.split("/")[0] + if application: status = status.applications.get(application) if unit: - status = status.units.get(unit) + status = status.get('units').get(unit) return status @@ -325,6 +329,12 @@ def get_machines_for_application(application): """ status = get_application_status(application) + + # libjuju juju status no longer has units for subordinate charms + # Use the application it is subordinate-to to find machines + if status.get('units') is None and status.get('subordinate-to'): + return get_machines_for_application(status.get('subordinate-to')[0]) + machines = [] for unit in status.get('units').keys(): machines.append(