ReviewBot: provide comment command override.
For example: @leaper override accept @repo-checker override decline
This commit is contained in:
parent
056ab71426
commit
a40ebc1544
42
ReviewBot.py
42
ReviewBot.py
@ -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:
|
||||||
|
@ -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'
|
||||||
|
@ -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/',
|
||||||
|
@ -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">
|
||||||
|
@ -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):
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user