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 collections import OrderedDict
from osclib.comments import CommentAPI from osclib.comments import CommentAPI
from osclib.conf import Config from osclib.conf import Config
from osclib.core import group_members
from osclib.memoize import memoize from osclib.memoize import memoize
from osclib.stagingapi import StagingAPI from osclib.stagingapi import StagingAPI
import signal import signal
@ -84,6 +85,8 @@ class ReviewBot(object):
self.only_one_action = False self.only_one_action = False
self.request_default_return = None self.request_default_return = None
self.comment_handler = False self.comment_handler = False
self.override_allow = True
self.override_group_key = '{}-override-group'.format(self.bot_name.lower())
self.load_config() self.load_config()
@ -141,6 +144,11 @@ class ReviewBot(object):
for req in self.requests: for req in self.requests:
self.logger.info("checking %s"%req.reqid) self.logger.info("checking %s"%req.reqid)
self.request = req self.request = req
override = self.request_override_check(req)
if override is not None:
good = override
else:
good = self.check_one_request(req) good = self.check_one_request(req)
if self.review_mode == 'no': if self.review_mode == 'no':
@ -155,6 +163,40 @@ class ReviewBot(object):
elif self.review_mode != 'accept-onpass': elif self.review_mode != 'accept-onpass':
self._set_review(req, 'declined') 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): def _set_review(self, req, state):
doit = self.can_accept_review(req.reqid) doit = self.can_accept_review(req.reqid)
if doit is None: if doit is None:

View File

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

View File

@ -67,6 +67,7 @@ DEFAULT = {
'openqa': 'https://openqa.opensuse.org', 'openqa': 'https://openqa.opensuse.org',
'lock': 'openSUSE:%(project)s:Staging', 'lock': 'openSUSE:%(project)s:Staging',
'lock-ns': 'openSUSE', 'lock-ns': 'openSUSE',
'leaper-override-group': 'leap-reviewers',
'delreq-review': None, 'delreq-review': None,
'main-repo': 'standard', 'main-repo': 'standard',
'download-baseurl': 'http://download.opensuse.org/distribution/leap/%(version)s/', '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, self.checker = TagChecker(apiurl=APIURL,
user='maintbot', user='maintbot',
logger=self.logger) logger=self.logger)
self.checker.override_allow = False # Test setup cannot handle.
self._request_data = """ self._request_data = """
<request id="293129" creator="darix"> <request id="293129" creator="darix">

View File

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

View File

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