Example #1
0
    def testLeaseAndFinish(self):
        """Tests leasing tasks and finishing them."""
        task_ids = []
        for i in xrange(10):
            next_id = work_queue.add(TEST_QUEUE,
                                     payload={
                                         'foo': i,
                                         'bar': 5.5,
                                         'baz': 'banana'
                                     })
            task_ids.append(next_id)
        db.session.commit()

        item = queue_worker.RemoteQueueWorkflow(TEST_QUEUE,
                                                TestQueueWorkflow,
                                                max_tasks=1,
                                                wait_seconds=0.01)
        item.root = True
        self.coordinator.input_queue.put(item)
        time.sleep(2)
        item.stop()
        self.coordinator.wait_one()

        db.session.flush()
        for task_id in task_ids:
            found = work_queue.WorkQueue.query.get((task_id, TEST_QUEUE))
            self.assertEquals(work_queue.WorkQueue.DONE, found.status)
Example #2
0
    def testLeaseAndFinish(self):
        """Tests leasing tasks and finishing them."""
        task_ids = []
        for i in xrange(10):
            next_id = work_queue.add(
                TEST_QUEUE,
                payload={'foo': i, 'bar': 5.5, 'baz': 'banana'})
            task_ids.append(next_id)
        db.session.commit()

        item = queue_worker.RemoteQueueWorkflow(
            TEST_QUEUE,
            TestQueueWorkflow,
            max_tasks=1,
            wait_seconds=0.01)
        item.root = True
        self.coordinator.input_queue.put(item)
        time.sleep(2)
        item.stop()
        self.coordinator.wait_one()

        db.session.flush()
        for task_id in task_ids:
            found = work_queue.WorkQueue.query.get((task_id, TEST_QUEUE))
            self.assertEquals(work_queue.WorkQueue.DONE, found.status)
Example #3
0
def handle_add(queue_name):
    """Adds a task to a queue."""
    source = request.form.get('source', request.remote_addr, type=str)
    try:
        task_id = work_queue.add(
            queue_name,
            payload=request.form.get('payload', type=str),
            content_type=request.form.get('content_type', type=str),
            source=source,
            task_id=request.form.get('task_id', type=str))
    except work_queue.Error, e:
        return utils.jsonify_error(e)
def handle_add(queue_name):
    """Adds a task to a queue."""
    source = request.form.get('source', request.remote_addr, type=str)
    try:
        task_id = work_queue.add(
            queue_name,
            payload=request.form.get('payload', type=str),
            content_type=request.form.get('content_type', type=str),
            source=source,
            task_id=request.form.get('task_id', type=str))
    except work_queue.Error, e:
        return utils.jsonify_error(e)
