Example #1
0
    def save(self, force_insert=False, only=None):
        if Build.status not in self.dirty_fields:
            return super(Build, self).save(force_insert, only)

        with database_proxy.transaction():
            self._set_project_status()
            self.project.save()

            return super(Build, self).save(force_insert, only)
Example #2
0
    def cancel(self):
        from piper_core.model.stages.stage import Stage

        with database_proxy.transaction():
            stages: List[Stage] = Stage.select().where(Stage.build == self)
            for stage in stages:
                stage.cancel()

            self.status = Build.get(Build.id == self.id).status
            self._set_project_status()
            self.project.save()
Example #3
0
    def cancel(self):
        from piper_core.model.jobs.job import Job

        with database_proxy.transaction():
            jobs = Job.select().where((Job.stage == self) & (
                Job.status.in_(Status.cancelable_statuses())))
            for job in jobs:
                job.status = Status.CANCELED
                job.save()

            self.status = Stage.get(Stage.id == self.id).status
            self._set_build_status()
            self.build.save()
Example #4
0
    def restart(self):
        from piper_core.model.jobs.job import Job

        with database_proxy.transaction():
            jobs = Job.select().where((Job.stage == self) & (
                Job.status.in_(Status.final_statuses())))

            for job in jobs:
                job.status = Status.READY
                job.secret = uuid.uuid4().hex
                job.save()

            self.status = Stage.get(Stage.id == self.id).status
            self._set_build_status()
            self.build.save()
Example #5
0
    def restart(self):
        from piper_core.model.stages.stage import Stage

        with database_proxy.transaction():
            stages: List[Stage] = Stage.select().where(Stage.build == self)
            for stage in stages:
                stage.restart()

            stages: List[Stage] = Stage.select().where(
                Stage.build == self).order_by(Stage.order.asc()).offset(1)
            for stage in stages:
                stage.status = Status.PENDING
                stage.save()

            self.status = Build.get(Build.id == self.id).status
            self._set_project_status()
            self.project.save()
Example #6
0
    def save(self, force_insert=False, only=None):
        from piper_core.model.jobs.job import Job

        if Stage.status not in self.dirty_fields:
            return super().save(force_insert, only)

        with database_proxy.transaction():
            if self.status is Status.RUNNING:
                stages = Stage.select().where(
                    (Stage.order > self.order) & (Stage.build == self.build)
                    & Stage.status.not_in(Status.final_statuses()))
                for stage in stages:
                    stage.status = Status.PENDING
                    Job.update(status=Status.PENDING).where(
                        Job.stage == stage).execute()
                    stage.save()

            if self.status in [
                    Status.CANCELED, Status.SKIPPED, Status.SUCCESS
            ]:
                try:
                    stage = Stage.get(
                        (Stage.order == self.order + 1)
                        & (Stage.build == self.build)
                        & Stage.status.not_in(Status.final_statuses()))
                    stage.status = Status.READY
                    Job.update(status=Status.READY).where(
                        Job.stage == stage).execute()
                    stage.save()
                except DoesNotExist:
                    pass

            if self.status in [Status.FAILED, Status.ERROR]:
                stages = Stage.select().where(
                    (Stage.order > self.order) & (Stage.build == self.build)
                    & Stage.status.not_in(Status.final_statuses()))
                for stage in stages:
                    Job.update(status=Status.FAILED).where(
                        Job.stage == stage).execute()
                    stage.status = Status.FAILED
                    stage.save()

            self._set_build_status()
            self.build.save()
            return super().save(force_insert, only)
Example #7
0
    def save(self, force_insert=False, only=None):
        if Job.status not in self.dirty_fields or not self.stage:
            return super().save(force_insert, only)

        old = self.stage.status
        with database_proxy.transaction() as txn:
            try:
                statuses = {
                    x.status
                    for x in Job.select(Job.status).where(
                        (Job.stage == self.stage) & (Job.id != self.id))
                }
                statuses.add(self.status)

                if statuses & {Status.ERROR}:
                    self.stage.status = Status.ERROR
                elif statuses & {Status.FAILED}:
                    self.stage.status = Status.FAILED
                elif statuses & {Status.RUNNING}:
                    self.stage.status = Status.RUNNING
                elif statuses & {Status.READY}:
                    if statuses & {
                            Status.SUCCESS, Status.CANCELED, Status.SKIPPED
                    }:
                        self.stage.status = Status.RUNNING
                    else:
                        self.stage.status = Status.READY
                elif statuses & {Status.SUCCESS}:
                    self.stage.status = Status.SUCCESS
                elif statuses & {Status.CANCELED}:
                    self.stage.status = Status.CANCELED
                elif statuses & {Status.SKIPPED}:
                    self.stage.status = Status.SKIPPED
                elif statuses & {Status.CREATED}:
                    self.stage.status = Status.CREATED

                self.stage.save()
                return super(Job, self).save(force_insert, only)
            except Exception as e:
                self.stage.status = old
                txn.rollback()
                raise e