def testResReqAssignCombinedDefs(databases):
    """Test whether simple resource requirements from both the framework
    and task definition are used in task assignment."""
    def check(config):
        resourceDB = databases.resourceDB

        job, = config.createJobs(OWNER)
        taskRunner = resourceDB[tr]

        # Try to assign with both cap_a and cap_b unavailable.
        reserveResource(resourceDB, resA)
        reserveResource(resourceDB, resB)
        task = job.assignTask(taskRunner)
        assert task is None

        # Try to assign with only cap_a unavailable.
        freeResource(resourceDB, resB)
        task = job.assignTask(taskRunner)
        assert task is None

        # Try to assign with only cap_b unavailable.
        freeResource(resourceDB, resA)
        reserveResource(resourceDB, resB)
        task = job.assignTask(taskRunner)
        assert task is None

        # Try to assign with cap_a and cap_b available.
        freeResource(resourceDB, resB)
        task = job.assignTask(taskRunner)
        assert task is not None
        assert not resourceDB[resA].isFree()
        assert not resourceDB[resB].isFree()
        assert resourceDB[resC].isFree()
        job.taskDone('task', ResultCode.OK, 'summary text', (), {})
        assert resourceDB[resA].isFree()
        assert resourceDB[resB].isFree()
        assert resourceDB[resC].isFree()

    gen = DataGenerator(databases)
    resType = gen.createResourceType(pertask=True)
    resA = gen.createResource(resType, ('cap_a', ))
    resB = gen.createResource(resType, ('cap_b', 'cap_d'))
    resC = gen.createResource(resType, ('cap_c', ))
    tr = gen.createTaskRunner()

    fwSpecs = (
        ('ref1', resType, ('cap_a', )),
        (taskRunnerResourceRefName, taskRunnerResourceTypeName, ()),
    )
    framework = gen.createFramework('fw', resources=fwSpecs)
    tdSpecs = (('ref2', resType, ('cap_b', )), )
    gen.createTask('task', framework, resources=tdSpecs)
    config = gen.createConfiguration()
    runWithReload(databases, config, check)
예제 #2
0
def testJobResourceRemovedWhileRunning(databases):
    """Test what happens when a non-TR resource removed while in use.
    Unlike with a TR, this is not a reason to fail the task, since it
    may be possible for the task to complete successfully.
    For example, removal of the resource may simply be the resource
    management being moved outside of SoftFab.
    """
    gen = DataGenerator(databases)
    resType = gen.createResourceType(pertask=True)
    fwName = gen.createFramework(name='testfw1',
                                 resources=[('ref1', resType, ())])
    taskName = gen.createTask('task1', fwName)
    trName = gen.createTaskRunner(capabilities=[fwName])
    config = gen.createConfiguration()
    resName = gen.createResource(resType)

    sanityCheck(gen, config)
    job, = config.createJobs(gen.owner)
    runner = databases.resourceDB[trName]
    resource = databases.resourceDB[resName]
    task = job.assignTask(runner)
    assert task is not None
    assert task.isRunning()
    assert resource.isReserved()
    databases.resourceDB.remove(resource)
    assert task.isRunning()
    assert task.result is None
    taskDone(job, taskName, ResultCode.OK)
    assert job.isExecutionFinished()
    assert job.hasFinalResult()
    assert job.result == ResultCode.OK
    assert job.getFinalResult() == ResultCode.OK
def testResReqAssignNonExclusive(databases):
    """Test assigning task using a non-exclusive resource."""
    def check(config):
        job, = config.createJobs(OWNER)
        taskRunner = databases.resourceDB[tr]

        # Try to assign with resource unavailable.
        reserveResource(databases.resourceDB, res)
        task = job.assignTask(taskRunner)
        assert task is None

        # Try to assign with resource available.
        freeResource(databases.resourceDB, res)
        task = job.assignTask(taskRunner)
        assert task is not None
        assert databases.resourceDB[res].isFree()
        job.taskDone('task', ResultCode.OK, 'summary text', (), {})
        assert databases.resourceDB[res].isFree()

    gen = DataGenerator(databases)
    resType = gen.createResourceType()
    res = gen.createResource(resType, ())
    tr = gen.createTaskRunner()

    fwSpecs = (
        ('ref', resType, ()),
        (taskRunnerResourceRefName, taskRunnerResourceTypeName, ()),
    )
    framework = gen.createFramework('fw', resources=fwSpecs)
    gen.createTask('task', framework, resources=())
    config = gen.createConfiguration()
    runWithReload(databases, config, check)
def testResReqDoubleReserve(databases, caplog):
    """Test reserving the same resource twice."""

    gen = DataGenerator(databases)
    resType = gen.createResourceType()
    res = gen.createResource(resType)

    resourceDB = databases.resourceDB
    reserveResource(resourceDB, res)

    resource = resourceDB[res]
    resource.reserve('twice')
    logged, = caplog.records
    assert logged.levelname == 'ERROR'
    assert 'already reserved' in logged.message
    assert resource.isReserved()