Пример #1
0
    def test_parse_common_joblist_output(self):
        """
        Test whether _parse_joblist can parse the bjobs output
        """
        # pylint: disable=too-many-locals,too-many-statements
        import datetime
        scheduler = LsfScheduler()

        # Disable logging to avoid excessive output during test
        logging.disable(logging.ERROR)

        retval = 255
        stdout = BJOBS_STDOUT_TO_TEST
        stderr = BJOBS_STDERR_TO_TEST

        with self.assertRaises(SchedulerError):
            job_list = scheduler._parse_joblist_output(retval, stdout, stderr)

        retval = 0
        stdout = BJOBS_STDOUT_TO_TEST
        stderr = ''
        job_list = scheduler._parse_joblist_output(retval, stdout, stderr)

        # The parameters are hard coded in the text to parse
        job_on_cluster = 7
        job_parsed = len(job_list)
        self.assertEqual(job_parsed, job_on_cluster)

        job_queued = 2
        job_queue_name = ['8nm', 'test']
        job_queued_parsed = len([
            j for j in job_list
            if j.job_state and j.job_state == JobState.QUEUED
        ])
        job_queue_name_parsed = [
            j.queue_name for j in job_list
            if j.job_state and j.job_state == JobState.QUEUED
        ]
        self.assertEqual(job_queued, job_queued_parsed)
        self.assertEqual(job_queue_name, job_queue_name_parsed)

        job_done = 2
        job_done_title = ['aiida-1033269', 'test']
        job_done_annotation = [
            'TERM_RUNLIMIT: job killed after reaching LSF run time limit', '-'
        ]
        job_done_parsed = len([
            j for j in job_list if j.job_state and j.job_state == JobState.DONE
        ])
        job_done_title_parsed = [
            j.title for j in job_list
            if j.job_state and j.job_state == JobState.DONE
        ]
        job_done_annotation_parsed = [
            j.annotation for j in job_list
            if j.job_state and j.job_state == JobState.DONE
        ]
        self.assertEqual(job_done, job_done_parsed)
        self.assertEqual(job_done_title, job_done_title_parsed)
        self.assertEqual(job_done_annotation, job_done_annotation_parsed)

        job_running = 3
        job_running_parsed = len([
            j for j in job_list
            if j.job_state and j.job_state == JobState.RUNNING
        ])
        self.assertEqual(job_running, job_running_parsed)

        running_users = ['inewton', 'inewton', 'dbowie']
        parsed_running_users = [
            j.job_owner for j in job_list
            if j.job_state and j.job_state == JobState.RUNNING
        ]
        self.assertEqual(running_users, parsed_running_users)

        running_jobs = ['764254593', '764255172', '764245175']
        num_machines = [1, 1, 1]
        allocated_machines = ['lxbsu2710', 'b68ac74822', 'b68ac74822']
        parsed_running_jobs = [
            j.job_id for j in job_list
            if j.job_state and j.job_state == JobState.RUNNING
        ]
        parsed_num_machines = [
            j.num_machines for j in job_list
            if j.job_state and j.job_state == JobState.RUNNING
        ]
        parsed_allocated_machines = [
            j.allocated_machines_raw for j in job_list
            if j.job_state and j.job_state == JobState.RUNNING
        ]
        self.assertEqual(running_jobs, parsed_running_jobs)
        self.assertEqual(num_machines, parsed_num_machines)
        self.assertEqual(allocated_machines, parsed_allocated_machines)

        self.assertEqual([
            j.requested_wallclock_time_seconds for j in job_list
            if j.job_id == '764254593'
        ][0], 60)  # pylint: disable=invalid-name
        self.assertEqual([
            j.wallclock_time_seconds for j in job_list
            if j.job_id == '764255172'
        ][0], 9)
        self.assertEqual([
            j.wallclock_time_seconds for j in job_list
            if j.job_id == '764245175'
        ][0], 4785)
        current_year = datetime.datetime.now().year
        self.assertEqual([
            j.submission_time for j in job_list if j.job_id == '764245175'
        ][0], datetime.datetime(current_year, 12, 31, 23, 40))

        # Important to enable again logs!
        logging.disable(logging.NOTSET)
