Ejemplo n.º 1
0
def build_settings():
    build = g.build

    settings_form = forms.SettingsForm()

    if settings_form.validate_on_submit():
        settings_form.populate_obj(build)

        message = ('name=%s, send_email=%s, email_alias=%s' % (
            build.name, build.send_email, build.email_alias))
        auth.save_admin_log(build, changed_settings=True, message=message)

        db.session.add(build)
        db.session.commit()

        signals.build_updated.send(app, build=build, user=current_user)

        return redirect(url_for(
            request.endpoint,
            build_id=build.id))

    # Update form values for rendering
    settings_form.name.data = build.name
    settings_form.public.data = build.public
    settings_form.build_id.data = build.id
    settings_form.email_alias.data = build.email_alias
    settings_form.send_email.data = build.send_email

    return render_template(
        'view_settings.html',
        build=build,
        settings_form=settings_form)
Ejemplo n.º 2
0
def build_settings():
    build = g.build

    settings_form = forms.SettingsForm()

    if settings_form.validate_on_submit():
        settings_form.populate_obj(build)

        message = ('name=%s, send_email=%s, email_alias=%s' %
                   (build.name, build.send_email, build.email_alias))
        auth.save_admin_log(build, changed_settings=True, message=message)

        db.session.add(build)
        db.session.commit()

        signals.build_updated.send(app, build=build, user=current_user)

        return redirect(url_for(request.endpoint, build_id=build.id))

    # Update form values for rendering
    settings_form.name.data = build.name
    settings_form.public.data = build.public
    settings_form.build_id.data = build.id
    settings_form.email_alias.data = build.email_alias
    settings_form.send_email.data = build.send_email

    return render_template('view_settings.html',
                           build=build,
                           settings_form=settings_form)
Ejemplo n.º 3
0
def _create_build(build_name):

    build = models.Build(name=build_name)
    build.public = True

    db.session.add(build)
    db.session.flush()

    auth.save_admin_log(build, created_build=True, message=build.name)

    db.session.commit()

    logging.info('Created build via UI: build_id=%r, name=%r',
                 build.id, build.name)

    return db.session.query(models.Build).filter(models.Build.name == build_name).first()
Ejemplo n.º 4
0
def view_release():
    """Page for viewing all tests runs in a release."""
    build = g.build
    if request.method == 'POST':
        form = forms.ReleaseForm(request.form)
    else:
        form = forms.ReleaseForm(request.args)

    form.validate()

    ops = operations.BuildOps(build.id)
    release, run_list, stats_dict, approval_log = ops.get_release(
        form.name.data, form.number.data)

    if not release:
        abort(404)

    if request.method == 'POST':
        decision_states = (models.Release.REVIEWING, models.Release.RECEIVING,
                           models.Release.PROCESSING)

        if form.good.data and release.status in decision_states:
            release.status = models.Release.GOOD
            auth.save_admin_log(build, release_good=True, release=release)
        elif form.bad.data and release.status in decision_states:
            release.status = models.Release.BAD
            auth.save_admin_log(build, release_bad=True, release=release)
        elif form.reviewing.data and release.status in (models.Release.GOOD,
                                                        models.Release.BAD):
            release.status = models.Release.REVIEWING
            auth.save_admin_log(build, release_reviewing=True, release=release)
        else:
            logging.warning(
                'Bad state transition for name=%r, number=%r, form=%r',
                release.name, release.number, form.data)
            abort(400)

        db.session.add(release)
        db.session.commit()

        ops.evict()

        return redirect(
            url_for('view_release',
                    id=build.id,
                    name=release.name,
                    number=release.number))

    # Update form values for rendering
    form.good.data = True
    form.bad.data = True
    form.reviewing.data = True

    return render_template('view_release.html',
                           build=build,
                           release=release,
                           run_list=run_list,
                           release_form=form,
                           approval_log=approval_log,
                           stats_dict=stats_dict)
Ejemplo n.º 5
0
def new_build():
    """Page for crediting or editing a build."""
    form = forms.BuildForm()
    if form.validate_on_submit():
        build = models.Build()
        form.populate_obj(build)
        build.owners.append(current_user)

        db.session.add(build)
        db.session.flush()

        auth.save_admin_log(build, created_build=True, message=build.name)

        db.session.commit()

        operations.UserOps(current_user.get_id()).evict()

        logging.info('Created build via UI: build_id=%r, name=%r', build.id,
                     build.name)
        return redirect(url_for('view_build', id=build.id))

    return render_template('new_build.html', build_form=form)