Example #5
0
def report_run():
    """Reports data for a run for a release candidate."""
    build = g.build
    release, run = _get_or_create_run(build)

    db.session.refresh(run, lockmode='update')

    current_url = request.form.get('url', type=str)
    current_image = request.form.get('image', type=str)
    current_log = request.form.get('log', type=str)
    current_config = request.form.get('config', type=str)

    ref_url = request.form.get('ref_url', type=str)
    ref_image = request.form.get('ref_image', type=str)
    ref_log = request.form.get('ref_log', type=str)
    ref_config = request.form.get('ref_config', type=str)

    diff_success = request.form.get('diff_success', type=str)
    diff_image = request.form.get('diff_image', type=str)
    diff_log = request.form.get('diff_log', type=str)

    if current_url:
        run.url = current_url
    if current_image:
        run.image = current_image
    if current_log:
        run.log = current_log
    if current_config:
        run.config = current_config
    if current_image or current_log or current_config:
        logging.info(
            'Saved run data: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, url=%r, '
            'image=%r, log=%r, config=%r', build.id, release.name,
            release.number, run.name, run.url, run.image, run.log, run.config)

    if ref_url:
        run.ref_url = ref_url
    if ref_image:
        run.ref_image = ref_image
    if ref_log:
        run.ref_log = ref_log
    if ref_config:
        run.ref_config = ref_config
    if ref_image or ref_log or ref_config:
        logging.info(
            'Saved reference data: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, ref_url=%r, '
            'ref_image=%r, ref_log=%r, ref_config=%r', build.id, release.name,
            release.number, run.name, run.ref_url, run.ref_image, run.ref_log,
            run.ref_config)

    if diff_image:
        run.diff_image = diff_image
    if diff_log:
        run.diff_log = diff_log

    if diff_image or diff_log:
        logging.info(
            'Saved pdiff: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, '
            'diff_image=%r, diff_log=%r', build.id, release.name,
            release.number, run.name, run.diff_image, run.diff_log)

    if run.image and run.diff_image:
        run.status = models.Run.DIFF_FOUND
    elif run.image and run.ref_image and not run.diff_log:
        run.status = models.Run.NEEDS_DIFF
    elif run.image and run.ref_image and diff_success:
        run.status = models.Run.DIFF_NOT_FOUND
    elif run.image and not run.ref_config:
        run.status = models.Run.NO_DIFF_NEEDED

    # TODO: Consider adding another status of "diff failed" or capture
    # failed for situations where it couldn't finish.

    # TODO: Verify the build has access to both the current_image and
    # the reference_sha1sum so they can't make a diff from a black image
    # and still see private data in the diff image.

    if run.status == models.Run.NEEDS_DIFF:
        task_id = '%s:%s:%s' % (run.id, run.image, run.ref_image)
        logging.info('Enqueuing pdiff task=%r', task_id)

        work_queue.add(constants.PDIFF_QUEUE_NAME,
                       payload=dict(
                           build_id=build.id,
                           release_name=release.name,
                           release_number=release.number,
                           run_name=run.name,
                           run_sha1sum=run.image,
                           reference_sha1sum=run.ref_image,
                       ),
                       build_id=build.id,
                       release_id=release.id,
                       run_id=run.id,
                       source='report_run',
                       task_id=task_id)

    # Flush the run so querying for Runs in _check_release_done_processing
    # will be find the new run too and we won't deadlock.
    db.session.add(run)
    db.session.flush()

    _check_release_done_processing(release)
    db.session.commit()

    signals.run_updated_via_api.send(app,
                                     build=build,
                                     release=release,
                                     run=run)

    logging.info(
        'Updated run: build_id=%r, release_name=%r, '
        'release_number=%d, run_name=%r, status=%r', build.id, release.name,
        release.number, run.name, run.status)

    return flask.jsonify(success=True)
Example #6
0
    suffix = ''
    if baseline:
        suffix = ':baseline'

    task_id = '%s:%s%s' % (run.id, hashlib.sha1(url).hexdigest(), suffix)
    logging.info('Enqueueing capture task=%r, baseline=%r', task_id, baseline)

    work_queue.add(constants.CAPTURE_QUEUE_NAME,
                   payload=dict(
                       build_id=build.id,
                       release_name=release.name,
                       release_number=release.number,
                       run_name=run.name,
                       url=url,
                       config_sha1sum=config_artifact.id,
                       baseline=baseline,
                   ),
                   build_id=build.id,
                   release_id=release.id,
                   run_id=run.id,
                   source='request_run',
                   task_id=task_id)

    # Set the URL and config early to indicate to report_run that there is
    # still data pending even if 'image' and 'ref_image' are unset.
    if baseline:
        run.ref_url = url
        run.ref_config = config_artifact.id
    else:
        run.url = url
