示例#1
0
class BeakerCommand():

    def __init__(self):
        self.beaker = Beaker()

    def return2beaker(self, return2beaker_recipe, *argvs, **kwargs):
        if not return2beaker_recipe:
            raise CommandError(
                "return2beaker - parameter return2beaker_recipe cannot be empty")

        for uid in return2beaker_recipe:
            recipe = Recipe.objects.get(uid=uid[2:])
            res = self.beaker.return2beaker(recipe)
            if res:
                logger.info("R:%s recipes was returned to beaker."
                            % recipe.uid)
            else:
                logger.info("Problem with returning to beaker (R:%s)."
                            % recipe.uid)
            self.beaker.systemRelease(recipe)

    def reschedule(self, reschedule_job, *argvs, **kwargs):
        if not reschedule_job:
            raise CommandError(
                "reschedule - parameter reschedule_job cannot be empty")

        message = kwargs.get("reschedule-message")
        for uid in reschedule_job:
            job = Job.objects.get(uid=uid)
            job_new = self.beaker.jobReschedule(job, message)
            if job_new:
                logger.info("%s job was rescheduled as %s."
                            % (job.uid, job_new.uid))
            else:
                logger.info("Problem with rescheduling of job (%s)."
                            % job.uid)

    def cancel(self, cancel_job, *argvs, **kwargs):
        if not cancel_job:
            raise CommandError("cancel - parameter cancel_job cannot be empty")

        message = kwargs.get("cancel-message")
        for uid in cancel_job:
            job = Job.objects.get(uid=uid)
            res = self.beaker.jobCancel(job, message)
            if res:
                logger.info("%s job was cancled." % job.uid)
            else:
                logger.info("Problem with canceling of job (%s)." % job.uid)

    def schedule(self, label="default", *argvs, **kwargs):
        simulate = kwargs.get("simulate")
        reserver = kwargs.get("reserve")
        fullInfo = kwargs.get("fullInfo")

        if kwargs.get("list"):
            tp = TaskPeriod.objects.all()
            table = Texttable()
            table.set_deco(Texttable.HEADER)
            table.header(["Id", "Title", "Label", "Schedule"])
            for it in tp:
                table.add_row([it.id, it.title, it.label, it.cron])
            print(table.draw())

        if kwargs.get("template_id"):
            template_ids = kwargs.get("template_id")
            logger.debug("Schedule template id %s" % template_ids)

            filter = {"id__in": template_ids}
            self.scheduleByJobTemplates(
                filter, label, fullInfo, simulate, reserver)

        if kwargs.get("schedule_label"):
            period_label = kwargs.get("schedule_label")
            filter = {"schedule__label__in": period_label, "is_enable": True}
            if not label:
                label = period_label
            self.scheduleByJobTemplates(
                filter, "".join(label), fullInfo, simulate, reserver)

    def checklogs(self, **kwargs):
        logger.info("%d files to download" % FileLog.objects.filter(status_code=0).count())
        logger.info("%d files to indexing" % FileLog.objects.filter(is_indexed=False).count())

        b = Beaker()
        for it in FileLog.objects.filter(status_code=0)\
                         .order_by("-created")[0:settings.MAX_LOGS_IN_ONE_CHECK]:
            it.status_code, logpath = b.downloadLog(it.url)
            if not logpath:
                # if file is not download then skip and not save object
                it.save()
                continue
            it.path = logpath
            it.is_downloaded = True
            it.save()
            try:
                it.parse_journal()
            except Exception as e:
                logger.debug("parse log file: %s" % e)

        if settings.ELASTICSEARCH:
            for it in FileLog.objects.filter(is_downloaded=True, is_indexed=False)\
                            .order_by("-created")[0:settings.MAX_LOGS_IN_ONE_CHECK]:
                try:
                    it.index()
                except Exception as e:
                    logger.info("indexing %s: %s" % (it.path, e))

        FileLog.clean_old()

    def scheduleByJobTemplates(
            self, filter, label, fullInfo, simulate, reserve):
        jobTs = JobTemplate.objects.filter(**filter).distinct()
        logger.info("%s JobTemplates are prepared." % len(jobTs))
        if fullInfo:
            table = Texttable()
            table.set_deco(Texttable.HEADER)
            table.header(["Job", "Whiteboard", "Tags"])
        # do not create TaskPeriodSchedule when there are no jobs to schedule
        if len(jobTs) == 0:
            logger.info("No jobs for TaskPeriod %s" % label)
            return

        period = TaskPeriod.objects.get(label=label)
        count = TaskPeriodSchedule.objects.filter(
            period=period).aggregate(Max('counter')).get("counter__max")

        schedule = TaskPeriodSchedule.objects.create(
            title=label,
            period=period,
            counter=count + 1 if count is not None else 0,
        )

        for jobT in jobTs:
            job = ""
            if not simulate:
                job = self.beaker.jobSchedule(jobT, reserve)
                if job:
                    job.schedule = schedule
                    job.save()
                    logger.info("%s job was successful scheduled."
                                % job.uid)
                else:
                    logger.info("Problem with scheduling of job template (%s)."
                                % jobT.id)
            if fullInfo:
                tags = ",".join([tag.name for tag in jobT.tags.all()])
                table.add_row([str(job), jobT.whiteboard, tags])
            if not simulate:
                # Beaker guys told us we are causing too big load,
                # so adding this sleep
                # FIXME only temporary, rewrite code for scheduling to tttt
                # taskomatic
                time.sleep(4.5)
        if fullInfo:
            print table.draw()
