Ejemplo n.º 1
0
 def insert(self, db):
     if not self.type or not self.sequence_list or not self.status or not self.model_name:
         raise ValueError(
             "Type, sequence_list, model_name, and status properties "
             "must be filled in before calling insert.")
     insert_sql = "insert into job(id, type, model_name, seq_id, status) values(%s, %s, %s, %s, %s)"
     update_database(db, insert_sql, [
         self.uuid, self.type, self.model_name, self.sequence_list,
         self.status
     ])
Ejemplo n.º 2
0
 def set_job_running(db, job_uuid):
     """
     Set job to RUNNING state.
     Requires job to be at NEW status.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     """
     update_sql = "update job set status = %s where id = %s and status = %s"
     rowcount = update_database(db, update_sql, [JobStatus.RUNNING, job_uuid, JobStatus.NEW])
     if rowcount == 0:
         raise ValueError("No job found for {} at status {}".format(job_uuid, JobStatus.NEW))
Ejemplo n.º 3
0
 def set_job_complete(db, job_uuid):
     """
     Set job to COMPLETE state.
     Requires job to be at RUNNING status.
     Updates the finished date/time.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     """
     update_sql = "update job set status = %s, finished = CURRENT_TIMESTAMP where id = %s and status = %s"
     rowcount = update_database(db, update_sql, [JobStatus.COMPLETE, job_uuid, JobStatus.RUNNING])
     if rowcount == 0:
         raise ValueError("No job found for {} at status {}".format(job_uuid, JobStatus.RUNNING))
Ejemplo n.º 4
0
 def set_job_running(db, job_uuid):
     """
     Set job to RUNNING state.
     Requires job to be at NEW status.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     """
     update_sql = "update job set status = %s where id = %s and status = %s"
     rowcount = update_database(
         db, update_sql, [JobStatus.RUNNING, job_uuid, JobStatus.NEW])
     if rowcount == 0:
         raise ValueError("No job found for {} at status {}".format(
             job_uuid, JobStatus.NEW))
Ejemplo n.º 5
0
 def set_job_as_error(db, job_uuid, error_message):
     """
     Set job to ERROR state.
     Updates the finished date/time.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     :param error_message: str: error associated with the failure
     """
     if not error_message:
         raise ValueError("Missing required error_message.")
     update_sql = "update job set status = %s, error_msg = %s, finished = CURRENT_TIMESTAMP where id = %s"
     rowcount = update_database(db, update_sql, [JobStatus.ERROR, error_message, job_uuid])
     if rowcount == 0:
         raise ValueError("No job found for {}.".format(job_uuid))
Ejemplo n.º 6
0
 def set_job_complete(db, job_uuid):
     """
     Set job to COMPLETE state.
     Requires job to be at RUNNING status.
     Updates the finished date/time.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     """
     update_sql = "update job set status = %s, finished = CURRENT_TIMESTAMP where id = %s and status = %s"
     rowcount = update_database(
         db, update_sql, [JobStatus.COMPLETE, job_uuid, JobStatus.RUNNING])
     if rowcount == 0:
         raise ValueError("No job found for {} at status {}".format(
             job_uuid, JobStatus.RUNNING))
Ejemplo n.º 7
0
 def set_job_as_error(db, job_uuid, error_message):
     """
     Set job to ERROR state.
     Updates the finished date/time.
     :param db: DatabaseConnection: database to update
     :param job_uuid: str: uuid of this job
     :param error_message: str: error associated with the failure
     """
     if not error_message:
         raise ValueError("Missing required error_message.")
     update_sql = "update job set status = %s, error_msg = %s, finished = CURRENT_TIMESTAMP where id = %s"
     rowcount = update_database(db, update_sql,
                                [JobStatus.ERROR, error_message, job_uuid])
     if rowcount == 0:
         raise ValueError("No job found for {}.".format(job_uuid))