Example #7
0
def report_run():
    """Reports data for a run for a release candidate."""
    build = g.build
    release, run = _get_or_create_run(build)

    current_url = request.form.get('url', type=str)
    current_image = request.form.get('image', type=str)
    current_log = request.form.get('log', type=str)
    current_config = request.form.get('config', type=str)

    ref_url = request.form.get('ref_url', type=str)
    ref_image = request.form.get('ref_image', type=str)
    ref_log = request.form.get('ref_log', type=str)
    ref_config = request.form.get('ref_config', type=str)

    diff_success = request.form.get('diff_success', type=str)
    diff_image = request.form.get('diff_image', type=str)
    diff_log = request.form.get('diff_log', type=str)

    if current_url:
        run.url = current_url
    if current_image:
        run.image = current_image
    if current_log:
        run.log = current_log
    if current_config:
        run.config = current_config
    if current_image or current_log or current_config:
        logging.info('Saved run data: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, url=%r, '
                     'image=%r, log=%r, config=%r',
                     build.id, release.name, release.number, run.name,
                     run.url, run.image, run.log, run.config)

    if ref_url:
        run.ref_url = ref_url
    if ref_image:
        run.ref_image = ref_image
    if ref_log:
        run.ref_log = ref_log
    if ref_config:
        run.ref_config = ref_config
    if ref_image or ref_log or ref_config:
        logging.info('Saved reference data: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, ref_url=%r, '
                     'ref_image=%r, ref_log=%r, ref_config=%r',
                     build.id, release.name, release.number, run.name,
                     run.ref_url, run.ref_image, run.ref_log, run.ref_config)

    if diff_image:
        run.diff_image = diff_image
    if diff_log:
        run.diff_log = diff_log

    if diff_image or diff_log:
        logging.info('Saved pdiff: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, '
                     'diff_image=%r, diff_log=%r',
                     build.id, release.name, release.number, run.name,
                     run.diff_image, run.diff_log)

    if run.image and run.diff_image:
        run.status = models.Run.DIFF_FOUND
    elif run.image and run.ref_image and not run.diff_log:
        run.status = models.Run.NEEDS_DIFF
    elif run.image and run.ref_image and diff_success:
        run.status = models.Run.DIFF_NOT_FOUND
    elif run.image and not run.ref_config:
        run.status = models.Run.NO_DIFF_NEEDED

    # TODO: Consider adding another status of "diff failed" or capture
    # failed for situations where it couldn't finish.

    # TODO: Verify the build has access to both the current_image and
    # the reference_sha1sum so they can't make a diff from a black image
    # and still see private data in the diff image.

    if run.status == models.Run.NEEDS_DIFF:
        task_id = '%s:%s:%s' % (run.id, run.image, run.ref_image)
        logging.info('Enqueuing pdiff task=%r', task_id)

        work_queue.add(
            constants.PDIFF_QUEUE_NAME,
            payload=dict(
                build_id=build.id,
                release_name=release.name,
                release_number=release.number,
                run_name=run.name,
                run_sha1sum=run.image,
                reference_sha1sum=run.ref_image,
            ),
            source='report_run',
            task_id=task_id)

    # Flush the run so querying for Runs in _check_release_done_processing
    # will be find the new run too.
    db.session.add(run)
    _check_release_done_processing(release)
    db.session.commit()

    logging.info('Updated run: build_id=%r, release_name=%r, '
                 'release_number=%d, run_name=%r, status=%r',
                 build.id, release.name, release.number, run.name, run.status)

    return flask.jsonify(success=True)
Example #8
0
    db.session.flush()

    suffix = ''
    if baseline:
        suffix = ':baseline'

    task_id = '%s:%s%s' % (run.id, hashlib.sha1(url).hexdigest(), suffix)
    logging.info('Enqueueing capture task=%r, baseline=%r', task_id, baseline)

    work_queue.add(
        constants.CAPTURE_QUEUE_NAME,
        payload=dict(
            build_id=build.id,
            release_name=release.name,
            release_number=release.number,
            run_name=run.name,
            url=url,
            config_sha1sum=config_artifact.id,
            baseline=baseline,
        ),
        source='request_run',
        task_id=task_id)

    # Set the URL and config early to indicate to report_run that there is
    # still data pending even if 'image' and 'ref_image' are unset.
    if baseline:
        run.ref_url = url
        run.ref_config = config_artifact.id
    else:
        run.url = url
        run.config = config_artifact.id