Ejemplo n.º 6
0
def new_build():
    """Page for crediting or editing a build."""
    form = forms.BuildForm()
    if form.validate_on_submit():
        build = models.Build()
        form.populate_obj(build)
        build.owners.append(current_user)

        db.session.add(build)
        db.session.flush()

        auth.save_admin_log(build, created_build=True, message=build.name)

        db.session.commit()

        logging.info('Created build via UI: build_id=%r, name=%r',
                     build.id, build.name)
        return redirect(url_for('view_build', id=build.id))

    return render_template(
        'new_build.html',
        build_form=form)
Ejemplo n.º 7
0
def view_run():
    """Page for viewing before/after for a specific test run."""
    build = g.build
    if request.method == 'POST':
        form = forms.RunForm(request.form)
    else:
        form = forms.RunForm(request.args)

    form.validate()

    ops = operations.BuildOps(build.id)
    run, next_run, previous_run, approval_log = ops.get_run(
        form.name.data, form.number.data, form.test.data)

    if not run:
        abort(404)

    file_type = form.type.data
    image_file, log_file, config_file, sha1sum = (
        _get_artifact_context(run, file_type))

    if request.method == 'POST':
        if form.approve.data and run.status == models.Run.DIFF_FOUND:
            run.status = models.Run.DIFF_APPROVED
            auth.save_admin_log(build, run_approved=True, run=run)
        elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED:
            run.status = models.Run.DIFF_FOUND
            auth.save_admin_log(build, run_rejected=True, run=run)
        else:
            abort(400)

        db.session.add(run)
        db.session.commit()

        ops.evict()

        return redirect(url_for(
            request.endpoint,
            id=build.id,
            name=run.release.name,
            number=run.release.number,
            test=run.name,
            type=file_type))

    # Update form values for rendering
    form.approve.data = True
    form.disapprove.data = True

    context = dict(
        build=build,
        release=run.release,
        run=run,
        run_form=form,
        previous_run=previous_run,
        next_run=next_run,
        file_type=file_type,
        image_file=image_file,
        log_file=log_file,
        config_file=config_file,
        sha1sum=sha1sum,
        approval_log=approval_log)

    if file_type:
        template_name = 'view_artifact.html'
    else:
        template_name = 'view_run.html'

    response = flask.Response(render_template(template_name, **context))

    return response
Ejemplo n.º 8
0
def view_release():
    """Page for viewing all tests runs in a release."""
    build = g.build
    if request.method == 'POST':
        form = forms.ReleaseForm(request.form)
    else:
        form = forms.ReleaseForm(request.args)

    form.validate()

    ops = operations.BuildOps(build.id)
    release, run_list, stats_dict, approval_log = ops.get_release(
        form.name.data, form.number.data)

    if not release:
        abort(404)

    if request.method == 'POST':
        decision_states = (
            models.Release.REVIEWING,
            models.Release.RECEIVING,
            models.Release.PROCESSING)

        if form.good.data and release.status in decision_states:
            release.status = models.Release.GOOD
            auth.save_admin_log(build, release_good=True, release=release)
        elif form.bad.data and release.status in decision_states:
            release.status = models.Release.BAD
            auth.save_admin_log(build, release_bad=True, release=release)
        elif form.reviewing.data and release.status in (
                models.Release.GOOD, models.Release.BAD):
            release.status = models.Release.REVIEWING
            auth.save_admin_log(build, release_reviewing=True, release=release)
        else:
            logging.warning(
                'Bad state transition for name=%r, number=%r, form=%r',
                release.name, release.number, form.data)
            abort(400)

        db.session.add(release)
        db.session.commit()

        ops.evict()

        return redirect(url_for(
            'view_release',
            id=build.id,
            name=release.name,
            number=release.number))

    # Update form values for rendering
    form.good.data = True
    form.bad.data = True
    form.reviewing.data = True

    return render_template(
        'view_release.html',
        build=build,
        release=release,
        run_list=run_list,
        release_form=form,
        approval_log=approval_log,
        stats_dict=stats_dict)
