Exemplo n.º 1
0
    def read(self, request, jobid=None, mfileid=None, authid=None):
        if jobid:
            job = Job.objects.get(id=jobid)
            return job
        elif mfileid:
            jobs = Job.objects.filter(mfile=mfileid)
            return jobs
        elif authid:
            auth = Auth.objects.get(pk=authid)
            logging.info("S %s" % auth)
            if utils.is_service(auth.base):
                ds = DataService.objects.get(id=auth.base.id)
                return ds.do("GET","jobs")

                jobs = Job.objects.filter(mfile=auth.base.id)
                return jobs
            if utils.is_mfile(auth.base):
                jobs = Job.objects.filter(mfile=auth.base.id)
                return jobs
Exemplo n.º 2
0
    def get_job_plots(request, baseid=None):
        taskstates = TaskState.objects.none()
        tasks_whitelist = TaskDescription.objects.values_list('task_name')

        if baseid:        
            jobs = None
            try:
                base = NamedBase.objects.get(id=baseid)
                if utils.is_container(base):
                    hc = HostingContainer.objects.get(id=baseid)
                    jobs = hc.jobs()
                if utils.is_service(base):
                    ds = DataService.objects.get(id=baseid)
                    jobs = ds.jobs()
                if utils.is_mfile(base):
                    mf = MFile.objects.get(id=baseid)
                    jobs = Job.objects.filter(mfile=mf)
            except NamedBase.DoesNotExist:
                try:
                    auth = Auth.objects.get(id=baseid)
                    if utils.is_container(auth.base):
                        base = auth.get_real_base()
                        jobs = base.jobs()
                    if utils.is_service(auth.base):
                        base = auth.get_real_base()
                        jobs = base.jobs()
                    if utils.is_mfile(auth.base):
                        base = auth.get_real_base()
                        jobs = Job.objects.filter(mfile=base)
                except Auth.DoesNotExist:
                    pass
                pass

            if jobs == None:
                logging.error("Base id %s does not relate to a base or auth", baseid)
                return None

            asyncs = JobASyncResult.objects.filter(job__in=jobs).values_list("async_id",flat=True)
            taskstates = TaskState.objects.filter(task_id__in=asyncs)
            taskstates = taskstates.filter(name__in=tasks_whitelist)

        elif request.user.is_staff:
            taskstates = TaskState.objects.all()


        plots = []
        types = request.GET
        for type in types:
            names = taskstates.values('name')
            if type == "last24":
                now = datetime.datetime.now()
                count = now - datetime.timedelta(days=1)
                step = datetime.timedelta(hours=1)
                prev = count - step
                taskplot = {}
                data = []
                sdata = {}
                while count <= now:
                    tasks = taskstates.filter(tstamp__lt=count,tstamp__gt=prev)
                    prev = count
                    count = count + step
                    '''for task in names:
                        _taskname = task["name"]
                        stasks = tasks.filter(name=_taskname)
                        if _taskname not in sdata:
                            sdata[_taskname] = {}
                            sdata[_taskname]["label"] = _taskname
                            sdata[_taskname]["data"] = []
                        sdata[_taskname]["data"].append( [time.mktime(count.timetuple())*1000, str(len(stasks)) ])'''
                    data.append( [time.mktime(count.timetuple())*1000, str(len(tasks)) ])

                taskplot["data"] = [ {"label": "All Jobs", "data" : data} ] + sdata.values()
                taskplot["type"] = "time"
                taskplot["size"] = "small"
                taskplot["label"] = "Tasks in last 24 hours"
                plots.append(taskplot)

            if type == "last1":
                now = datetime.datetime.now()
                count = now - datetime.timedelta(hours=1)
                step = datetime.timedelta(minutes=5)
                prev = count - step
                taskplot = {}
                data = []
                sdata = {}
                while count <= now:
                    tasks = taskstates.filter(tstamp__lt=count,tstamp__gt=prev)
                    prev = count
                    count = count + step
                    '''for task in names:
                        _taskname = task["name"]
                        stasks = tasks.filter(name=_taskname)
                        if _taskname not in sdata:
                            sdata[_taskname] = {}
                            sdata[_taskname]["label"] = _taskname
                            sdata[_taskname]["data"] = []
                        sdata[_taskname]["data"].append( [time.mktime(count.timetuple())*1000, str(len(stasks)) ])'''
                    data.append( [time.mktime(count.timetuple())*1000, str(len(tasks)) ])

                taskplot["data"] = [ {"label": "All Jobs", "data" : data} ] + sdata.values()
                taskplot["type"] = "time"
                taskplot["size"] = "small"
                taskplot["label"] = "Tasks in last hour"
                plots.append(taskplot)

            if type == "jobsbytype":
                jobplot = {}
                jobplot["type"] = "pie"
                jobplot["label"] = "Jobs by Type"
                jobplot["size"] = "large"

                query = taskstates.values("name").annotate(n=Count("name"))
                if query.count() == 0:
                    data = []
                    data.append({
                        "label" : "No Data" ,
                        "data" : 1,
                        "color" : "#CCCCCC"})
                    jobplot["data"] = data
                    plots.append(jobplot)
                else:
                    for val in query:
                        if val["name"] == None:
                            val["label"] = "unknown"
                        else:
                            val["label"] = val["name"].split(".")[-1]
                        val["data"] = val["n"]
                    jobplot["data"] = [item for item in query]
                    plots.append(jobplot)

            if type == "jobs":
                jobplot = {}
                jobplot["type"] = "pie"
                jobplot["size"] = "small"
                jobplot["label"] = "All Jobs"
                jobplot["data"] = [
                    {"label":"Success" , "data": taskstates.filter(state="SUCCESS").count(), "color" : "#00CC00"  },
                    {"label":"Failed" , "data": taskstates.filter(state="FAILURE").count(), "color" : "#CC0000",  }
                ]

                plots.append(jobplot)

                task_names = set(taskstates.values_list("name",flat=True).distinct())
                if len(task_names) == 0:
                    data = []
                    data.append({
                        "label" : "No Data" ,
                        "data" : 1,
                        "color" : "#CCCCCC"})
                    jobplot["data"] = data
                    #plots.append(jobplot)
                else:
                    for taskname in task_names:
                        subplot = {}
                        subplot["type"] = "pie"
                        subplot["size"] = "small"
                        subplot["label"] = "Job %s" % taskname.split(".")[-1]
                        tasks = taskstates.filter(name=taskname)
                        success = tasks.filter(state="SUCCESS").aggregate(success=Count('name'))["success"]
                        failure = tasks.filter(state="FAILURE").aggregate(failure=Count('name'))["failure"]
                        data = []
                        data.append({ "label" : "Failed" , "data" : failure, "color" : "#CC0000"})
                        data.append({ "label" : "Success" , "data" : success, "color" : "#00CC00"})
                        subplot["data"] = data
                        plots.append(subplot)

        return plots