Bug fixes for mojo's use of zaza

Now with more unit tests!
A couple of minor bug fixes exposed while testing mojo's use of zaza.
This commit is contained in:
David Ames
2018-05-04 23:09:34 +00:00
parent 85fb7e7f77
commit 77c7f896f7
2 changed files with 107 additions and 1 deletions

View File

@@ -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)

View File

@@ -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(