2014-07-08 15:02:12 +02:00
|
|
|
import json
|
|
|
|
|
|
|
|
|
2014-03-06 18:50:59 +01:00
|
|
|
class CheckCommand(object):
|
|
|
|
def __init__(self, api):
|
|
|
|
self.api = api
|
|
|
|
|
2014-07-08 15:02:12 +02:00
|
|
|
def _previous_check_one_project(self, project, verbose):
|
2014-03-06 18:50:59 +01:00
|
|
|
"""
|
|
|
|
Check state of one specified staging project
|
|
|
|
:param project: project to check
|
|
|
|
:param verbose: do verbose check or not
|
|
|
|
"""
|
|
|
|
state = self.api.check_project_status(project, verbose)
|
|
|
|
|
|
|
|
# If the project is empty just skip it
|
|
|
|
if not state:
|
2014-03-24 15:18:25 +01:00
|
|
|
return False
|
2014-03-06 18:50:59 +01:00
|
|
|
|
|
|
|
print('Checking staging project: {}'.format(project))
|
|
|
|
if type(state) is list:
|
2014-07-15 11:08:04 +02:00
|
|
|
print(' -- Project still needs attention')
|
2014-03-06 18:50:59 +01:00
|
|
|
for issue in state:
|
|
|
|
print(issue)
|
|
|
|
else:
|
|
|
|
print(' ++ Acceptable staging project')
|
|
|
|
|
2014-03-24 13:46:51 +01:00
|
|
|
return True
|
|
|
|
|
2014-07-08 16:54:56 +02:00
|
|
|
def _report(self, project, verbose, is_subproject=False):
|
2014-07-08 15:02:12 +02:00
|
|
|
"""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
|
|
|
|
report.extend(' - Request %s is superseded by %s' % (r['id'], r['superseded_by_id'])
|
|
|
|
for r in project['obsolete_requests'] if r['state'] == 'superseded')
|
|
|
|
|
|
|
|
# Untracked requests
|
|
|
|
report.extend(' - Request %s is no tracked but is open for the project' % r['id']
|
|
|
|
for r in project['untracked_requests'])
|
|
|
|
|
|
|
|
# Status of obsolete requests
|
|
|
|
for r in project['obsolete_requests']:
|
2014-07-08 17:25:29 +02:00
|
|
|
if r['state'] == 'superseded':
|
|
|
|
continue
|
2014-07-08 15:02:12 +02:00
|
|
|
report.append(' - %s: %s' % (r['package'], r['state']))
|
|
|
|
if not verbose:
|
|
|
|
break
|
|
|
|
|
|
|
|
# Missing reviews
|
|
|
|
for r in project['missing_reviews']:
|
|
|
|
report.append(' - %s: Missing reviews: %s' % (r['package'], r['by']))
|
|
|
|
if not verbose:
|
|
|
|
break
|
|
|
|
|
|
|
|
# Building repositories
|
|
|
|
if project['building_repositories']:
|
|
|
|
report.append(' - At least following repositories are still building:')
|
|
|
|
for r in project['building_repositories']:
|
2014-07-08 17:06:31 +02:00
|
|
|
report.append(' %s/%s: %s' % (r['repository'], r['arch'], r['state']))
|
2014-07-08 15:02:12 +02:00
|
|
|
if not verbose:
|
|
|
|
break
|
|
|
|
|
|
|
|
# Broken packages
|
|
|
|
if project['broken_packages']:
|
|
|
|
report.append(' - Following packages are broken:')
|
|
|
|
for r in project['broken_packages']:
|
|
|
|
report.append(' %s (%s): %s' % (r['package'], r['repository'], r['state']))
|
|
|
|
if not verbose:
|
|
|
|
break
|
|
|
|
|
|
|
|
# openQA results
|
|
|
|
if not project['openqa_jobs']:
|
|
|
|
report.append(' - No openQA result yet')
|
2014-07-09 09:38:54 +02:00
|
|
|
for job in project['openqa_jobs']:
|
|
|
|
if job['result'] != 'passed':
|
|
|
|
qa_result = job['result'] if job['result'] != 'none' else 'running'
|
|
|
|
report.append(" - openQA's overall status is %s for https://openqa.opensuse.org/tests/%s" % (qa_result, job['id']))
|
2014-07-09 17:50:06 +02:00
|
|
|
report.extend(' %s: fail' % module['name'] for module in job['modules'] if module['result'] == 'fail')
|
2014-07-16 14:50:37 +02:00
|
|
|
break
|
2014-07-08 15:02:12 +02:00
|
|
|
|
2014-07-08 16:54:56 +02:00
|
|
|
for subproject in project['subprojects']:
|
|
|
|
subreport = self._report(subproject, verbose, is_subproject=True)
|
|
|
|
if subreport:
|
|
|
|
report.append('')
|
|
|
|
report.append(' -- For subproject %s' % subproject['name'])
|
|
|
|
report.extend(subreport)
|
|
|
|
|
2014-07-31 14:16:28 +02:00
|
|
|
if project['overall_state'] == 'acceptable':
|
|
|
|
report.insert(0, ' ++ Acceptable staging project %s' % project['name'])
|
|
|
|
elif project['overall_state'] != 'empty':
|
|
|
|
report.insert(0, ' -- %s Project %s still needs attention' % (project['overall_state'].upper(),
|
|
|
|
project['name']))
|
2014-07-08 15:02:12 +02:00
|
|
|
|
|
|
|
return report
|
|
|
|
|
|
|
|
def _check_project(self, project=None):
|
|
|
|
"""
|
|
|
|
Check state of one specified staging project
|
|
|
|
:param project: project to check
|
|
|
|
|
|
|
|
"""
|
|
|
|
report = []
|
|
|
|
|
2014-09-12 15:00:14 +02:00
|
|
|
query = {'format': 'json'}
|
2014-07-08 15:02:12 +02:00
|
|
|
if project:
|
2014-08-25 12:44:05 +02:00
|
|
|
url = self.api.makeurl(('project', 'staging_projects', 'openSUSE:%s' % self.api.opensuse,
|
2014-09-12 15:00:14 +02:00
|
|
|
project), query=query)
|
2014-07-08 15:02:12 +02:00
|
|
|
else:
|
2014-09-12 15:00:14 +02:00
|
|
|
url = self.api.makeurl(('project', 'staging_projects', 'openSUSE:%s' % self.api.opensuse),
|
|
|
|
query=query)
|
2014-07-08 15:02:12 +02:00
|
|
|
info = json.load(self.api.retried_GET(url))
|
|
|
|
if not project:
|
|
|
|
for prj in info:
|
2014-07-16 14:50:37 +02:00
|
|
|
if not prj['selected_requests']:
|
|
|
|
continue
|
2014-07-08 16:54:56 +02:00
|
|
|
report.extend(self._report(prj, False))
|
2014-07-08 15:02:12 +02:00
|
|
|
report.append('')
|
|
|
|
else:
|
|
|
|
report.extend(self._report(info, True))
|
|
|
|
return report
|
|
|
|
|
|
|
|
def perform(self, project=None, previous=False):
|
2014-03-06 18:50:59 +01:00
|
|
|
"""
|
|
|
|
Check one staging project verbosibly or all of them at once
|
|
|
|
:param project: project to check, None for all
|
|
|
|
"""
|
2014-07-08 15:02:12 +02:00
|
|
|
if previous:
|
|
|
|
if project:
|
|
|
|
project = self.api.prj_from_letter(project)
|
|
|
|
self._previous_check_one_project(project, True)
|
|
|
|
else:
|
|
|
|
for project in self.api.get_staging_projects():
|
|
|
|
if self._previous_check_one_project(project, False):
|
|
|
|
# newline to split multiple prjs at once
|
|
|
|
print('')
|
2014-03-06 18:50:59 +01:00
|
|
|
else:
|
2014-07-08 15:02:12 +02:00
|
|
|
print '\n'.join(self._check_project(project))
|
2014-03-06 18:50:59 +01:00
|
|
|
|
|
|
|
return True
|