Esempio n. 1
0
    def f_build_few_chroots(self):
        """
            Requires fixture: f_mock_chroots_many
        """
        self.b_few_chroots = models.Build(
            id=2345,
            copr=self.c1,
            user=self.u1,
            submitted_on=50,
            pkgs="http://example.com/copr-keygen-1.58-1.fc20.src.rpm",
            pkg_version="1.58")

        self.db.session.add(self.b_few_chroots)
        self.status_by_chroot = {
            'epel-5-i386': 0,
            'fedora-20-i386': 1,
            'fedora-20-x86_64': 1,
            'fedora-21-i386': 1,
            'fedora-21-x86_64': 4
        }

        for chroot in self.b_few_chroots.copr.active_chroots:
            if chroot.name in self.status_by_chroot:
                buildchroot = models.BuildChroot(
                    build=self.b_few_chroots,
                    mock_chroot=chroot,
                    status=self.status_by_chroot[chroot.name],
                    git_hash="12345",
                )
                self.db.session.add(buildchroot)

        self.db.session.add(self.b_few_chroots)
Esempio n. 2
0
    def f_builds(self):
        self.b1 = models.Build(
            copr=self.c1, user=self.u1, submitted_on=50, started_on=139086644000)
        self.b2 = models.Build(
            copr=self.c1, user=self.u2, submitted_on=10, ended_on=139086644000)
        self.b3 = models.Build(
            copr=self.c2, user=self.u2, submitted_on=10)
        self.b4 = models.Build(
            copr=self.c2, user=self.u2, submitted_on=100)

        self.b1_bc = []
        self.b2_bc = []
        self.b3_bc = []
        self.b4_bc = []

        for build, build_chroots in zip(
                [self.b1, self.b2, self.b3, self.b4],
                [self.b1_bc, self.b2_bc, self.b3_bc, self.b4_bc]):


            status = None
            if build is self.b1:  # this build is going to be deleted
                status = 1  # succeeded
            for chroot in build.copr.active_chroots:
                buildchroot = models.BuildChroot(
                    build=build,
                    mock_chroot=chroot,
                    status=status)

                build_chroots.append(buildchroot)
                self.db.session.add(buildchroot)

        self.db.session.add_all([self.b1, self.b2, self.b3, self.b4])
Esempio n. 3
0
    def rebuild_package(cls, package):
        build = models.Build(user=None,
                             pkgs=None,
                             package_id=package.id,
                             copr=package.copr,
                             repos=package.copr.repos,
                             source_type=package.source_type,
                             source_json=package.source_json,
                             submitted_on=int(time.time()),
                             enable_net=package.enable_net,
                             timeout=DEFAULT_BUILD_TIMEOUT)

        db.session.add(build)

        chroots = package.copr.active_chroots

        status = helpers.StatusEnum("importing")

        for chroot in chroots:
            buildchroot = models.BuildChroot(build=build,
                                             status=status,
                                             mock_chroot=chroot,
                                             git_hash=None)

            db.session.add(buildchroot)

        return build
Esempio n. 4
0
    def f_builds(self):
        self.p1 = models.Package(copr=self.c1,
                                 name="hello-world",
                                 source_type=0)
        self.p2 = models.Package(copr=self.c2,
                                 name="hello-world",
                                 source_type=0)

        self.b1 = models.Build(copr=self.c1,
                               package=self.p1,
                               user=self.u1,
                               submitted_on=50)
        self.b2 = models.Build(copr=self.c1,
                               package=self.p1,
                               user=self.u2,
                               submitted_on=10)
        self.b3 = models.Build(copr=self.c2,
                               package=self.p2,
                               user=self.u2,
                               submitted_on=10)
        self.b4 = models.Build(copr=self.c2,
                               package=self.p2,
                               user=self.u2,
                               submitted_on=100)

        self.basic_builds = [self.b1, self.b2, self.b3, self.b4]
        self.b1_bc = []
        self.b2_bc = []
        self.b3_bc = []
        self.b4_bc = []

        for build, build_chroots in zip(
            [self.b1, self.b2, self.b3, self.b4],
            [self.b1_bc, self.b2_bc, self.b3_bc, self.b4_bc]):

            status = None
            if build is self.b1:  # this build is going to be deleted
                status = StatusEnum("succeeded")
            for chroot in build.copr.active_chroots:
                buildchroot = models.BuildChroot(
                    build=build,
                    mock_chroot=chroot,
                    status=status,
                    git_hash="12345",
                )

                if build is self.b1 or build is self.b2:
                    buildchroot.started_on = 139086644000
                    buildchroot.ended_on = 149086644000
                    build.ended_on = 149086644000

                build_chroots.append(buildchroot)
                self.db.session.add(buildchroot)

        self.db.session.add_all([self.b1, self.b2, self.b3, self.b4])