Ejemplo n.º 9
0
def view_release():
    """Page for viewing all tests runs in a release."""
    build = g.build
    if request.method == 'POST':
        form = forms.ReleaseForm(request.form)
    else:
        form = forms.ReleaseForm(request.args)

    form.validate()

    ops = operations.BuildOps(build.id)
    release, run_list, approval_log = ops.get_release(
        form.name.data, form.number.data)

    if not release:
        abort(404)

    if request.method == 'POST':
        decision_states = (
            models.Release.REVIEWING, models.Release.RECEIVING)

        if form.good.data and release.status in decision_states:
            release.status = models.Release.GOOD
            auth.save_admin_log(build, release_good=True, release=release)
        elif form.bad.data and release.status in decision_states:
            release.status = models.Release.BAD
            auth.save_admin_log(build, release_bad=True, release=release)
        elif form.reviewing.data and release.status in (
                models.Release.GOOD, models.Release.BAD):
            release.status = models.Release.REVIEWING
            auth.save_admin_log(build, release_reviewing=True, release=release)
        else:
            logging.warning(
                'Bad state transition for name=%r, number=%r, form=%r',
                release.name, release.number, form.data)
            abort(400)

        db.session.add(release)
        db.session.commit()

        ops.evict()

        return redirect(url_for(
            'view_release',
            id=build.id,
            name=release.name,
            number=release.number))

    total, successful, failed, baseline = 0, 0, 0, 0
    for run in run_list:
        if run.status in (models.Run.DIFF_APPROVED,
                          models.Run.DIFF_NOT_FOUND):
            successful += 1
            total += 1
        elif run.status == models.Run.DIFF_FOUND:
            failed += 1
            total += 1
        elif run.status in (models.Run.NEEDS_DIFF,
                            models.Run.DATA_PENDING):
            total += 1
        elif run.status == models.Run.NO_DIFF_NEEDED:
            baseline += 1

    complete = successful + failed

    # Update form values for rendering
    form.good.data = True
    form.bad.data = True
    form.reviewing.data = True

    return render_template(
        'view_release.html',
        build=build,
        release=release,
        run_list=run_list,
        runs_total=total,
        runs_complete=complete,
        runs_successful=successful,
        runs_failed=failed,
        runs_baseline=baseline,
        release_form=form,
        approval_log=approval_log)
Ejemplo n.º 10
0
def view_run():
    """Page for viewing before/after for a specific test run."""
    build = g.build
    if request.method == 'POST':
        form = forms.RunForm(request.form)
    else:
        form = forms.RunForm(request.args)

    form.validate()

    ops = operations.BuildOps(build.id)
    run, next_run, previous_run, approval_log = ops.get_run(
        form.name.data, form.number.data, form.test.data)

    if not run:
        abort(404)

    file_type = form.type.data
    image_file, log_file, config_file, sha1sum = (_get_artifact_context(
        run, file_type))

    if request.method == 'POST':
        if form.approve.data and run.status == models.Run.DIFF_FOUND:
            run.status = models.Run.DIFF_APPROVED
            auth.save_admin_log(build, run_approved=True, run=run)
        elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED:
            run.status = models.Run.DIFF_FOUND
            auth.save_admin_log(build, run_rejected=True, run=run)
        else:
            abort(400)

        db.session.add(run)
        db.session.commit()

        ops.evict()

        return redirect(
            url_for(request.endpoint,
                    id=build.id,
                    name=run.release.name,
                    number=run.release.number,
                    test=run.name,
                    type=file_type))

    # Update form values for rendering
    form.approve.data = True
    form.disapprove.data = True

    context = dict(build=build,
                   release=run.release,
                   run=run,
                   run_form=form,
                   previous_run=previous_run,
                   next_run=next_run,
                   file_type=file_type,
                   image_file=image_file,
                   log_file=log_file,
                   config_file=config_file,
                   sha1sum=sha1sum,
                   approval_log=approval_log)

    if file_type:
        template_name = 'view_artifact.html'
    else:
        template_name = 'view_run.html'

    response = flask.Response(render_template(template_name, **context))

    return response
