Exemple #1
0
def add_release(body):
    # we must require scope which depends on product
    required_permission = f'{SCOPE_PREFIX}/add_release/{body["product"]}'
    if not current_user.has_permissions(required_permission):
        user_permissions = ", ".join(current_user.get_permissions())
        abort(
            401,
            f"required permission: {required_permission}, user permissions: {user_permissions}"
        )

    product = body["product"]
    branch = body["branch"]

    product_disabled = branch in get_disabled_products().get(product, [])
    if current_user.type == AuthType.TASKCLUSTER and product_disabled:
        abort(401, "Taskcluster based submissions are disabled")

    session = current_app.db.session
    partial_updates = body.get("partial_updates")
    if partial_updates == "auto":
        if product not in [
                Product.FIREFOX.value, Product.DEVEDITION.value,
                Product.PINEBUILD.value
        ] or branch not in [
                "try",
                "releases/mozilla-beta",
                "projects/maple",
        ]:
            abort(400, "Partial suggestion works for automated betas only")

        partial_updates = _suggest_partials(product=product, branch=branch)
    release = Release(
        branch=branch,
        build_number=body["build_number"],
        partial_updates=partial_updates,
        product_key=body.get("product_key"),
        product=product,
        release_eta=body.get("release_eta"),
        repo_url=body.get("repo_url", ""),
        revision=body["revision"],
        status="scheduled",
        version=body["version"],
    )
    try:
        next_version = bump_version(release.product, release.version)
        common_input = {
            "build_number":
            release.build_number,
            "next_version":
            next_version,
            # specify version rather than relying on in-tree version,
            # so if a version bump happens between the build and an action task
            # revision, we still use the correct version.
            "version":
            release.version,
            "release_eta":
            release.release_eta,
            "release_enable_emefree":
            is_eme_free_enabled(release.product, release.version),
        }
        partners_enabled = is_partner_enabled(release.product, release.version)
        if int(release.version.split(".")[0]) >= 81:
            common_input["release_enable_partner_repack"] = partners_enabled
            common_input[
                "release_enable_partner_attribution"] = partners_enabled
        else:
            common_input["release_enable_partners"] = partners_enabled
        if release.partial_updates:
            common_input["partial_updates"] = release.partial_updates

        release.phases = generate_phases(release,
                                         common_input,
                                         verify_supported_flavors=True)
        session.add(release)
        session.commit()
    except UnsupportedFlavor as e:
        raise BadRequest(description=e.description)
    except (IntegrityError, TaskclusterRestFailure) as e:
        # Report back Taskcluster and SQL failures for better visibility of the
        # actual issue. Usually it happens when we cannot find the indexed
        # task or a duplicate release request accordingly.
        abort(400, str(e))

    logger.info("New release of %s", release.name)
    notify_via_matrix(product, f"New release of {release.name}")

    return release.json, 201
Exemple #2
0
def test_is_eme_free_enabled(product, version, result):
    assert is_eme_free_enabled(product, version) == result