ReviewBot: provide comment command override.

For example:

  @leaper override accept
  @repo-checker override decline
This commit is contained in:
Jimmy Berry 2018-03-05 17:21:15 -06:00
parent 056ab71426
commit a40ebc1544
6 changed files with 48 additions and 1 deletions

View File

@ -28,6 +28,7 @@ from collections import namedtuple
from collections import OrderedDict
from osclib.comments import CommentAPI
from osclib.conf import Config
from osclib.core import group_members
from osclib.memoize import memoize
from osclib.stagingapi import StagingAPI
import signal
@ -84,6 +85,8 @@ class ReviewBot(object):
self.only_one_action = False
self.request_default_return = None
self.comment_handler = False
self.override_allow = True
self.override_group_key = '{}-override-group'.format(self.bot_name.lower())
self.load_config()
@ -141,6 +144,11 @@ class ReviewBot(object):
for req in self.requests:
self.logger.info("checking %s"%req.reqid)
self.request = req
override = self.request_override_check(req)
if override is not None:
good = override
else:
good = self.check_one_request(req)
if self.review_mode == 'no':
@ -155,6 +163,40 @@ class ReviewBot(object):
elif self.review_mode != 'accept-onpass':
self._set_review(req, 'declined')
@memoize(session=True)
def request_override_check_users(self, project):
"""Determine users allowed to override review in a comment command."""
self.staging_api(project)
config = self.staging_config[project]
users = group_members(self.apiurl, config['staging-group'])
if self.override_group_key:
override_group = config.get(self.override_group_key)
if override_group:
users += group_members(self.apiurl, override_group)
return users
def request_override_check(self, request):
"""Check for a comment command requesting review override."""
if not self.override_allow:
return None
comments = self.comment_api.get_comments(request_id=request.reqid)
users = self.request_override_check_users(request.actions[0].tgt_project)
for args, who in self.comment_api.command_find(
comments, self.review_user, 'override', users):
message = 'overridden by {}'.format(who)
override = args[1] or None
if override == 'accept':
self.review_messages['accepted'] = message
return True
if override == 'decline':
self.review_messages['declined'] = message
return False
def _set_review(self, req, state):
doit = self.can_accept_review(req.reqid)
if doit is None:

View File

@ -59,6 +59,7 @@ class LegalAuto(ReviewBot.ReviewBot):
self.apinick = 'ibs#'
else:
self.apinick = 'obs#'
self.override_allow = False # Handled via external tool.
def request_priority(self):
prio = self.request.priority or 'moderate'

View File

@ -67,6 +67,7 @@ DEFAULT = {
'openqa': 'https://openqa.opensuse.org',
'lock': 'openSUSE:%(project)s:Staging',
'lock-ns': 'openSUSE',
'leaper-override-group': 'leap-reviewers',
'delreq-review': None,
'main-repo': 'standard',
'download-baseurl': 'http://download.opensuse.org/distribution/leap/%(version)s/',

View File

@ -60,6 +60,7 @@ class TestTagChecker(unittest.TestCase):
self.checker = TagChecker(apiurl=APIURL,
user='maintbot',
logger=self.logger)
self.checker.override_allow = False # Test setup cannot handle.
self._request_data = """
<request id="293129" creator="darix">

View File

@ -57,6 +57,7 @@ class TestFactorySourceAccept(unittest.TestCase):
self.checker = FactorySourceChecker(apiurl = APIURL, \
user = 'factory-source', \
logger = self.logger)
self.checker.override_allow = False # Test setup cannot handle.
def test_accept_request(self):

View File

@ -55,6 +55,7 @@ class TestMaintenance(unittest.TestCase):
self.checker = MaintenanceChecker(apiurl = APIURL, \
user = 'maintbot', \
logger = self.logger)
self.checker.override_allow = False # Test setup cannot handle.
def test_non_maintainer_submit(self):
"""same as above but already has devel project as reviewer