From 4ea5685dd2f4c139d8654495fd6f17f184661953 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Fri, 16 Jun 2023 06:32:00 -0600 Subject: [PATCH 1/2] improve job error report email --- qiita_db/processing_job.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/qiita_db/processing_job.py b/qiita_db/processing_job.py index 795948fe4..c0e614863 100644 --- a/qiita_db/processing_job.py +++ b/qiita_db/processing_job.py @@ -729,7 +729,8 @@ def _generate_notification_message(self, value, error_msg): return None # generate subject line - subject = '%s: %s (%s)' % (self.command.name, value, self.id) + subject = (f'{self.command.name}: {value}, {self.id} ' + f'[{self.external_id}]') # generate message line message = '' @@ -762,6 +763,13 @@ def _generate_notification_message(self, value, error_msg): if len(prep_ids) == 0: raise qdb.exceptions.QiitaError("No Prep IDs were " "found") + if len(prep_ids) == 1: + study_url = (f'{qiita_config.base_url}/study/' + f'description/{study_id}?prep_id=' + f'{prep_ids[0]}') + else: + study_url = (f'{qiita_config.base_url}/study/' + f'description/{study_id}') # convert into a string for presentation. prep_ids = [str(x) for x in prep_ids] prep_ids = ', '.join(prep_ids) @@ -775,9 +783,8 @@ def _generate_notification_message(self, value, error_msg): data_type = data_types.pop() message = f'Processing Job: {self.command.name}\n' - message += f'{qiita_config.base_url}/study/' - message += f'description/{study_id}\n' message += f'Prep IDs: {prep_ids}\n' + message += f'{study_url}\n' message += f'Data Type: {data_type}\n' elif artifact.analysis: # this is an analysis job. display analysis id as link and @@ -832,6 +839,12 @@ def _set_status(self, value, error_msg=None): # send email qdb.util.send_email(self.user.email, msg['subject'], msg['message']) + # send email to our sys-admin if error from admin + if self.user.level in {'admin', 'wet-lab admin'}: + if value == 'error': + qdb.util.send_email( + 'jdereus@health.ucsd.edu', msg['subject'], + msg['message']) sql = """UPDATE qiita.processing_job SET processing_job_status_id = %s From 9b8019e9deef49b1c809cd220809177421040b26 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Fri, 16 Jun 2023 07:14:55 -0600 Subject: [PATCH 2/2] fix tests --- CHANGELOG.md | 3 +- qiita_db/processing_job.py | 4 +-- qiita_db/test/test_processing_job.py | 49 +++++++++++++--------------- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7437acff6..a60f9c328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ Version 2023.06 * Admin Sample Validation now uses tube_id; mainly contributed by @CatFish47. * Registered users cannot start sample deletion jobs within public studies. * The qp-knight-lab-processing now links the SPP job to the preparation it creates and links the created files to that preparation. Note that no files are being moved to the upload folder. -* Fixed the following issues [#3227](https://github.com/qiita-spots/qiita/issues/3227), [#3279](https://github.com/qiita-spots/qiita/issues/3279). +* Fixed the following issues [#3227](https://github.com/qiita-spots/qiita/issues/3227), [#3279](https://github.com/qiita-spots/qiita/issues/3280), [#3227](https://github.com/qiita-spots/qiita/issues/3280). +* Added ProcessingJob.external_id to status-report messages generated, and added sending an email to our system-admin when a (wet-lab) admin job errors. Version 2023.05 diff --git a/qiita_db/processing_job.py b/qiita_db/processing_job.py index c0e614863..d53dfb1e2 100644 --- a/qiita_db/processing_job.py +++ b/qiita_db/processing_job.py @@ -759,7 +759,7 @@ def _generate_notification_message(self, value, error_msg): study_id = study_ids.pop() # there should be at least one prep_id and probably more. - prep_ids = set(prep_ids) + prep_ids = list(set(prep_ids)) if len(prep_ids) == 0: raise qdb.exceptions.QiitaError("No Prep IDs were " "found") @@ -782,7 +782,7 @@ def _generate_notification_message(self, value, error_msg): f"{data_types}") data_type = data_types.pop() - message = f'Processing Job: {self.command.name}\n' + message = f'{self.command.name}\n' message += f'Prep IDs: {prep_ids}\n' message += f'{study_url}\n' message += f'Data Type: {data_type}\n' diff --git a/qiita_db/test/test_processing_job.py b/qiita_db/test/test_processing_job.py index 44c7f0191..884b7ab3f 100644 --- a/qiita_db/test/test_processing_job.py +++ b/qiita_db/test/test_processing_job.py @@ -870,50 +870,47 @@ def test_notification_mail_generation(self): # messages of type 'error'. obs = self.tester1._generate_notification_message('error', None) - exp = {'subject': ('Split libraries FASTQ: error ' - '(063e553b-327c-4818-ab4a-adfe58e49860)'), - 'message': ('Processing Job: Split libraries FASTQ\n' - f'{qiita_config.base_url}/study/description/1' - '\nPrep IDs: 1\nData Type: 18S\nNew ' - 'status: error')} + exp = {'subject': ('Split libraries FASTQ: error, 063e553b-327c-4818-' + 'ab4a-adfe58e49860 [Not Available]'), + 'message': ('Split libraries FASTQ\nPrep IDs: 1' + f'\n{qiita_config.base_url}/study/description/1?' + 'prep_id=1\nData Type: 18S\nNew status: error')} self.assertDictEqual(obs, exp) obs = self.tester1._generate_notification_message('error', 'An Error Message') - exp = {'subject': ('Split libraries FASTQ: error ' - '(063e553b-327c-4818-ab4a-adfe58e49860)'), - 'message': ('Processing Job: Split libraries FASTQ\n' - f'{qiita_config.base_url}/study/description/1\n' - 'Prep IDs: 1\nData Type: 18S\nNew status' - ': error\n\nError:\nAn Error Message')} + exp = {'subject': ('Split libraries FASTQ: error, 063e553b-327c-4818-' + 'ab4a-adfe58e49860 [Not Available]'), + 'message': ('Split libraries FASTQ\nPrep IDs: 1' + f'\n{qiita_config.base_url}/study/description/1?' + 'prep_id=1\nData Type: 18S\nNew status: error' + '\n\nError:\nAn Error Message')} self.assertDictEqual(obs, exp) # The inclusion of an error message has no effect on other valid # status types e.g. 'running'. obs = self.tester1._generate_notification_message('running', None) - exp = {'subject': ('Split libraries FASTQ: running ' - '(063e553b-327c-4818-ab4a-adfe58e49860)'), - 'message': ('Processing Job: Split libraries FASTQ\n' - f'{qiita_config.base_url}/study/description/1\n' - 'Prep IDs: 1\nData Type: 18S\nNew status' - ': running')} + exp = {'subject': ('Split libraries FASTQ: running, 063e553b-327c-' + '4818-ab4a-adfe58e49860 [Not Available]'), + 'message': ('Split libraries FASTQ\nPrep IDs: 1' + f'\n{qiita_config.base_url}/study/description/1?' + 'prep_id=1\nData Type: 18S\nNew status: running')} self.assertDictEqual(obs, exp) obs = self.tester1._generate_notification_message('running', 'Yahoo!') - exp = {'subject': ('Split libraries FASTQ: running ' - '(063e553b-327c-4818-ab4a-adfe58e49860)'), - 'message': ('Processing Job: Split libraries FASTQ\n' - f'{qiita_config.base_url}/study/description/1\n' - 'Prep IDs: 1\nData Type: 18S\nNew status' - ': running')} + exp = {'subject': ('Split libraries FASTQ: running, 063e553b-327c-' + '4818-ab4a-adfe58e49860 [Not Available]'), + 'message': ('Split libraries FASTQ\nPrep IDs: 1' + f'\n{qiita_config.base_url}/study/description/1?' + 'prep_id=1\nData Type: 18S\nNew status: running')} self.assertDictEqual(obs, exp) # checking analysis emails jid = '8a7a8461-e8a1-4b4e-a428-1bc2f4d3ebd0' pj = qdb.processing_job.ProcessingJob(jid) obs = pj._generate_notification_message('running', 'Yahoo!') - exp = {'subject': 'Single Rarefaction: running ' - '(8a7a8461-e8a1-4b4e-a428-1bc2f4d3ebd0)', + exp = {'subject': ('Single Rarefaction: running, 8a7a8461-e8a1-' + '4b4e-a428-1bc2f4d3ebd0 [Not Available]'), 'message': 'Analysis Job Single Rarefaction\n' f'{qiita_config.base_url}/analysis/description/1/\n' 'New status: running'}