From 82e9f1b6255c5458aad135c543e3809f9e86dc36 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Tue, 13 Nov 2018 17:11:45 +0000 Subject: [PATCH 1/3] Accept bespoke workload statuses and default When checking the readyness of an application check both the bespoke status as defined in the tests.yaml and the default. Closes issue 158. --- unit_tests/test_zaza_model.py | 18 ++++++++++++++---- zaza/model.py | 25 +++++++++++++------------ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/unit_tests/test_zaza_model.py b/unit_tests/test_zaza_model.py index 0a57bf8..0128b58 100644 --- a/unit_tests/test_zaza_model.py +++ b/unit_tests/test_zaza_model.py @@ -450,7 +450,7 @@ class TestModel(ut_utils.BaseTestCase): 'workload-status-message': 'Unit is ready'}) self.assertTrue( model.check_unit_workload_status(self.Model_mock, - self.unit1, 'active')) + self.unit1, ['active'])) def test_check_unit_workload_status_no_match(self): self.patch_object(model, 'check_model_for_hard_errors') @@ -459,7 +459,17 @@ class TestModel(ut_utils.BaseTestCase): 'workload-status-message': 'Unit is ready'}) self.assertFalse( model.check_unit_workload_status(self.Model_mock, - self.unit1, 'active')) + self.unit1, ['active'])) + + def test_check_unit_workload_status_multi(self): + self.patch_object(model, 'check_model_for_hard_errors') + self._application_states_setup({ + 'workload-status': 'blocked', + 'workload-status-message': 'Unit is ready'}) + self.assertTrue( + model.check_unit_workload_status( + self.Model_mock, + self.unit1, ['active', 'blocked'])) def test_check_unit_workload_status_message_message(self): self.patch_object(model, 'check_model_for_hard_errors') @@ -490,7 +500,7 @@ class TestModel(ut_utils.BaseTestCase): model.check_unit_workload_status_message( self.Model_mock, self.unit1, - prefixes=('Readyish', 'Unit is ready'))) + prefixes=['Readyish', 'Unit is ready'])) def test_check_unit_workload_status_message_prefix_no_match(self): self.patch_object(model, 'check_model_for_hard_errors') @@ -501,7 +511,7 @@ class TestModel(ut_utils.BaseTestCase): model.check_unit_workload_status_message( self.Model_mock, self.unit1, - prefixes=('Readyish', 'Unit is ready'))) + prefixes=['Readyish', 'Unit is ready'])) def test_wait_for_application_states(self): self._application_states_setup({ diff --git a/zaza/model.py b/zaza/model.py index d90b7f7..47bcf4d 100644 --- a/zaza/model.py +++ b/zaza/model.py @@ -618,14 +618,14 @@ def check_unit_workload_status(model, unit, state): :type model: juju.Model :param unit: Unit to check wl status of :type unit: juju.Unit - :param state: Expected unit work load state - :type state: str + :param state: Acceptable unit work load states + :type state: list :raises: UnitError :returns: Whether units workload status matches desired state :rtype: bool """ check_model_for_hard_errors(model) - return unit.workload_status == state + return unit.workload_status in state def check_unit_workload_status_message(model, unit, message=None, @@ -645,7 +645,7 @@ def check_unit_workload_status_message(model, unit, message=None, :param message: Expected message text :type message: str :param prefixes: Prefixes to match message against - :type prefixes: tuple + :type prefixes: list :raises: ValueError, UnitError :returns: Whether message matches desired string :rtype: bool @@ -654,7 +654,7 @@ def check_unit_workload_status_message(model, unit, message=None, if message is not None: return unit.workload_status_message == message elif prefixes is not None: - return unit.workload_status_message.startswith(prefixes) + return unit.workload_status_message.startswith(tuple(prefixes)) else: raise ValueError("Must be called with message or prefixes") @@ -721,7 +721,8 @@ async def async_wait_for_application_states(model_name=None, states=None, :param timeout: Time to wait for status to be achieved :type timeout: int """ - approved_message_prefixes = ('ready', 'Ready', 'Unit is ready') + approved_message_prefixes = ['ready', 'Ready', 'Unit is ready'] + approved_statuses = ['active'] if not states: states = {} @@ -742,26 +743,26 @@ async def async_wait_for_application_states(model_name=None, states=None, for application, app_data in model.applications.items(): check_info = states.get(application, {}) for unit in app_data.units: + if check_info.get('workload-status'): + approved_statuses.append(check_info['workload-status']) logging.info("Checking workload status of {}".format( unit.entity_id)) await model.block_until( lambda: check_unit_workload_status( model, unit, - check_info.get('workload-status', 'active')), + approved_statuses), timeout=timeout) check_msg = check_info.get('workload-status-message') logging.info("Checking workload status message of {}" .format(unit.entity_id)) - if check_msg is not None: - prefixes = (check_msg) - else: - prefixes = approved_message_prefixes + if check_msg: + approved_message_prefixes.append(check_msg) await model.block_until( lambda: check_unit_workload_status_message( model, unit, - prefixes=prefixes), + prefixes=approved_message_prefixes), timeout=timeout) except concurrent.futures._base.TimeoutError: raise ModelTimeout("Zaza has timed out waiting on the model to " From 12204594f924a98c5feebca3f8e0e1c75e710bbb Mon Sep 17 00:00:00 2001 From: Liam Young Date: Tue, 13 Nov 2018 17:32:35 +0000 Subject: [PATCH 2/3] Change check_unit_workload_status state to states to make it clearer --- zaza/model.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zaza/model.py b/zaza/model.py index 47bcf4d..945a4d5 100644 --- a/zaza/model.py +++ b/zaza/model.py @@ -608,7 +608,7 @@ def check_model_for_hard_errors(model): raise UnitError(errored_units) -def check_unit_workload_status(model, unit, state): +def check_unit_workload_status(model, unit, states): """Check that the units workload status matches the supplied state. This function has the side effect of also checking for *any* units @@ -618,14 +618,14 @@ def check_unit_workload_status(model, unit, state): :type model: juju.Model :param unit: Unit to check wl status of :type unit: juju.Unit - :param state: Acceptable unit work load states - :type state: list + :param states: Acceptable unit work load states + :type states: list :raises: UnitError :returns: Whether units workload status matches desired state :rtype: bool """ check_model_for_hard_errors(model) - return unit.workload_status in state + return unit.workload_status in states def check_unit_workload_status_message(model, unit, message=None, From c8ae64dc4713944556d9ba90748d97e00af0d184 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Tue, 13 Nov 2018 18:00:43 +0000 Subject: [PATCH 3/3] Ensure workload statuses and messages are reset for each app --- zaza/model.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/zaza/model.py b/zaza/model.py index 945a4d5..357c56d 100644 --- a/zaza/model.py +++ b/zaza/model.py @@ -743,26 +743,32 @@ async def async_wait_for_application_states(model_name=None, states=None, for application, app_data in model.applications.items(): check_info = states.get(application, {}) for unit in app_data.units: - if check_info.get('workload-status'): - approved_statuses.append(check_info['workload-status']) + app_wls = check_info.get('workload-status') + if app_wls: + all_approved_statuses = approved_statuses + [app_wls] + else: + all_approved_statuses = approved_statuses logging.info("Checking workload status of {}".format( unit.entity_id)) await model.block_until( lambda: check_unit_workload_status( model, unit, - approved_statuses), + all_approved_statuses), timeout=timeout) check_msg = check_info.get('workload-status-message') logging.info("Checking workload status message of {}" .format(unit.entity_id)) - if check_msg: - approved_message_prefixes.append(check_msg) + prefixes = approved_message_prefixes + if check_msg is not None: + prefixes = approved_message_prefixes + [check_msg] + else: + prefixes = approved_message_prefixes await model.block_until( lambda: check_unit_workload_status_message( model, unit, - prefixes=approved_message_prefixes), + prefixes=prefixes), timeout=timeout) except concurrent.futures._base.TimeoutError: raise ModelTimeout("Zaza has timed out waiting on the model to "