Esempio n. 5
0
    def f_builds(self):
        self.p1 = models.Package(
            copr=self.c1, copr_dir=self.c1_dir, name="hello-world", source_type=0)
        self.p2 = models.Package(
            copr=self.c2, copr_dir=self.c2_dir, name="whatsupthere-world", source_type=0)
        self.p3 = models.Package(
            copr=self.c2, copr_dir=self.c3_dir, name="goodbye-world", source_type=0)

        self.b1 = models.Build(
            copr=self.c1, copr_dir=self.c1_dir, package=self.p1,
            user=self.u1, submitted_on=50, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='bar')
        self.b2 = models.Build(
            copr=self.c1, copr_dir=self.c1_dir, package=self.p1,
            user=self.u2, submitted_on=10, srpm_url="http://somesrpm",
            source_status=StatusEnum("importing"), result_dir='bar',
            source_json='{}')
        self.b3 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p2, user=self.u2, submitted_on=10, srpm_url="http://somesrpm", source_status=StatusEnum("importing"), result_dir='bar')
        self.b4 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p2, user=self.u2, submitted_on=100, srpm_url="http://somesrpm", source_status=StatusEnum("succeeded"), result_dir='bar')

        self.basic_builds = [self.b1, self.b2, self.b3, self.b4]
        self.b1_bc = []
        self.b2_bc = []
        self.b3_bc = []
        self.b4_bc = []

        for build, build_chroots in zip(
                [self.b1, self.b2, self.b3, self.b4],
                [self.b1_bc, self.b2_bc, self.b3_bc, self.b4_bc]):

            status = None
            if build is self.b1:  # this build is going to be deleted
                status = StatusEnum("succeeded")
            for chroot in build.copr.active_chroots:
                buildchroot = models.BuildChroot(
                    build=build,
                    mock_chroot=chroot,
                    status=status,
                    git_hash="12345",
                    result_dir='bar',
                )

                if build is self.b1 or build is self.b2:
                    buildchroot.started_on = 1390866440
                    buildchroot.ended_on = 1490866440


                build_chroots.append(buildchroot)
                self.db.session.add(buildchroot)

        self.db.session.add_all([self.b1, self.b2, self.b3, self.b4])
Esempio n. 6
0
    def add(cls,
            user,
            pkgs,
            copr,
            repos=None,
            chroots=None,
            memory_reqs=None,
            timeout=None,
            enable_net=True):
        if chroots is None:
            chroots = []
        coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action(
            user, copr,
            "Can't build while there is an operation in progress: {action}")
        users_logic.UsersLogic.raise_if_cant_build_in_copr(
            user, copr, "You don't have permissions to build in this copr.")

        if not repos:
            repos = copr.repos

        if " " in pkgs or "\n" in pkgs or "\t" in pkgs or pkgs.strip() != pkgs:
            raise exceptions.MalformedArgumentException(
                "Trying to create a build using src_pkg "
                "with bad characters. Forgot to split?")

        build = models.Build(
            user=user,
            pkgs=pkgs,
            copr=copr,
            repos=repos,
            submitted_on=int(time.time()),
            enable_net=bool(enable_net),
        )

        if memory_reqs:
            build.memory_reqs = memory_reqs

        if timeout:
            build.timeout = timeout or DEFAULT_BUILD_TIMEOUT

        db.session.add(build)

        # add BuildChroot object for each active (or selected) chroot
        # this copr is assigned to
        if not chroots:
            chroots = copr.active_chroots

        for chroot in chroots:
            buildchroot = models.BuildChroot(build=build, mock_chroot=chroot)

            db.session.add(buildchroot)

        return build