Ejemplo n.º 11
0
def view_run():
    """Page for viewing before/after for a specific test run."""
    build = g.build
    if request.method == 'POST':
        form = forms.RunForm(request.form)
    else:
        form = forms.RunForm(request.args)

    form.validate()

    run = (
        models.Run.query
        .join(models.Release)
        .filter(models.Release.name == form.name.data)
        .filter(models.Release.number == form.number.data)
        .filter(models.Run.name == form.test.data)
        .first())
    if not run:
        abort(404)

    file_type = form.type.data
    image_file, log_file, config_file, sha1sum = (
        _get_artifact_context(run, file_type))

    if request.method == 'POST':
        if form.approve.data and run.status == models.Run.DIFF_FOUND:
            run.status = models.Run.DIFF_APPROVED
            auth.save_admin_log(build, run_approved=True, run=run)
        elif form.disapprove.data and run.status == models.Run.DIFF_APPROVED:
            run.status = models.Run.DIFF_FOUND
            auth.save_admin_log(build, run_rejected=True, run=run)
        else:
            abort(400)

        db.session.add(run)
        db.session.commit()

        return redirect(url_for(
            request.endpoint,
            id=build.id,
            name=run.release.name,
            number=run.release.number,
            test=run.name,
            type=file_type))

    # We sort the runs in the release by diffs first, then by name. Simulate
    # that behavior here with multiple queries.
    previous_run = None
    next_run = None
    if run.status in models.Run.DIFF_NEEDED_STATES:
        previous_run = (
            models.Run.query
            .filter_by(release_id=run.release_id)
            .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
            .filter(models.Run.name < run.name)
            .order_by(models.Run.name.desc())
            .first())
        next_run = (
            models.Run.query
            .filter_by(release_id=run.release_id)
            .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
            .filter(models.Run.name > run.name)
            .order_by(models.Run.name)
            .first())

        if not next_run:
            next_run = (
                models.Run.query
                .filter_by(release_id=run.release_id)
                .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
                .order_by(models.Run.name)
                .first())
    else:
        previous_run = (
            models.Run.query
            .filter_by(release_id=run.release_id)
            .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
            .filter(models.Run.name < run.name)
            .order_by(models.Run.name.desc())
            .first())
        next_run = (
            models.Run.query
            .filter_by(release_id=run.release_id)
            .filter(~models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
            .filter(models.Run.name > run.name)
            .order_by(models.Run.name)
            .first())

        if not previous_run:
            previous_run = (
                models.Run.query
                .filter_by(release_id=run.release_id)
                .filter(models.Run.status.in_(models.Run.DIFF_NEEDED_STATES))
                .order_by(models.Run.name.desc())
                .first())

    # Update form values for rendering
    form.approve.data = True
    form.disapprove.data = True

    # Figure out who approved it
    approval_log = None
    if run.status == models.Run.DIFF_APPROVED:
        approval_log = (
            models.AdminLog.query
            .filter_by(run_id=run.id, log_type=models.AdminLog.RUN_APPROVED)
            .order_by(models.AdminLog.created.desc())
            .first())

    context = dict(
        build=build,
        release=run.release,
        run=run,
        run_form=form,
        previous_run=previous_run,
        next_run=next_run,
        file_type=file_type,
        image_file=image_file,
        log_file=log_file,
        config_file=config_file,
        sha1sum=sha1sum,
        approval_log=approval_log)

    if file_type:
        template_name = 'view_artifact.html'
    else:
        template_name = 'view_run.html'

    return render_template(template_name, **context)
Ejemplo n.º 12
0
def view_release():
    """Page for viewing all tests runs in a release."""
    build = g.build
    if request.method == 'POST':
        form = forms.ReleaseForm(request.form)
    else:
        form = forms.ReleaseForm(request.args)

    form.validate()

    release = (
        models.Release.query
        .filter_by(
            build_id=build.id,
            name=form.name.data,
            number=form.number.data)
        .first())
    if not release:
        abort(404)

    if request.method == 'POST':
        decision_states = (
            models.Release.REVIEWING, models.Release.RECEIVING)

        if form.good.data and release.status in decision_states:
            release.status = models.Release.GOOD
            auth.save_admin_log(build, release_good=True, release=release)
        elif form.bad.data and release.status in decision_states:
            release.status = models.Release.BAD
            auth.save_admin_log(build, release_bad=True, release=release)
        elif form.reviewing.data and release.status in (
                models.Release.GOOD, models.Release.BAD):
            release.status = models.Release.REVIEWING
            auth.save_admin_log(build, release_reviewing=True, release=release)
        else:
            logging.warning(
                'Bad state transition for name=%r, number=%r, form=%r',
                release.name, release.number, form.data)
            abort(400)

        db.session.add(release)
        db.session.commit()

        return redirect(url_for(
            'view_release',
            id=build.id,
            name=release.name,
            number=release.number))

    # Sort errors first, then by name. Also show errors that were manually
    # approved, so the paging sort order stays the same even after users
    # approve a diff on the run page.
    def sort(run):
        if run.status in models.Run.DIFF_NEEDED_STATES:
            return (0, run.name)
        return (1, run.name)

    run_list = sorted(release.runs, key=sort)

    total, complete, successful, failed, baseline = classify_runs(run_list)

    # Figure out who marked is as good it
    approval_log = None
    if release.status in (models.Release.GOOD, models.Release.BAD):
        approval_log = (
            models.AdminLog.query
            .filter_by(release_id=release.id)
            .filter(models.AdminLog.log_type.in_(
                (models.AdminLog.RELEASE_BAD, models.AdminLog.RELEASE_GOOD)))
            .order_by(models.AdminLog.created.desc())
            .first())

    # Update form values for rendering
    form.good.data = True
    form.bad.data = True
    form.reviewing.data = True

    return render_template(
        'view_release.html',
        build=build,
        release=release,
        run_list=run_list,
        runs_total=total,
        runs_complete=complete,
        runs_successful=successful,
        runs_failed=failed,
        runs_baseline=baseline,
        release_form=form,
        approval_log=approval_log)