def job_stats(self, machine_type="", since_days=14): since_days = int(since_days) if since_days < 1: error("/errors/invalid/", "since_days must be a positive integer") now = datetime.utcnow() past = now - timedelta(days=since_days) recent_jobs = Job.query.filter(Job.posted.between(past, now)).subquery() RecentJob = aliased(Job, recent_jobs) query = Session.query(Node.name, RecentJob.status, func.count("*")) if machine_type: # Note: filtering by Job.machine_type (as below) greatly improves # performance but could lead slightly incorrect values if many jobs # are being scheduled using mixed machine types. We work around # this by including the 'multi' machine type (which is the name of # the queue Inktank uses for such jobs. query = query.filter(RecentJob.machine_type.in_((machine_type, "multi"))) query = query.filter(Node.machine_type == machine_type) query = query.join(RecentJob.target_nodes).group_by(Node).group_by(RecentJob.status) all_stats = {} results = query.all() for (name, status, count) in results: node_stats = all_stats.get(name, {}) node_stats[status] = count all_stats[name] = node_stats stats_sorter = lambda t: sum(t[1].values()) ordered_stats = OrderedDict(sorted(all_stats.items(), key=stats_sorter)) return ordered_stats
def job_stats(self, machine_type='', since_days=14): since_days = int(since_days) if since_days < 1: error('/errors/invalid/', "since_days must be a positive integer") now = datetime.utcnow() past = now - timedelta(days=since_days) recent_jobs = Job.query.filter(Job.posted.between(past, now)).subquery() RecentJob = aliased(Job, recent_jobs) query = Session.query(Node.name, RecentJob.status, func.count('*')) if machine_type: # Note: filtering by Job.machine_type (as below) greatly improves # performance but could lead slightly incorrect values if many jobs # are being scheduled using mixed machine types. We work around # this by including the 'multi' machine type (which is the name of # the queue Inktank uses for such jobs. query = query.filter( RecentJob.machine_type.in_((machine_type, 'multi'))) query = query.filter(Node.machine_type == machine_type) query = query.join(RecentJob.target_nodes).group_by(Node)\ .group_by(RecentJob.status) all_stats = {} results = query.all() for (name, status, count) in results: node_stats = all_stats.get(name, {}) node_stats[status] = count all_stats[name] = node_stats stats_sorter = lambda t: sum(t[1].values()) ordered_stats = OrderedDict(sorted(all_stats.items(), key=stats_sorter)) return ordered_stats
def index(self): query = Session.query(Run).join(Job).filter(Job.status == 'queued')\ .group_by(Run).order_by(Run.scheduled) return query.all()