Esempio n. 7
0
    def run(self, rawhide_chroot, dest_chroot):
        mock_chroot = coprs_logic.MockChrootsLogic.get_from_name(
            dest_chroot).first()
        if not mock_chroot:
            print("Given chroot does not exist. Please run:")
            print("    sudo python manage.py create_chroot {}".format(
                dest_chroot))
            return

        mock_rawhide_chroot = coprs_logic.MockChrootsLogic.get_from_name(
            rawhide_chroot).first()
        if not mock_rawhide_chroot:
            print("Given rawhide chroot does not exist. Didnt you mistyped?:")
            print("    {}".format(rawhide_chroot))
            return

        for copr in coprs_logic.CoprsLogic.get_all():
            if not self.has_rawhide(copr):
                continue

            data = {
                "copr": copr.name,
                "user": copr.user.name,
                "rawhide_chroot": rawhide_chroot,
                "dest_chroot": dest_chroot,
                "builds": []
            }

            for package in packages_logic.PackagesLogic.get_all(copr.id):
                last_build = package.last_build(successful=True)
                if last_build:
                    data["builds"].append(last_build.result_dir_name)

                    # rbc means rawhide_build_chroot (we needed short variable)
                    rbc = builds_logic.BuildChrootsLogic.get_by_build_id_and_name(
                        last_build.id, rawhide_chroot).first()
                    dbc = builds_logic.BuildChrootsLogic.get_by_build_id_and_name(
                        last_build.id, dest_chroot).first()
                    if rbc and not dbc:
                        dest_build_chroot = models.BuildChroot(**rbc.to_dict())
                        dest_build_chroot.mock_chroot_id = mock_chroot.id
                        dest_build_chroot.mock_chroot = mock_chroot
                        db.session.add(dest_build_chroot)

            if len(data["builds"]):
                actions_logic.ActionsLogic.send_rawhide_to_release(data)
                self.turn_on_the_chroot_for_copr(copr, rawhide_chroot,
                                                 mock_chroot)

        db.session.commit()
Esempio n. 8
0
    def f_pr_build(self, f_mock_chroots, f_builds, f_pr_dir):
        self.b_pr = models.Build(
            copr=self.c1, copr_dir=self.c4_dir, package=self.p1,
            user=self.u1, submitted_on=50, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='0000PR')

        self.bc_pr = models.BuildChroot(
            build=self.b_pr,
            mock_chroot=self.mc2,
            status=StatusEnum("succeeded"),
            git_hash="deadbeef",
            result_dir='0000PR-pr-package',
        )

        self.db.session.add_all([self.b_pr, self.bc_pr])
Esempio n. 9
0
    def rebuild_package(cls,
                        package,
                        source_dict_update={},
                        copr_dir=None,
                        update_callback=None,
                        scm_object_type=None,
                        scm_object_id=None,
                        scm_object_url=None,
                        submitted_by=None):

        source_dict = package.source_json_dict
        source_dict.update(source_dict_update)
        source_json = json.dumps(source_dict)

        if not copr_dir:
            copr_dir = package.copr.main_dir

        build = models.Build(
            user=None,
            pkgs=None,
            package=package,
            copr=package.copr,
            repos=package.copr.repos,
            source_status=StatusEnum("pending"),
            source_type=package.source_type,
            source_json=source_json,
            submitted_on=int(time.time()),
            enable_net=package.copr.build_enable_net,
            timeout=DEFAULT_BUILD_TIMEOUT,
            copr_dir=copr_dir,
            update_callback=update_callback,
            scm_object_type=scm_object_type,
            scm_object_id=scm_object_id,
            scm_object_url=scm_object_url,
            submitted_by=submitted_by,
        )
        db.session.add(build)

        status = StatusEnum("waiting")
        for chroot in package.chroots:
            buildchroot = models.BuildChroot(build=build,
                                             status=status,
                                             mock_chroot=chroot,
                                             git_hash=None)
            db.session.add(buildchroot)

        cls.process_update_callback(build)
        return build