示例#2
0
class BeakerCommand():
    def __init__(self):
        self.beaker = Beaker()

    def return2beaker(self, return2beaker_recipe, *argvs, **kwargs):
        if not return2beaker_recipe:
            raise CommandError(
                "return2beaker - parameter return2beaker_recipe cannot be empty"
            )

        for uid in return2beaker_recipe:
            recipe = Recipe.objects.get(uid=uid[2:])
            res = self.beaker.return2beaker(recipe)
            if res:
                logger.info("R:%s recipes was returned to beaker." %
                            recipe.uid)
            else:
                logger.info("Problem with returning to beaker (R:%s)." %
                            recipe.uid)
            self.beaker.systemRelease(recipe)

    def reschedule(self, reschedule_job, *argvs, **kwargs):
        if not reschedule_job:
            raise CommandError(
                "reschedule - parameter reschedule_job cannot be empty")

        message = kwargs.get("reschedule-message")
        for uid in reschedule_job:
            job = Job.objects.get(uid=uid)
            job_new = self.beaker.jobReschedule(job, message)
            if job_new:
                logger.info("%s job was rescheduled as %s." %
                            (job.uid, job_new.uid))
            else:
                logger.info("Problem with rescheduling of job (%s)." % job.uid)

    def cancel(self, cancel_job, *argvs, **kwargs):
        if not cancel_job:
            raise CommandError("cancel - parameter cancel_job cannot be empty")

        message = kwargs.get("cancel-message")
        for uid in cancel_job:
            job = Job.objects.get(uid=uid)
            res = self.beaker.jobCancel(job, message)
            if res:
                logger.info("%s job was cancled." % job.uid)
            else:
                logger.info("Problem with canceling of job (%s)." % job.uid)

    def schedule(self, label="default", *argvs, **kwargs):
        simulate = kwargs.get("simulate")
        reserver = kwargs.get("reserve")
        fullInfo = kwargs.get("fullInfo")

        if kwargs.get("list"):
            tp = TaskPeriod.objects.all()
            table = Texttable()
            table.set_deco(Texttable.HEADER)
            table.header(["Id", "Title", "Label", "Schedule"])
            for it in tp:
                table.add_row([it.id, it.title, it.label, it.cron])
            print(table.draw())

        if kwargs.get("template_id"):
            template_ids = kwargs.get("template_id")
            logger.debug("Schedule template id %s" % template_ids)

            filter = {"id__in": template_ids}
            self.scheduleByJobTemplates(filter, label, fullInfo, simulate,
                                        reserver)

        if kwargs.get("schedule_label"):
            period_label = kwargs.get("schedule_label")
            filter = {"schedule__label__in": period_label, "is_enable": True}
            if not label:
                label = period_label
            self.scheduleByJobTemplates(filter, "".join(label), fullInfo,
                                        simulate, reserver)

    def checklogs(self, **kwargs):
        logger.info("%d files to download" %
                    FileLog.objects.filter(status_code=0).count())
        logger.info("%d files to indexing" %
                    FileLog.objects.filter(is_indexed=False).count())

        b = Beaker()
        for it in FileLog.objects.filter(status_code=0)\
                         .order_by("-created")[0:settings.MAX_LOGS_IN_ONE_CHECK]:
            it.status_code, logpath = b.downloadLog(it.url)
            if not logpath:
                # if file is not download then skip and not save object
                it.save()
                continue
            it.path = logpath
            it.is_downloaded = True
            it.save()
            try:
                it.parse_journal()
            except Exception as e:
                logger.debug("parse log file: %s" % e)

        if settings.ELASTICSEARCH:
            for it in FileLog.objects.filter(is_downloaded=True, is_indexed=False)\
                            .order_by("-created")[0:settings.MAX_LOGS_IN_ONE_CHECK]:
                try:
                    it.index()
                except Exception as e:
                    logger.info("indexing %s: %s" % (it.path, e))

        FileLog.clean_old()

    def scheduleByJobTemplates(self, filter, label, fullInfo, simulate,
                               reserve):
        jobTs = JobTemplate.objects.filter(**filter).distinct()
        logger.info("%s JobTemplates are prepared." % len(jobTs))
        if fullInfo:
            table = Texttable()
            table.set_deco(Texttable.HEADER)
            table.header(["Job", "Whiteboard", "Tags"])
        # do not create TaskPeriodSchedule when there are no jobs to schedule
        if len(jobTs) == 0:
            logger.info("No jobs for TaskPeriod %s" % label)
            return

        period = TaskPeriod.objects.get(label=label)
        count = TaskPeriodSchedule.objects.filter(period=period).aggregate(
            Max('counter')).get("counter__max")

        schedule = TaskPeriodSchedule.objects.create(
            title=label,
            period=period,
            counter=count + 1 if count is not None else 0,
        )

        for jobT in jobTs:
            job = ""
            if not simulate:
                job = self.beaker.jobSchedule(jobT, reserve)
                if job:
                    job.schedule = schedule
                    job.save()
                    logger.info("%s job was successful scheduled." % job.uid)
                else:
                    logger.info(
                        "Problem with scheduling of job template (%s)." %
                        jobT.id)
            if fullInfo:
                tags = ",".join([tag.name for tag in jobT.tags.all()])
                table.add_row([str(job), jobT.whiteboard, tags])
            if not simulate:
                # Beaker guys told us we are causing too big load,
                # so adding this sleep
                # FIXME only temporary, rewrite code for scheduling to tttt
                # taskomatic
                time.sleep(4.5)
        if fullInfo:
            print table.draw()