def test_keep_state_object_on_error_at_update_result(self): tracker = results_tracker.get_tracker() querier = tracker.get_querier('test_querymodule') querier._delete_state_object = mock.Mock(return_value=None) querier.delete_state_object_on_error = False # Ensure state objects are present. state1 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) with mock.patch.object( querier.__class__, '_update_action_results', mock.MagicMock( side_effect=Exception('Mock update exception.'))): tracker._bootstrap() eventlet.sleep(1) exec_id = str( ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) exec_id = str( ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) tracker.shutdown() # Ensure deletes are not called. querier._delete_state_object.assert_not_called()
def test_execution_cancellation(self): tracker = self._get_tracker() querier = tracker.get_querier('test_querymodule') querier._delete_state_object = mock.Mock(return_value=None) runners_utils.invoke_post_run = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) with mock.patch.object( querier.__class__, 'query', mock.MagicMock(return_value=(action_constants.LIVEACTION_STATUS_CANCELED, {}))): tracker._bootstrap() eventlet.sleep(2) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) tracker.shutdown() # Ensure deletes are called. self.assertEqual(2, querier._delete_state_object.call_count) # Ensure invoke_post_run is called. self.assertEqual(2, runners_utils.invoke_post_run.call_count)
def test_keep_state_object_on_error_at_update_result(self): tracker = self._get_tracker() querier = tracker.get_querier('test_querymodule') querier._delete_state_object = mock.Mock(return_value=None) querier.delete_state_object_on_error = False # Ensure state objects are present. state1 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) with mock.patch.object( querier.__class__, '_update_action_results', mock.MagicMock(side_effect=Exception('Mock update exception.'))): tracker._bootstrap() eventlet.sleep(1) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) tracker.shutdown() # Ensure deletes are not called. querier._delete_state_object.assert_not_called()
def _update_state_models(cls): states = ResultsTrackerTests.states state1 = ActionExecutionState.get_by_id(states['state1.yaml'].id) state1.execution_id = ResultsTrackerTests.liveactions['liveaction1.yaml'].id state2 = ActionExecutionState.get_by_id(states['state2.yaml'].id) state2.execution_id = ResultsTrackerTests.liveactions['liveaction2.yaml'].id ResultsTrackerTests.states['state1.yaml'] = ActionExecutionState.add_or_update(state1) ResultsTrackerTests.states['state2.yaml'] = ActionExecutionState.add_or_update(state2)
def _update_state_models(cls): states = ResultsTrackerTests.states state1 = ActionExecutionState.get_by_id(states['state1.yaml'].id) state1.execution_id = ResultsTrackerTests.liveactions['liveaction1.yaml'].id state2 = ActionExecutionState.get_by_id(states['state2.yaml'].id) state2.execution_id = ResultsTrackerTests.liveactions['liveaction2.yaml'].id ResultsTrackerTests.states['state1.yaml'] = ActionExecutionState.add_or_update(state1) ResultsTrackerTests.states['state2.yaml'] = ActionExecutionState.add_or_update(state2)
def test_state_crud(self): saved = ActionExecutionStateTests._create_save_actionstate() retrieved = ActionExecutionState.get_by_id(saved.id) self.assertDictEqual(saved.query_context, retrieved.query_context) self.assertEqual(saved.query_module, retrieved.query_module) ActionExecutionStateTests._delete(model_objects=[retrieved]) try: retrieved = ActionExecutionState.get_by_id(saved.id) except StackStormDBObjectNotFoundError: retrieved = None self.assertIsNone(retrieved, 'managed to retrieve after failure.')
def _delete_state_object(self, query_context): state_db = ActionExecutionState.get_by_id(query_context.id) if state_db is not None: try: ActionExecutionState.delete(state_db) except: LOG.exception('Failed clearing state object: %s', state_db)
def _delete_state_object(self, query_context): state_db = ActionExecutionState.get_by_id(query_context.id) if state_db is not None: try: ActionExecutionState.delete(state_db) except: LOG.exception('Failed clearing state object: %s', state_db)
def _is_state_object_exist(self, query_context): state_db = None try: state_db = ActionExecutionState.get_by_id(query_context.id) except db_exc.StackStormDBObjectNotFoundError: pass return (state_db is not None)
def test_action_deleted(self): tracker = self._get_tracker() action_db_utils.get_runnertype_by_name = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) # Process the state objects. tracker._bootstrap() eventlet.sleep(1) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) tracker.shutdown() # Ensure state objects are deleted. self.assertRaises( StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state1.yaml'].id ) self.assertRaises( StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state2.yaml'].id ) # Ensure get_runnertype_by_name in invoke_post_run is not called. action_db_utils.get_runnertype_by_name.assert_not_called()
def test_query_process(self): tracker = results_tracker.get_tracker() runners_utils.invoke_post_run = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id(ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) # Process the state objects. tracker._bootstrap() eventlet.sleep(1) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) tracker.shutdown() # Ensure state objects are deleted. self.assertRaises( StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state1.yaml'].id ) self.assertRaises( StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state2.yaml'].id ) # Ensure invoke_post_run is called. self.assertEqual(2, runners_utils.invoke_post_run.call_count)
def test_query_process(self): tracker = results_tracker.get_tracker() querier = tracker.get_querier('test_querymodule') querier._invoke_post_run = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) # Process the state objects. tracker._bootstrap() eventlet.sleep(1) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) tracker.shutdown() # Ensure state objects are deleted. self.assertRaises(StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state1.yaml'].id) self.assertRaises(StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state2.yaml'].id) # Ensure invoke_post_run is called. self.assertEqual(2, querier._invoke_post_run.call_count)
def test_action_deleted(self): tracker = results_tracker.get_tracker() action_db_utils.get_runnertype_by_name = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) # Process the state objects. tracker._bootstrap() eventlet.sleep(1) exec_id = str(ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) exec_id = str(ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertTrue(exec_db.result['called_with'][exec_id] is not None, exec_db.result) tracker.shutdown() # Ensure state objects are deleted. self.assertRaises(StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state1.yaml'].id) self.assertRaises(StackStormDBObjectNotFoundError, ActionExecutionState.get_by_id, ResultsTrackerTests.states['state2.yaml'].id) # Ensure get_runnertype_by_name in invoke_post_run is not called. action_db_utils.get_runnertype_by_name.assert_not_called()
def test_execution_cancellation(self): tracker = results_tracker.get_tracker() querier = tracker.get_querier('test_querymodule') querier._delete_state_object = mock.Mock(return_value=None) runners_utils.invoke_post_run = mock.Mock(return_value=None) # Ensure state objects are present. state1 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state1.yaml'].id) state2 = ActionExecutionState.get_by_id( ResultsTrackerTests.states['state2.yaml'].id) self.assertIsNotNone(state1) self.assertIsNotNone(state2) with mock.patch.object( querier.__class__, 'query', mock.MagicMock( return_value=(action_constants.LIVEACTION_STATUS_CANCELED, {}))): tracker._bootstrap() eventlet.sleep(2) exec_id = str( ResultsTrackerTests.states['state1.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) exec_id = str( ResultsTrackerTests.states['state2.yaml'].execution_id) exec_db = LiveAction.get_by_id(exec_id) self.assertDictEqual(exec_db.result, {}) tracker.shutdown() # Ensure deletes are called. self.assertEqual(2, querier._delete_state_object.call_count) # Ensure invoke_post_run is called. self.assertEqual(2, runners_utils.invoke_post_run.call_count)
def _delete_state_object(self, query_context): state_db = None try: state_db = ActionExecutionState.get_by_id(query_context.id) except db_exc.StackStormDBObjectNotFoundError: pass if state_db is not None: try: LOG.info('Clearing state object: %s', state_db) ActionExecutionState.delete(state_db) except: LOG.exception('Failed clearing state object: %s', state_db)