Esempio n. 10
0
    def f_build_many_chroots(self):
        """
            Requires: f_mock_chroots_many
        """
        self.b_many_chroots = models.Build(
            id=12347,
            copr=self.c1,
            copr_dir=self.c1_dir,
            user=self.u1,
            submitted_on=50,
            pkgs="http://example.com/copr-keygen-1.58-1.fc20.src.rpm",
            pkg_version="1.58"
        )

        self.db.session.add(self.b_many_chroots)
        self.status_by_chroot = {
            'epel-5-i386': 0,
            'epel-5-x86_64': 1,
            'epel-6-i386': 0,
            'epel-6-x86_64': 3,
            'epel-7-x86_64': 4,
            'fedora-18-x86_64': 5,
            'fedora-19-i386': 5,
            'fedora-19-x86_64': 6,
            'fedora-20-i386': 2,
            'fedora-20-x86_64': 3,
            'fedora-21-i386': 0,
            'fedora-21-x86_64': 0,
            'fedora-22-i386': 1,
            'fedora-22-x86_64': 1,
            'fedora-23-i386': 1,
            'fedora-23-x86_64': 4,
        }

        for chroot in self.b_many_chroots.copr.active_chroots:
            buildchroot = models.BuildChroot(
                build=self.b_many_chroots,
                mock_chroot=chroot,
                status=self.status_by_chroot[chroot.name],
                git_hash="12345",
                result_dir='bar',
            )
            self.db.session.add(buildchroot)

        self.db.session.add(self.b_many_chroots)
Esempio n. 11
0
    def test_copr_build_basic_build_repeat(
            self, f_users, f_coprs, f_mock_chroots_many, f_db):
        self.b_few_chroots = models.Build(
            id=2345,
            copr=self.c1,
            copr_dir=self.c1_dir,
            user=self.u1,
            submitted_on=50,
            pkgs="http://example.com/copr-keygen-1.58-1.fc20.src.rpm",
            pkg_version="1.58"
        )

        self.db.session.add(self.b_few_chroots)
        self.status_by_chroot = {
            'epel-5-i386': 0,
            'fedora-20-i386': 1,
            'fedora-20-x86_64': 1,
            'fedora-21-i386': 1,
            'fedora-21-x86_64': 4
        }

        for chroot in self.b_few_chroots.copr.active_chroots:
            if chroot.name in self.status_by_chroot:
                buildchroot = models.BuildChroot(
                    build=self.b_few_chroots,
                    mock_chroot=chroot,
                    status=self.status_by_chroot[chroot.name])
                self.db.session.add(buildchroot)

        self.db.session.add_all([self.u1, self.c1, self.b_few_chroots])
        self.db.session.commit()

        r = self.test_client.post(
            "/coprs/{0}/{1}/repeat_build/{2}/"
            .format(self.u1.name, self.c1.name, self.b_few_chroots.id),
            data={},
            follow_redirects=True)

        assert r.status_code == 200
        # no longer using URL
        #assert self.b_few_chroots.pkgs in r.data
        assert "Resubmit build {}".format(self.b_few_chroots.id).encode("utf-8") in r.data