Example #9
0
def report_run():
    """Reports data for a run for a release candidate."""
    build = g.build
    release, run = _get_or_create_run(build)

    db.session.refresh(run, lockmode='update')

    current_url = request.form.get('url', type=str)
    current_image = request.form.get('image', type=str)
    current_log = request.form.get('log', type=str)
    current_config = request.form.get('config', type=str)

    ref_url = request.form.get('ref_url', type=str)
    ref_image = request.form.get('ref_image', type=str)
    ref_log = request.form.get('ref_log', type=str)
    ref_config = request.form.get('ref_config', type=str)

    diff_failed = request.form.get('diff_failed', type=str)
    diff_image = request.form.get('diff_image', type=str)
    diff_log = request.form.get('diff_log', type=str)

    distortion = request.form.get('distortion', default=None, type=float)
    run_failed = request.form.get('run_failed', type=str)

    if current_url:
        run.url = current_url
    if current_image:
        run.image = current_image
    if current_log:
        run.log = current_log
    if current_config:
        run.config = current_config
    if current_image or current_log or current_config:
        logging.info(
            'Saving run data: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, url=%r, '
            'image=%r, log=%r, config=%r, run_failed=%r', build.id,
            release.name, release.number, run.name, run.url, run.image,
            run.log, run.config, run_failed)

    if ref_url:
        run.ref_url = ref_url
    if ref_image:
        run.ref_image = ref_image
    if ref_log:
        run.ref_log = ref_log
    if ref_config:
        run.ref_config = ref_config
    if ref_image or ref_log or ref_config:
        logging.info(
            'Saved reference data: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, ref_url=%r, '
            'ref_image=%r, ref_log=%r, ref_config=%r', build.id, release.name,
            release.number, run.name, run.ref_url, run.ref_image, run.ref_log,
            run.ref_config)

    if diff_image:
        run.diff_image = diff_image
    if diff_log:
        run.diff_log = diff_log
    if distortion:
        run.distortion = distortion

    if diff_image or diff_log:
        logging.info(
            'Saved pdiff: build_id=%r, release_name=%r, '
            'release_number=%d, run_name=%r, diff_image=%r, '
            'diff_log=%r, diff_failed=%r, distortion=%r', build.id,
            release.name, release.number, run.name, run.diff_image,
            run.diff_log, diff_failed, distortion)

    if run.image and run.diff_image:
        run.status = models.Run.DIFF_FOUND
    elif run.image and run.ref_image and not run.diff_log:
        run.status = models.Run.NEEDS_DIFF
    elif run.image and run.ref_image and not diff_failed:
        run.status = models.Run.DIFF_NOT_FOUND
    elif run.image and not run.ref_config:
        run.status = models.Run.NO_DIFF_NEEDED
    elif run_failed or diff_failed:
        run.status = models.Run.FAILED
    else:
        # NOTE: Intentionally do not transition state here in the default case.
        # We allow multiple background workers to be writing to the same Run in
        # parallel updating its various properties.
        pass

    # TODO: Verify the build has access to both the current_image and
    # the reference_sha1sum so they can't make a diff from a black image
    # and still see private data in the diff image.

    if run.status == models.Run.NEEDS_DIFF:
        task_id = '%s:%s:%s' % (run.id, run.image, run.ref_image)
        logging.info('Enqueuing pdiff task=%r', task_id)

        work_queue.add(constants.PDIFF_QUEUE_NAME,
                       payload=dict(
                           build_id=build.id,
                           release_name=release.name,
                           release_number=release.number,
                           run_name=run.name,
                           run_sha1sum=run.image,
                           reference_sha1sum=run.ref_image,
                       ),
                       build_id=build.id,
                       release_id=release.id,
                       run_id=run.id,
                       source='report_run',
                       task_id=task_id)

    # Flush the run so querying for Runs in _check_release_done_processing
    # will be find the new run too and we won't deadlock.
    db.session.add(run)
    db.session.flush()

    _check_release_done_processing(release)
    db.session.commit()

    signals.run_updated_via_api.send(app,
                                     build=build,
                                     release=release,
                                     run=run)

    logging.info(
        'Updated run: build_id=%r, release_name=%r, '
        'release_number=%d, run_name=%r, status=%r', build.id, release.name,
        release.number, run.name, run.status)

    return flask.jsonify(success=True)