Ejemplo n.º 8
0
 def insert(self, db):
     if not self.type or not self.sequence_list or not self.status or not self.model_name:
         raise ValueError("Type, sequence_list, model_name, and status properties "
                          "must be filled in before calling insert.")
     insert_sql = "insert into job(id, type, model_name, seq_id, status) values(%s, %s, %s, %s, %s)"
     update_database(db, insert_sql, [self.uuid, self.type, self.model_name, self.sequence_list, self.status])
    def test_customjob(self):
        FASTA_DATA1 = """>stuff\nAAACCCGGGGTT"""
        db = create_db_connection(TestWithPostgres.config.dbconfig)

        update_database(db, """
          delete from custom_result_row;
          delete from custom_result;
          delete from job;
          delete from sequence_list_item;
          delete from sequence_list;
        """, [])
        # start out finding no jobs
        jobs = CustomJob.find_jobs(db, None)
        self.assertEqual(len(jobs), 0)

        # create a new job that should be NEW status
        sequence_list = SequenceList.create_with_content_and_title(db, FASTA_DATA1, "somelist")
        job_uuid = CustomJob.create_job(db, DataType.PREDICTION, sequence_list, model_name="E2f1").uuid
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(job_uuid, job.uuid)
        self.assertEqual(JobStatus.NEW, job.status)
        self.assertEqual(DataType.PREDICTION, job.type)
        self.assertEqual(sequence_list, job.sequence_list)
        self.assertIsNotNone(job.created)
        self.assertIsNone(job.finished)

        # find NEW job without filters
        jobs = CustomJob.find_jobs(db, None)
        self.assertEqual(len(jobs), 1)
        self.assertEqual(jobs[0].uuid, job_uuid)
        # find no for RUNNING jobs
        jobs = CustomJob.find_jobs(db, JobStatus.RUNNING)
        self.assertEqual(len(jobs), 0)
        # find 1 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 1)

        # Jobs can be set to running only once (when in NEW state)
        CustomJob.set_job_running(db, job_uuid)
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.RUNNING, job.status)
        self.assertIsNone(job.finished)
        # Disallow setting a job running twice (prevents two workers working on the same job)
        with self.assertRaises(ValueError):
            CustomJob.set_job_running(db, job_uuid)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)

        # Jobs can be set to complete from RUNNING state
        CustomJob.set_job_complete(db, job_uuid)
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.COMPLETE, job.status)
        self.assertIsNotNone(job.finished)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)

        # Jobs can be set to complete from ERROR state
        CustomJob.set_job_as_error(db, job_uuid, "Something failed.")
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.ERROR, job.status)
        self.assertEqual("Something failed.", job.error_msg)
        self.assertIsNotNone(job.finished)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)
Ejemplo n.º 10
0
    def test_customjob(self):
        FASTA_DATA1 = """>stuff\nAAACCCGGGGTT"""
        db = create_db_connection(TestWithPostgres.config.dbconfig)

        update_database(db, """
          delete from custom_result_row;
          delete from custom_result;
          delete from job;
          delete from sequence_list_item;
          delete from sequence_list;
        """, [])
        # start out finding no jobs
        jobs = CustomJob.find_jobs(db, None)
        self.assertEqual(len(jobs), 0)

        # create a new job that should be NEW status
        sequence_list = SequenceList.create_with_content_and_title(db, FASTA_DATA1, "somelist")
        job_uuid = CustomJob.create_job(db, DataType.PREDICTION, sequence_list, model_name="E2f1").uuid
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(job_uuid, job.uuid)
        self.assertEqual(JobStatus.NEW, job.status)
        self.assertEqual(DataType.PREDICTION, job.type)
        self.assertEqual(sequence_list, job.sequence_list)
        self.assertIsNotNone(job.created)
        self.assertIsNone(job.finished)

        # find NEW job without filters
        jobs = CustomJob.find_jobs(db, None)
        self.assertEqual(len(jobs), 1)
        self.assertEqual(jobs[0].uuid, job_uuid)
        # find no for RUNNING jobs
        jobs = CustomJob.find_jobs(db, JobStatus.RUNNING)
        self.assertEqual(len(jobs), 0)
        # find 1 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 1)

        # Jobs can be set to running only once (when in NEW state)
        CustomJob.set_job_running(db, job_uuid)
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.RUNNING, job.status)
        self.assertIsNone(job.finished)
        # Disallow setting a job running twice (prevents two workers working on the same job)
        with self.assertRaises(ValueError):
            CustomJob.set_job_running(db, job_uuid)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)

        # Jobs can be set to complete from RUNNING state
        CustomJob.set_job_complete(db, job_uuid)
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.COMPLETE, job.status)
        self.assertIsNotNone(job.finished)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)

        # Jobs can be set to complete from ERROR state
        CustomJob.set_job_as_error(db, job_uuid, "Something failed.")
        job = CustomJob.read_job(db, job_uuid)
        self.assertEqual(JobStatus.ERROR, job.status)
        self.assertEqual("Something failed.", job.error_msg)
        self.assertIsNotNone(job.finished)

        # find 0 for NEW jobs
        jobs = CustomJob.find_jobs(db, JobStatus.NEW)
        self.assertEqual(len(jobs), 0)