Esempio n. 12
0
    def f_build_many_chroots(self):
        self.b_many_chroots = models.Build(
            id=12347,
            copr=self.c1, user=self.u1,
            submitted_on=50, started_on=139086644000,
            pkgs="http://example.com/copr-keygen-1.58-1.fc20.src.rpm",
            pkg_version="1.58"
        )

        self.db.session.add(self.b_many_chroots)
        self.status_by_chroot = {
            'epel-5-i386': 0,
            'epel-5-x86_64': 1,
            'epel-6-i386': 0,
            'epel-6-x86_64': 3,
            'epel-7-x86_64': 4,
            'fedora-17-i386': 5,
            'fedora-17-x86_64': 6,
            'fedora-18-i386': 2,
            'fedora-18-x86_64': 3,
            'fedora-19-i386': 0,
            'fedora-19-x86_64': 0,
            'fedora-20-i386': 1,
            'fedora-20-x86_64': 1,
            'fedora-21-i386': 1,
            'fedora-21-x86_64': 4
        }

        for chroot in self.b_many_chroots.copr.active_chroots:
            buildchroot = models.BuildChroot(
                build=self.b_many_chroots,
                mock_chroot=chroot,
                status=self.status_by_chroot[chroot.name])
            self.db.session.add(buildchroot)

        self.db.session.add(self.b_many_chroots)
Esempio n. 13
0
def rawhide_to_release_function(rawhide_chroot, dest_chroot):
    mock_chroot = coprs_logic.MockChrootsLogic.get_from_name(
        dest_chroot).first()
    if not mock_chroot:
        print("Given chroot does not exist. Please run:")
        print(
            "    sudo python3 manage.py create-chroot {}".format(dest_chroot))
        return

    mock_rawhide_chroot = coprs_logic.MockChrootsLogic.get_from_name(
        rawhide_chroot).first()
    if not mock_rawhide_chroot:
        print("Given rawhide chroot does not exist. Didnt you mistyped?:")
        print("    {}".format(rawhide_chroot))
        return

    coprs_query = (coprs_logic.CoprsLogic.get_all().join(
        models.CoprChroot).filter(
            models.Copr.follow_fedora_branching == True).filter(
                models.CoprChroot.mock_chroot == mock_rawhide_chroot).options(
                    joinedload('copr_chroots').joinedload('mock_chroot')))

    for copr in coprs_query:
        print("Handling builds in copr '{}', chroot '{}'".format(
            copr.full_name, mock_rawhide_chroot.name))
        turn_on_the_chroot_for_copr(copr, rawhide_chroot, mock_chroot)

        data = {
            "projectname": copr.name,
            "ownername": copr.owner_name,
            "rawhide_chroot": rawhide_chroot,
            "dest_chroot": dest_chroot,
            "builds": []
        }

        latest_pkg_builds_in_rawhide = (db.session.query(
            func.max(models.Build.id),
        ).join(models.BuildChroot).join(models.Package).filter(
            models.BuildChroot.mock_chroot_id == mock_rawhide_chroot.id
        ).filter(models.BuildChroot.status == StatusEnum("succeeded")).filter(
            models.Package.copr_dir == copr.main_dir).group_by(
                models.Package.name))

        fork_builds = (db.session.query(models.Build).options(
            joinedload('build_chroots').joinedload('mock_chroot')).filter(
                models.Build.id.in_(
                    latest_pkg_builds_in_rawhide.subquery()))).all()

        # no builds to fork in this copr
        if not len(fork_builds):
            continue

        for build in fork_builds:
            if mock_chroot in build.chroots:
                # forked chroot already exists, from previous run?
                continue

            # rbc means rawhide_build_chroot (we needed short variable)
            rbc = None
            for rbc in build.build_chroots:
                if rbc.mock_chroot == mock_rawhide_chroot:
                    break

            dest_build_chroot = models.BuildChroot(**rbc.to_dict())
            dest_build_chroot.mock_chroot_id = mock_chroot.id
            dest_build_chroot.mock_chroot = mock_chroot
            dest_build_chroot.status = StatusEnum("forked")
            db.session.add(dest_build_chroot)

            data['builds'].append(build.result_dir)

        if len(data["builds"]):
            actions_logic.ActionsLogic.send_rawhide_to_release(data)

        db.session.commit()