Пример #2
0
def test_parse_common_joblist_output():
    """
    Tests to verify if the function _parse_joblist_output can parse the bjobs output.
    The tests is done parsing a string defined above, to be used offline
    """
    # pylint: disable=too-many-locals,too-many-statements
    import datetime
    scheduler = LsfScheduler()

    # Disable logging to avoid excessive output during test
    logging.disable(logging.ERROR)

    retval = 255
    stdout = BJOBS_STDOUT_TO_TEST
    stderr = BJOBS_STDERR_TO_TEST

    with pytest.raises(SchedulerError):
        job_list = scheduler._parse_joblist_output(retval, stdout, stderr)

    retval = 0
    stdout = BJOBS_STDOUT_TO_TEST
    stderr = ''
    job_list = scheduler._parse_joblist_output(retval, stdout, stderr)

    # The parameters are hard coded in the text to parse
    job_on_cluster = 7
    job_parsed = len(job_list)
    assert job_parsed == job_on_cluster

    job_queued = 2
    job_queue_name = ['8nm', 'test']
    job_queued_parsed = len([
        j for j in job_list if j.job_state and j.job_state == JobState.QUEUED
    ])
    job_queue_name_parsed = [
        j.queue_name for j in job_list
        if j.job_state and j.job_state == JobState.QUEUED
    ]
    assert job_queued == job_queued_parsed
    assert job_queue_name == job_queue_name_parsed

    job_done = 2
    job_done_title = ['aiida-1033269', 'test']
    job_done_annotation = [
        'TERM_RUNLIMIT: job killed after reaching LSF run time limit', '-'
    ]
    job_done_parsed = len(
        [j for j in job_list if j.job_state and j.job_state == JobState.DONE])
    job_done_title_parsed = [
        j.title for j in job_list
        if j.job_state and j.job_state == JobState.DONE
    ]
    job_done_annotation_parsed = [
        j.annotation for j in job_list
        if j.job_state and j.job_state == JobState.DONE
    ]
    assert job_done == job_done_parsed
    assert job_done_title == job_done_title_parsed
    assert job_done_annotation == job_done_annotation_parsed

    job_running = 3
    job_running_parsed = len([
        j for j in job_list if j.job_state and j.job_state == JobState.RUNNING
    ])
    assert job_running == job_running_parsed

    running_users = ['inewton', 'inewton', 'dbowie']
    parsed_running_users = [
        j.job_owner for j in job_list
        if j.job_state and j.job_state == JobState.RUNNING
    ]
    assert running_users == parsed_running_users

    running_jobs = ['764254593', '764255172', '764245175']
    num_machines = [1, 1, 1]
    allocated_machines = ['lxbsu2710', 'b68ac74822', 'b68ac74822']
    parsed_running_jobs = [
        j.job_id for j in job_list
        if j.job_state and j.job_state == JobState.RUNNING
    ]
    parsed_num_machines = [
        j.num_machines for j in job_list
        if j.job_state and j.job_state == JobState.RUNNING
    ]
    parsed_allocated_machines = [
        j.allocated_machines_raw for j in job_list
        if j.job_state and j.job_state == JobState.RUNNING
    ]
    assert running_jobs == parsed_running_jobs
    assert num_machines == parsed_num_machines
    assert allocated_machines == parsed_allocated_machines

    assert [
        j.requested_wallclock_time_seconds
        for j in job_list if j.job_id == '764254593'
    ][0] == 60  # pylint: disable=invalid-name
    assert [
        j.wallclock_time_seconds for j in job_list if j.job_id == '764255172'
    ][0] == 9
    assert [
        j.wallclock_time_seconds for j in job_list if j.job_id == '764245175'
    ][0] == 4785
    current_year = datetime.datetime.now().year
    assert [j.submission_time for j in job_list if j.job_id == '764245175'
            ][0] == datetime.datetime(current_year, 12, 31, 23, 40)

    # Important to enable again logs!
    logging.disable(logging.NOTSET)