Example #1
0
    def test_get_build_batches(self):
        pkg1 = Modulemd.ComponentRpm(name="pkg1", rationale="rationale")
        pkg2 = Modulemd.ComponentRpm(name="pkg2", rationale="rationale")
        pkg3 = Modulemd.ComponentRpm(name="pkg3", rationale="rationale", buildorder=1)
        pkg4 = Modulemd.ComponentRpm(name="pkg4", rationale="rationale")
        pkg4.set_buildorder(-20) # https://github.com/fedora-modularity/libmodulemd/issues/77#issuecomment-418198410
        pkg5 = Modulemd.ComponentRpm(name="pkg5", rationale="rationale", buildorder=50)

        # Test trivial usage
        assert ModuleBuildFacade.get_build_batches({}) == []

        # Test multiple components with same buildorder
        rpms = {"pkg1": pkg1, "pkg2": pkg2}
        expected_batches = [{"pkg1": pkg1, "pkg2": pkg2}]
        assert ModuleBuildFacade.get_build_batches(rpms) == expected_batches

        # Test component with buildorder
        rpms = {"pkg3": pkg3, "pkg1": pkg1, "pkg2": pkg2}
        expected_batches = [{"pkg1": pkg1, "pkg2": pkg2}, {"pkg3": pkg3}]
        assert ModuleBuildFacade.get_build_batches(rpms) == expected_batches

        # Test negative buildorder
        rpms = {"pkg1": pkg1, "pkg2": pkg2, "pkg4": pkg4}
        expected_batches = [{"pkg4": pkg4}, {"pkg1": pkg1, "pkg2": pkg2}]
        assert ModuleBuildFacade.get_build_batches(rpms) == expected_batches

        # Test various buildorders at once
        rpms = {"pkg5": pkg5, "pkg3": pkg3, "pkg2": pkg2, "pkg4": pkg4, "pkg1":pkg1}
        expected_batches = [{"pkg4": pkg4}, {"pkg1": pkg1, "pkg2": pkg2}, {"pkg3": pkg3}, {"pkg5": pkg5}]
        assert ModuleBuildFacade.get_build_batches(rpms) == expected_batches
Example #2
0
def copr_build_module(copr):
    form = forms.ModuleBuildForm(meta={'csrf': False})
    if not form.validate_on_submit():
        raise LegacyApiError(form.errors)

    facade = None
    try:
        mod_info = ModuleProvider.from_input(form.modulemd.data
                                             or form.scmurl.data)
        facade = ModuleBuildFacade(flask.g.user, copr, mod_info.yaml,
                                   mod_info.filename)
        module = facade.submit_build()
        db.session.commit()

        return flask.jsonify({
            "output": "ok",
            "message": "Created module {}".format(module.nsv),
        })

    except (ValidationError, RequestException, InvalidSchema) as ex:
        raise LegacyApiError(str(ex))

    except sqlalchemy.exc.IntegrityError:
        raise LegacyApiError("Module {}-{}-{} already exists".format(
            facade.modulemd.name, facade.modulemd.stream,
            facade.modulemd.version))
Example #3
0
    def test_add_builds_batches(self, f_users, f_coprs, f_mock_chroots, f_builds, f_modules, f_db):
        pkg1 = Modulemd.ComponentRpm(name="foo", rationale="foo package")
        pkg2 = Modulemd.ComponentRpm(name="bar", rationale="bar package", buildorder=10)
        pkg3 = Modulemd.ComponentRpm(name="baz", rationale="baz package", buildorder=10)

        generator = ModulemdGenerator(name="testmodule", stream="master", version=123, summary="some summary")
        facade = ModuleBuildFacade(self.u1, self.c1, generator.generate(), "testmodule.yaml")
        facade.add_builds({"foo": pkg1, "bar": pkg2, "baz": pkg3}, self.m1)

        b1, b2, b3 = self.m1.builds
        assert b1.batch != b2.batch == b3.batch
        assert b2.batch.blocked_by == b1.batch
Example #4
0
    def test_buildorder_issue_599(self):
        pkg1 = Modulemd.ComponentRpm(name="jss", rationale="JSS packages")
        pkg2 = Modulemd.ComponentRpm(name="tomcatjss",
                                     rationale="TomcatJSS packages",
                                     buildorder=10)
        pkg3 = Modulemd.ComponentRpm(name="ldapjdk",
                                     rationale="LDAP JDK packages",
                                     buildorder=10)
        pkg4 = Modulemd.ComponentRpm(name="pki-core",
                                     rationale="PKI Core packages",
                                     buildorder=20)
        pkg5 = Modulemd.ComponentRpm(name="dogtag-pki",
                                     rationale="Dogtag PKI packages",
                                     buildorder=20)

        rpms = {
            "jss": pkg1,
            "tomcatjss": pkg2,
            "ldapjdk": pkg3,
            "pki-core": pkg4,
            "dogtag-pki": pkg5
        }
        batches = ModuleBuildFacade.get_build_batches(rpms)

        assert len(batches) == 3
        assert batches[0] == {"jss": pkg1}
        assert batches[1] == {"tomcatjss": pkg2, "ldapjdk": pkg3}
        assert batches[2] == {"pki-core": pkg4, "dogtag-pki": pkg5}