Esempio n. 14
0
    def add(cls,
            user,
            pkgs,
            copr,
            source_type=None,
            source_json=None,
            repos=None,
            chroots=None,
            timeout=None,
            enable_net=True,
            git_hashes=None,
            skip_import=False):
        if chroots is None:
            chroots = []

        coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action(
            copr,
            "Can't build while there is an operation in progress: {action}")
        users_logic.UsersLogic.raise_if_cant_build_in_copr(
            user, copr, "You don't have permissions to build in this copr.")

        if not repos:
            repos = copr.repos

        # todo: eliminate pkgs and this check
        if " " in pkgs or "\n" in pkgs or "\t" in pkgs or pkgs.strip() != pkgs:
            raise exceptions.MalformedArgumentException(
                "Trying to create a build using src_pkg "
                "with bad characters. Forgot to split?")

        # just temporary to keep compatibility
        if not source_type or not source_json:
            source_type = helpers.BuildSourceEnum("srpm_link")
            source_json = json.dumps({"url": pkgs})

        build = models.Build(
            user=user,
            pkgs=pkgs,
            copr=copr,
            repos=repos,
            source_type=source_type,
            source_json=source_json,
            submitted_on=int(time.time()),
            enable_net=bool(enable_net),
        )

        if timeout:
            build.timeout = timeout or DEFAULT_BUILD_TIMEOUT

        db.session.add(build)

        # add BuildChroot object for each active (or selected) chroot
        # this copr is assigned to
        if not chroots:
            chroots = copr.active_chroots

        status = helpers.StatusEnum("importing")

        if skip_import:
            status = StatusEnum("pending")

        for chroot in chroots:
            git_hash = None
            if git_hashes:
                git_hash = git_hashes.get(chroot.name)
            buildchroot = models.BuildChroot(build=build,
                                             status=status,
                                             mock_chroot=chroot,
                                             git_hash=git_hash)

            db.session.add(buildchroot)

        return build
