def _start_import(self, catalog: str, collection: str, application: str): job = Workflow(IMPORT).start_new({ 'catalogue': catalog, 'collection': collection, 'application': application, }) self._wait_job_finished(job)
def start_workflow(msg): """ Start a workflow using the parameters that are contained in the message header :param msg: The message that will be used to start a workflow :return: None """ # Retrieve the workflow parameters workflow_name = msg['workflow']['workflow_name'] step_name = msg['workflow'].get('step_name') # Delete the parameters so that they do not get transferred in the workflow del msg['workflow'] # Start the workflow with the given message if workflow_name and step_name: Workflow(workflow_name, step_name).start(msg) elif workflow_name: Workflow(workflow_name).start(msg) else: Workflow.end_of_workflow(msg)
def execute_command(self, command: StartCommand): """Executes input command :param command: :return: """ input_args = self._parse_arguments(command) args = [command.workflow] if command.start_step: args.append(command.start_step) Workflow(*args).start_new(input_args)
def handle_result(msg): """ Handle the result of a message. Result messages are received via the result queue The message is matched with a step in a workflow and the result handling method of this workflow step is executed :param msg: The result message :return: None """ # Retrieve the job and step from the message header header = msg['header'] jobid = header['jobid'] stepid = header['stepid'] # Get the job and step from the database job, step = get_job_step(jobid, stepid) # Start the result handler method with the given message if hooks.has_hooks(msg): hooks.handle_result(msg) else: Workflow(job.type, step.name).handle_result()(msg)
def _start_relate(self, catalog: str): job = Workflow(RELATE).start_new({'catalogue': catalog}) self._wait_job_finished(job)
def setUp(self): self.workflow = Workflow("Workflow", "Step") WORKFLOWS["Workflow"]["Step"]["function"] = mock.MagicMock() WORKFLOWS["Workflow"]["Next"]["function"] = mock.MagicMock() WORKFLOWS["Workflow"]["OtherNext"]["function"] = mock.MagicMock()
class TestWorkflow(TestCase): @mock.patch("gobworkflow.workflow.workflow.WORKFLOWS", WORKFLOWS) def setUp(self): self.workflow = Workflow("Workflow", "Step") WORKFLOWS["Workflow"]["Step"]["function"] = mock.MagicMock() WORKFLOWS["Workflow"]["Next"]["function"] = mock.MagicMock() WORKFLOWS["Workflow"]["OtherNext"]["function"] = mock.MagicMock() def test_create(self): self.assertIsNotNone(self.workflow) @mock.patch("gobworkflow.workflow.workflow.job_runs", lambda j: False) @mock.patch("gobworkflow.workflow.workflow.step_start") @mock.patch("gobworkflow.workflow.workflow.job_start") def test_start(self, job_start, step_start): job_start.return_value = {'id': "Any process id"} self.workflow.start({}) WORKFLOWS["Workflow"]["Step"]["function"].assert_called_with({ 'header': { 'process_id': 'Any process id' }, 'summary': {} }) job_start.assert_called_with('Workflow', { 'header': { 'process_id': 'Any process id' }, 'summary': {} }) step_start.assert_called_with('Step', {'process_id': 'Any process id'}) def test_start_new(self): self.workflow.start = mock.MagicMock() attrs = { 'h1': 'v1', 'h2': 'v2', } self.workflow.start_new(attrs) self.workflow.start.assert_called_with( {'header': { 'h1': 'v1', 'h2': 'v2', }}) @mock.patch("gobworkflow.workflow.workflow.logger", mock.MagicMock()) @mock.patch("gobworkflow.workflow.workflow.job_runs", lambda j: True) @mock.patch("gobworkflow.workflow.workflow.step_start") @mock.patch("gobworkflow.workflow.workflow.job_start") def test_start_and_end_job_runs(self, job_start, step_start): WORKFLOWS["Workflow"]["Step"]["function"] = lambda _: END_OF_WORKFLOW self.workflow.start({}) job_start.assert_called_with( "Workflow", {'header': { 'process_id': mock.ANY, 'entity': None }}) step_start.assert_called_with('accept', { 'process_id': mock.ANY, 'entity': None }) @mock.patch("gobworkflow.workflow.workflow.job_runs", lambda j: False) @mock.patch("gobworkflow.workflow.workflow.logger", mock.MagicMock()) @mock.patch("gobworkflow.workflow.workflow.step_start") @mock.patch("gobworkflow.workflow.workflow.job_start") def test_start_and_end(self, job_start, step_start): job_start.return_value = {'id': "Any process id"} WORKFLOWS["Workflow"]["Step"]["function"] = lambda _: END_OF_WORKFLOW self.workflow.start({}) job_start.assert_called_with('Workflow', { 'header': { 'process_id': 'Any process id' }, 'summary': {} }) step_start.assert_called_with('Step', {'process_id': 'Any process id'}) @mock.patch("gobworkflow.workflow.workflow.job_runs", lambda j: False) @mock.patch("gobworkflow.workflow.workflow.step_start") @mock.patch("gobworkflow.workflow.workflow.job_start") def test_start_with_contents(self, job_start, step_start): job_start.return_value = {'id': "Any process id"} self.workflow.start({'summary': 'any summary', 'contents': []}) WORKFLOWS["Workflow"]["Step"]["function"].assert_called_with({ 'summary': {}, 'contents': [], 'header': { 'process_id': 'Any process id' } }) job_start.assert_called_with( 'Workflow', { 'summary': {}, 'contents': [], 'header': { 'process_id': 'Any process id' } }) step_start.assert_called_with('Step', {'process_id': 'Any process id'}) @mock.patch("gobworkflow.workflow.workflow.logger", mock.MagicMock()) @mock.patch("gobworkflow.workflow.workflow.job_end") def test_handle_result_without_next(self, job_end): handler = self.workflow.handle_result() handler({"header": {}, "condition": False}) WORKFLOWS["Workflow"]["Next"]["function"].assert_not_called() job_end.assert_called() @mock.patch("gobworkflow.workflow.workflow.step_start") def test_handle_result_with_next(self, step_start): handler = self.workflow.handle_result() handler({"header": {}, "condition": True}) WORKFLOWS["Workflow"]["Next"]["function"].assert_called_with({ "header": {}, "summary": {}, "condition": True }) step_start.assert_called() @mock.patch("gobworkflow.workflow.workflow.step_start", mock.MagicMock()) def test_handle_result_with_multiple_nexts(self): handler = self.workflow.handle_result() handler({"header": {}, "next": True}) # Only execute the first matching next step WORKFLOWS["Workflow"]["Next"]["function"].assert_not_called() WORKFLOWS["Workflow"]["OtherNext"]["function"].assert_called_with({ "header": {}, "summary": {}, "next": True })