Example #5
0
def build_module(copr, form):
    if not form.validate_on_submit():
        # WORKAROUND append those which are not in min_entries
        for i in range(2, len(form.profile_names)):
            form.profile_pkgs.append_entry()
        return render_create_module(copr,
                                    form,
                                    profiles=len(form.profile_names))

    summary = "Module from Copr repository: {}".format(copr.full_name)
    generator = ModulemdGenerator(str(copr.name),
                                  summary=summary,
                                  config=app.config)
    generator.add_filter(form.filter.data)
    generator.add_api(form.api.data)
    generator.add_profiles(
        enumerate(zip(form.profile_names.data, form.profile_pkgs.data)))
    generator.add_components(form.packages.data, form.filter.data,
                             form.builds.data)
    yaml = generator.generate()

    facade = None
    try:
        facade = ModuleBuildFacade(flask.g.user, copr, yaml)
        module = facade.submit_build()
        db.session.commit()

        flask.flash(
            "Modulemd yaml file successfully generated and submitted to be build as {}"
            .format(module.nsv), "success")
        return flask.redirect(url_for_copr_details(copr))

    except ValidationError as ex:
        flask.flash(ex.message, "error")
        return render_create_module(copr, form, len(form.profile_names))

    except sqlalchemy.exc.IntegrityError:
        flask.flash(
            "Module {}-{}-{} already exists".format(facade.modulemd.name,
                                                    facade.modulemd.stream,
                                                    facade.modulemd.version),
            "error")
        db.session.rollback()
        return render_create_module(copr, form, len(form.profile_names))
Example #6
0
    def test_platform_chroots(self, f_users, f_coprs, f_mock_chroots_many, f_builds, f_modules, f_db):
        fedora_chroots = [chroot.name for chroot in self.c1.mock_chroots if chroot.name.startswith("fedora")]

        # Test excluding platform chroots
        CoprChrootsLogic.update_from_names(self.u1, self.c1, fedora_chroots)
        generator = ModulemdGenerator(name="testmodule", stream="master", version=123, summary="some summary")
        generator.mmd.set_buildrequires({"platform": "-f22"})
        facade = ModuleBuildFacade(self.u1, self.c1, generator.generate(), "testmodule.yaml")
        assert {chroot.name for chroot in self.c1.active_chroots} == set(fedora_chroots)
        assert ("fedora-22-i386" not in facade.platform_chroots) and ("fedora-22-x86_64" in fedora_chroots)
        assert ("fedora-22-x86_64" not in facade.platform_chroots) and ("fedora-22-x86_64" in fedora_chroots)

        # Test setting platform chroots from scratch
        CoprChrootsLogic.update_from_names(self.u1, self.c1, fedora_chroots)
        generator = ModulemdGenerator(name="testmodule", stream="master", version=123, summary="some summary")
        generator.mmd.set_buildrequires({"platform": "f22"})
        facade = ModuleBuildFacade(self.u1, self.c1, generator.generate(), "testmodule.yaml")
        assert {chroot.name for chroot in self.c1.active_chroots} == set(fedora_chroots)
        assert set(facade.platform_chroots) == {"fedora-22-i386", "fedora-22-x86_64"}
Example #7
0
def build_module(ownername, projectname):
    copr = get_copr(ownername, projectname)
    form = forms.ModuleBuildForm(meta={'csrf': False})
    if not form.validate_on_submit():
        raise BadRequest(form.errors)

    facade = None
    try:
        mod_info = ModuleProvider.from_input(form.modulemd.data
                                             or form.scmurl.data)
        facade = ModuleBuildFacade(flask.g.user, copr, mod_info.yaml,
                                   mod_info.filename)
        module = facade.submit_build()
        db.session.commit()
        return flask.jsonify(to_dict(module))

    except (ValidationError, RequestException, InvalidSchema) as ex:
        raise BadRequest(str(ex))

    except sqlalchemy.exc.IntegrityError:
        raise DuplicateException("Module {}-{}-{} already exists".format(
            facade.modulemd.get_name(), facade.modulemd.get_stream(),
            facade.modulemd.get_version()))