Esempio n. 15
0
    def update_state_from_dict(cls, build, upd_dict):
        """
        :param build:
        :param upd_dict:
            example:
            {
              "builds":[
               {
                 "id": 1,
                 "copr_id": 2,
                 "started_on": 1390866440
               },
               {
                 "id": 2,
                 "copr_id": 1,
                 "status": 0,
                 "chroot": "fedora-18-x86_64",
                 "result_dir": "baz",
                 "ended_on": 1390866440
               }]
            }
        """
        log.info("Updating build {} by: {}".format(build.id, upd_dict))

        # create the package if it doesn't exist
        pkg_name = upd_dict.get('pkg_name', None)
        if pkg_name:
            if not PackagesLogic.get(build.copr_dir.id, pkg_name).first():
                try:
                    package = PackagesLogic.add(
                        build.copr.user, build.copr_dir,
                        pkg_name, build.source_type, build.source_json)
                    db.session.add(package)
                    db.session.commit()
                except (IntegrityError, DuplicateException) as e:
                    app.logger.exception(e)
                    db.session.rollback()
                    return
            build.package = PackagesLogic.get(build.copr_dir.id, pkg_name).first()

        for attr in ["built_packages", "srpm_url", "pkg_version"]:
            value = upd_dict.get(attr, None)
            if value:
                setattr(build, attr, value)

        # update source build status
        if str(upd_dict.get("task_id")) == str(build.task_id):
            build.result_dir = upd_dict.get("result_dir", "")

            new_status = upd_dict.get("status")
            if new_status == StatusEnum("succeeded"):
                new_status = StatusEnum("importing")
                chroot_status=StatusEnum("waiting")
                if not build.build_chroots:
                    # create the BuildChroots from Package setting, if not
                    # already set explicitly for concrete build
                    for chroot in build.package.chroots:
                        buildchroot = models.BuildChroot(
                            build=build,
                            status=chroot_status,
                            mock_chroot=chroot,
                            git_hash=None,
                        )
                        db.session.add(buildchroot)
                else:
                    for buildchroot in build.build_chroots:
                        buildchroot.status = chroot_status
                        db.session.add(buildchroot)

            build.source_status = new_status
            if new_status == StatusEnum("failed") or \
                   new_status == StatusEnum("skipped"):
                for ch in build.build_chroots:
                    ch.status = new_status
                    ch.ended_on = upd_dict.get("ended_on") or time.time()
                    db.session.add(ch)

            if new_status == StatusEnum("failed"):
                build.fail_type = FailTypeEnum("srpm_build_error")

            cls.process_update_callback(build)
            db.session.add(build)
            return

        if "chroot" in upd_dict:
            # update respective chroot status
            for build_chroot in build.build_chroots:
                if build_chroot.name == upd_dict["chroot"]:
                    build_chroot.result_dir = upd_dict.get("result_dir", "")

                    if "status" in upd_dict and build_chroot.status not in BuildsLogic.terminal_states:
                        build_chroot.status = upd_dict["status"]

                    if upd_dict.get("status") in BuildsLogic.terminal_states:
                        build_chroot.ended_on = upd_dict.get("ended_on") or time.time()

                    if upd_dict.get("status") == StatusEnum("starting"):
                        build_chroot.started_on = upd_dict.get("started_on") or time.time()

                    db.session.add(build_chroot)

                    # If the last package of a module was successfully built,
                    # then send an action to create module repodata on backend
                    if (build.module
                            and upd_dict.get("status") == StatusEnum("succeeded")
                            and all(b.status == StatusEnum("succeeded") for b in build.module.builds)):
                        ActionsLogic.send_build_module(build.copr, build.module)

        cls.process_update_callback(build)
        db.session.add(build)
Esempio n. 16
0
    def add(cls, user, pkgs, copr, source_type=None, source_json=None,
            repos=None, chroots=None, timeout=None, enable_net=True,
            git_hashes=None, skip_import=False, background=False, batch=None,
            srpm_url=None, copr_dirname=None):

        if chroots is None:
            chroots = []

        coprs_logic.CoprsLogic.raise_if_unfinished_blocking_action(
            copr, "Can't build while there is an operation in progress: {action}")
        users_logic.UsersLogic.raise_if_cant_build_in_copr(
            user, copr,
            "You don't have permissions to build in this copr.")

        if not repos:
            repos = copr.repos

        # todo: eliminate pkgs and this check
        if pkgs and (" " in pkgs or "\n" in pkgs or "\t" in pkgs or pkgs.strip() != pkgs):
            raise MalformedArgumentException("Trying to create a build using src_pkg "
                                                        "with bad characters. Forgot to split?")

        # just temporary to keep compatibility
        if not source_type or not source_json:
            source_type = helpers.BuildSourceEnum("link")
            source_json = json.dumps({"url":pkgs})

        if skip_import and srpm_url:
            chroot_status = StatusEnum("pending")
            source_status = StatusEnum("succeeded")
        else:
            chroot_status = StatusEnum("waiting")
            source_status = StatusEnum("pending")

        copr_dir = None
        if copr_dirname:
            if not copr_dirname.startswith(copr.name+':') and copr_dirname != copr.name:
                raise MalformedArgumentException("Copr dirname not starting with copr name.")
            copr_dir = coprs_logic.CoprDirsLogic.get_or_create(copr, copr_dirname)

        build = models.Build(
            user=user,
            pkgs=pkgs,
            copr=copr,
            repos=repos,
            source_type=source_type,
            source_json=source_json,
            source_status=source_status,
            submitted_on=int(time.time()),
            enable_net=bool(enable_net),
            is_background=bool(background),
            batch=batch,
            srpm_url=srpm_url,
            copr_dir=copr_dir,
        )

        if timeout:
            build.timeout = timeout or DEFAULT_BUILD_TIMEOUT

        db.session.add(build)

        for chroot in chroots:
            # Chroots were explicitly set per-build.
            git_hash = None
            if git_hashes:
                git_hash = git_hashes.get(chroot.name)
            buildchroot = models.BuildChroot(
                build=build,
                status=chroot_status,
                mock_chroot=chroot,
                git_hash=git_hash,
            )
            db.session.add(buildchroot)

        return build