Example #10
0
File: api.py Project: Medium/dpxdt
def report_run():
    """Reports data for a run for a release candidate."""
    build = g.build
    release, run = _get_or_create_run(build)

    db.session.refresh(run, lockmode='update')

    current_url = request.form.get('url', type=str)
    current_image = request.form.get('image', type=str)
    current_log = request.form.get('log', type=str)
    current_config = request.form.get('config', type=str)

    ref_url = request.form.get('ref_url', type=str)
    ref_image = request.form.get('ref_image', type=str)
    ref_log = request.form.get('ref_log', type=str)
    ref_config = request.form.get('ref_config', type=str)

    diff_failed = request.form.get('diff_failed', type=str)
    diff_image = request.form.get('diff_image', type=str)
    diff_log = request.form.get('diff_log', type=str)

    distortion = request.form.get('distortion', default=None, type=float)
    run_failed = request.form.get('run_failed', type=str)

    if current_url:
        run.url = current_url
    if current_image:
        run.image = current_image
    if current_log:
        run.log = current_log
    if current_config:
        run.config = current_config
    if current_image or current_log or current_config:
        logging.info('Saving run data: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, url=%r, '
                     'image=%r, log=%r, config=%r, run_failed=%r',
                     build.id, release.name, release.number, run.name,
                     run.url, run.image, run.log, run.config, run_failed)

    if ref_url:
        run.ref_url = ref_url
    if ref_image:
        run.ref_image = ref_image
    if ref_log:
        run.ref_log = ref_log
    if ref_config:
        run.ref_config = ref_config
    if ref_image or ref_log or ref_config:
        logging.info('Saved reference data: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, ref_url=%r, '
                     'ref_image=%r, ref_log=%r, ref_config=%r',
                     build.id, release.name, release.number, run.name,
                     run.ref_url, run.ref_image, run.ref_log, run.ref_config)

    if diff_image:
        run.diff_image = diff_image
    if diff_log:
        run.diff_log = diff_log
    if distortion:
        run.distortion = distortion

    if diff_image or diff_log:
        logging.info('Saved pdiff: build_id=%r, release_name=%r, '
                     'release_number=%d, run_name=%r, diff_image=%r, '
                     'diff_log=%r, diff_failed=%r, distortion=%r',
                     build.id, release.name, release.number, run.name,
                     run.diff_image, run.diff_log, diff_failed, distortion)

    if run.image and run.diff_image:
        run.status = models.Run.DIFF_FOUND
    elif run.image and run.ref_image and not run.diff_log:
        run.status = models.Run.NEEDS_DIFF
    elif run.image and run.ref_image and not diff_failed:
        run.status = models.Run.DIFF_NOT_FOUND
    elif run.image and not run.ref_config:
        run.status = models.Run.NO_DIFF_NEEDED
    elif run_failed or diff_failed:
        run.status = models.Run.FAILED
    else:
        # NOTE: Intentionally do not transition state here in the default case.
        # We allow multiple background workers to be writing to the same Run in
        # parallel updating its various properties.
        pass

    # TODO: Verify the build has access to both the current_image and
    # the reference_sha1sum so they can't make a diff from a black image
    # and still see private data in the diff image.

    if run.status == models.Run.NEEDS_DIFF:
        task_id = '%s:%s:%s' % (run.id, run.image, run.ref_image)
        logging.info('Enqueuing pdiff task=%r', task_id)

        work_queue.add(
            constants.PDIFF_QUEUE_NAME,
            payload=dict(
                build_id=build.id,
                release_name=release.name,
                release_number=release.number,
                run_name=run.name,
                run_sha1sum=run.image,
                reference_sha1sum=run.ref_image,
            ),
            build_id=build.id,
            release_id=release.id,
            run_id=run.id,
            source='report_run',
            task_id=task_id)

    # Flush the run so querying for Runs in _check_release_done_processing
    # will be find the new run too and we won't deadlock.
    db.session.add(run)
    db.session.flush()

    _check_release_done_processing(release)
    db.session.commit()

    signals.run_updated_via_api.send(
        app, build=build, release=release, run=run)

    logging.info('Updated run: build_id=%r, release_name=%r, '
                 'release_number=%d, run_name=%r, status=%r',
                 build.id, release.name, release.number, run.name, run.status)

    return flask.jsonify(success=True)
