101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
import json
|
|
from lxml import etree as ET
|
|
|
|
class CheckCommand(object):
|
|
def __init__(self, api):
|
|
self.api = api
|
|
|
|
def _report(self, project, verbose):
|
|
"""Print a single report for a project.
|
|
:param project: dict object, converted from JSON.
|
|
:param verbose: do verbose check or not
|
|
|
|
"""
|
|
report = []
|
|
|
|
# Check for superseded requests
|
|
for r in project.findall('obsolete_requests/*'):
|
|
if r.get('state') == 'superseded':
|
|
report.extend(' - Request %s is superseded by %s' % (r.get('id'), r.get('superseded_by')))
|
|
|
|
# Untracked requests
|
|
for r in project.findall('untracked_requests/*'):
|
|
report.extend(' - Request %s is no tracked but is open for the project' % r.get('id'))
|
|
|
|
# Status of obsolete requests
|
|
for r in project.findall('obsolete_requests/*'):
|
|
if r.get('state') == 'superseded':
|
|
continue
|
|
report.append(' - %s: %s' % (r.get('package'), r.get('state')))
|
|
if not verbose:
|
|
break
|
|
|
|
# Missing reviews
|
|
for r in project.findall('missing_reviews/*'):
|
|
report.append(' - %s: Missing reviews: %s' % (r.get('package'), r.get('by')))
|
|
if not verbose:
|
|
break
|
|
|
|
# Building repositories
|
|
if project.find('building_repositories/*') is not None:
|
|
report.append(' - At least following repositories are still building:')
|
|
for r in project.findall('building_repositories/*'):
|
|
report.append(' %s/%s: %s' % (r.get('repository'), r.get('arch'), r.get('state')))
|
|
if not verbose:
|
|
break
|
|
|
|
# Broken packages
|
|
if project.find('broken_packages/*') is not None:
|
|
report.append(' - Following packages are broken:')
|
|
for r in project.findall('broken_packages/*'):
|
|
report.append(' %s (%s): %s' % (r.get('package'), r.get('repository'), r.get('state')))
|
|
if not verbose:
|
|
break
|
|
|
|
# openQA results
|
|
for check in project.findall('missing_checks/*'):
|
|
report.append(' - Missing check: ' + check.get('name'))
|
|
|
|
for check in project.findall('checks/*'):
|
|
if check.get('state') != 'success':
|
|
info = " - %s check: %s" % (check.get('state'), check.get('name'))
|
|
if check.get('url'):
|
|
info += " " + check.get('url')
|
|
report.append(info)
|
|
break
|
|
|
|
if project.get('state') == 'acceptable':
|
|
report.insert(0, ' ++ Acceptable staging project %s' % project.get('name'))
|
|
elif project.get('state') != 'empty':
|
|
report.insert(0, ' -- %s Project %s still needs attention' % (project.get('state').upper(),
|
|
project.get('name')))
|
|
|
|
return report
|
|
|
|
def _check_project(self, project):
|
|
"""
|
|
Check state of one specified staging project
|
|
:param project: project to check
|
|
|
|
"""
|
|
info = self.api.project_status(project)
|
|
if info.get('state') == 'empty':
|
|
return []
|
|
return self._report(info, False) + ['']
|
|
|
|
def perform(self, project):
|
|
"""
|
|
Check one staging project verbosibly or all of them at once
|
|
:param project: project to check, None for all
|
|
"""
|
|
if project:
|
|
report = self._check_project(project)
|
|
else:
|
|
report = []
|
|
for project in self.api.get_staging_projects():
|
|
report.extend(self._check_project(project))
|
|
|
|
print('\n'.join(report))
|
|
|
|
return True
|