Esempio n. 17
0
    def f_fork_prepare(self, f_coprs, f_mock_chroots, f_builds):

        self.p4 = models.Package(
            copr=self.c2, copr_dir=self.c2_dir, name="hello-world", source_type=0)
        self.b5 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p4,
            user=self.u1, submitted_on=50, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='00000005-hello-world')
        self.b6 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p4,
            user=self.u1, submitted_on=10, srpm_url="http://somesrpm",
            source_status=StatusEnum("failed"), result_dir='00000006-hello-world',
            source_json='{}')
        self.b7 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p2,
            user=self.u1, submitted_on=10, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='00000007-whatsupthere-world')
        self.b8 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p2,
            user=self.u1, submitted_on=100, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='00000008-whatsupthere-world')

        self.basic_builds = [self.b5, self.b6, self.b7, self.b8]
        self.b5_bc = []
        self.b6_bc = []
        self.b7_bc = []
        self.b8_bc = []
        self.db.session.flush()

        for build, build_chroots in zip(
                [self.b5, self.b6, self.b7, self.b8],
                [self.b5_bc, self.b6_bc, self.b7_bc, self.b8_bc]):

            status = StatusEnum("succeeded")
            for chroot in build.copr.active_chroots:
                buildchroot = models.BuildChroot(
                    build=build,
                    mock_chroot=chroot,
                    status=status,
                    git_hash="12345",
                    result_dir="{}-{}".format(build.id, build.package.name),
                )
                build_chroots.append(buildchroot)
                self.db.session.add(buildchroot)
        self.db.session.add_all([self.b5, self.b6, self.b7, self.b8])

        self.p5 = models.Package(
            copr=self.c2, copr_dir=self.c2_dir, name="new-package", source_type=0)
        self.b9 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p5,
            user=self.u1, submitted_on=100, srpm_url="http://somesrpm",
            source_status=StatusEnum("succeeded"), result_dir='00000009-new-package')
        self.b10 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p5,
            user=self.u1, submitted_on=100, srpm_url="http://somesrpm",
            source_status=StatusEnum("failed"), result_dir='00000010-new-package')
        self.b11 = models.Build(
            copr=self.c2, copr_dir=self.c2_dir, package=self.p5,
            user=self.u1, submitted_on=100, srpm_url="http://somesrpm",
            source_status=StatusEnum("failed"), result_dir='00000011-new-package')

        self.b9_bc = []
        self.b10_bc = []
        self.b11_bc = []
        self.db.session.flush()

        bc_status = {self.b9: {self.mc2: StatusEnum("succeeded"),
                               self.mc3: StatusEnum("succeeded")},
                     self.b10: {self.mc2: StatusEnum("forked"),
                                self.mc3: StatusEnum("failed")},
                     self.b11: {self.mc2: StatusEnum("failed"),
                                self.mc3: StatusEnum("succeeded")}}

        for build, build_chroots in zip(
                [self.b9, self.b10, self.b11],
                [self.b9_bc, self.b10_bc, self.b11_bc]):

            for chroot in build.copr.active_chroots:
                buildchroot = models.BuildChroot(
                    build=build,
                    mock_chroot=chroot,
                    status=bc_status[build][chroot],
                    git_hash="12345",
                    result_dir="{}-{}".format(build.id, build.package.name),
                )
                build_chroots.append(buildchroot)
                self.db.session.add(buildchroot)
        self.db.session.add_all([self.b9, self.b10, self.b11])