Example #11
0
def report_run():
    """Reports data for a run for a release candidate."""
    build = g.build
    release, run = _get_or_create_run(build)

    db.session.refresh(run, lockmode="update")

    current_url = request.form.get("url", type=str)
    current_image = request.form.get("image", type=str)
    current_log = request.form.get("log", type=str)
    current_config = request.form.get("config", type=str)

    ref_url = request.form.get("ref_url", type=str)
    ref_image = request.form.get("ref_image", type=str)
    ref_log = request.form.get("ref_log", type=str)
    ref_config = request.form.get("ref_config", type=str)

    diff_success = request.form.get("diff_success", type=str)
    diff_image = request.form.get("diff_image", type=str)
    diff_log = request.form.get("diff_log", type=str)

    if current_url:
        run.url = current_url
    if current_image:
        run.image = current_image
    if current_log:
        run.log = current_log
    if current_config:
        run.config = current_config
    if current_image or current_log or current_config:
        logging.info(
            "Saved run data: build_id=%r, release_name=%r, "
            "release_number=%d, run_name=%r, url=%r, "
            "image=%r, log=%r, config=%r",
            build.id,
            release.name,
            release.number,
            run.name,
            run.url,
            run.image,
            run.log,
            run.config,
        )

    if ref_url:
        run.ref_url = ref_url
    if ref_image:
        run.ref_image = ref_image
    if ref_log:
        run.ref_log = ref_log
    if ref_config:
        run.ref_config = ref_config
    if ref_image or ref_log or ref_config:
        logging.info(
            "Saved reference data: build_id=%r, release_name=%r, "
            "release_number=%d, run_name=%r, ref_url=%r, "
            "ref_image=%r, ref_log=%r, ref_config=%r",
            build.id,
            release.name,
            release.number,
            run.name,
            run.ref_url,
            run.ref_image,
            run.ref_log,
            run.ref_config,
        )

    if diff_image:
        run.diff_image = diff_image
    if diff_log:
        run.diff_log = diff_log

    if diff_image or diff_log:
        logging.info(
            "Saved pdiff: build_id=%r, release_name=%r, "
            "release_number=%d, run_name=%r, "
            "diff_image=%r, diff_log=%r",
            build.id,
            release.name,
            release.number,
            run.name,
            run.diff_image,
            run.diff_log,
        )

    if run.image and run.diff_image:
        run.status = models.Run.DIFF_FOUND
    elif run.image and run.ref_image and not run.diff_log:
        run.status = models.Run.NEEDS_DIFF
    elif run.image and run.ref_image and diff_success:
        run.status = models.Run.DIFF_NOT_FOUND
    elif run.image and not run.ref_config:
        run.status = models.Run.NO_DIFF_NEEDED

    # TODO: Consider adding another status of "diff failed" or capture
    # failed for situations where it couldn't finish.

    # TODO: Verify the build has access to both the current_image and
    # the reference_sha1sum so they can't make a diff from a black image
    # and still see private data in the diff image.

    if run.status == models.Run.NEEDS_DIFF:
        task_id = "%s:%s:%s" % (run.id, run.image, run.ref_image)
        logging.info("Enqueuing pdiff task=%r", task_id)

        work_queue.add(
            constants.PDIFF_QUEUE_NAME,
            payload=dict(
                build_id=build.id,
                release_name=release.name,
                release_number=release.number,
                run_name=run.name,
                run_sha1sum=run.image,
                reference_sha1sum=run.ref_image,
            ),
            source="report_run",
            task_id=task_id,
        )

    # Flush the run so querying for Runs in _check_release_done_processing
    # will be find the new run too and we won't deadlock.
    db.session.add(run)
    db.session.flush()

    _check_release_done_processing(release)
    db.session.commit()

    signals.run_updated_via_api.send(app, build=build, release=release, run=run)

    logging.info(
        "Updated run: build_id=%r, release_name=%r, " "release_number=%d, run_name=%r, status=%r",
        build.id,
        release.name,
        release.number,
        run.name,
        run.status,
    )

    return flask.jsonify(success=True)