From ff40d285de43dde48665f870f4fe826f3c1f90db Mon Sep 17 00:00:00 2001 From: gryf Date: Thu, 31 Oct 2019 19:05:58 +0100 Subject: [PATCH] Added more event to be supported from REST server. Also, now we closing channel in case of "gerrit stream-events" command, since it is a command like any other - there is no special case for keeping it open. --- ferrit/rest.py | 123 +++++++++++++++++++++++++++++++++++++------------ ferrit/ssh.py | 18 +++++--- 2 files changed, 105 insertions(+), 36 deletions(-) diff --git a/ferrit/rest.py b/ferrit/rest.py index 221784e..87de1f6 100755 --- a/ferrit/rest.py +++ b/ferrit/rest.py @@ -14,44 +14,105 @@ LOG_PATH = './' LOG = logging.getLogger('bottle') LOG.setLevel(logging.DEBUG) handler = logging.FileHandler(os.path.join(LOG_PATH, 'ferrit-http.log')) -handler.setFormatter(logging.Formatter('%(asctime)s %(message)s')) +handler.setFormatter(logging.Formatter('%(message)s')) LOG.addHandler(handler) - +JDOE = {"email": "j.doe@nonexistent.com", + "name": "John Doe", + "username": "jdoe"} PATCHSET_CREATED = {"change": {"branch": "master", "commitMessage": "commit msg", "id": "I1", - "number": "691277", - "owner": {"email": "j.doe@nonexistent.com", - "name": "John Doe", - "username": "jdoe"}, + "number": "1", + "owner": JDOE, "project": "foo", "status": "NEW", "subject": "create new patch", "url": "http://localhost:8181/1"}, "changeKey": {"id": "I1"}, "eventCreatedOn": int(time.time()), - "patchSet": {"author": {"email": "j.doe@nonexistent.com", - "name": "John Doe", - "username": "jdoe"}, + "patchSet": {"author": JDOE, "createdOn": int(time.time()) - 1000, "isDraft": False, "kind": "REWORK", "number": "1", - "parents": ["559721d9"], - "ref": "refs/changes/77/691277/1", + "parents": ["2"], + "ref": "refs/changes/77/1/1", "revision": "e3c8ac50", "sizeDeletions": -15, "sizeInsertions": 29, - "uploader": {"email": "j.doe@nonexistent.com", - "name": "John Doe", - "username": "jdoe"}}, + "uploader": JDOE}, "project": "foo", "refName": "refs/heads/master", "type": "patchset-created", - "uploader": {"email": "j.doe@nonexistent.com", - "name": "John Doe", - "username": "jdoe"}} + "uploader": JDOE} +RECHECK = {"approvals": [{"description": "Verified", + "type": "Verified", + "value": "0"}, + {"description": "Code-Review", + "type": "Code-Review", + "value": "0"}, + {"description": "Workflow", + "type": "Workflow", + "value": "0"}], + "author": JDOE, + "change": {"branch": "master", + "commitMessage": "commit msg", + "id": "I1", + "number": "690077", + "owner": JDOE, + "project": "foo", + "status": "NEW", + "subject": "create new patch", + "topic": "test", + "url": "http://localhost:8181/1"}, + "changeKey": {"id": "I1"}, + "comment": "Patch Set 1:\n\nrecheck", + "eventCreatedOn": int(time.time()), + "patchSet": {"author": JDOE, + "createdOn": int(time.time()) - 1000, + "isDraft": False, + "kind": "NO_CODE_CHANGE", + "number": "1", + "parents": ["2"], + "ref": "refs/changes/77/1/1", + "revision": "e3c8ac50", + "sizeDeletions": -15, + "sizeInsertions": 29, + "uploader": JDOE}, + "project": "foo", + "refName": "refs/heads/master", + "type": "comment-added"} +MERGED = {"change": {"branch": "master", + "commitMessage": "commit msg", + "id": "I1", + "number": "1", + "owner": JDOE, + "project": "foo", + "status": "MERGED", + "subject": "create new patch", + "topic": "test", + "url": "http://localhost:8181/3"}, + "changeKey": {"id": "I1"}, + "eventCreatedOn": int(time.time()), + "newRev": "0ce5beac", + "patchSet": { + "author": JDOE, + "createdOn": int(time.time()) - 1000, + "isDraft": False, + "kind": "REWORK", + "number": "3", + "parents": ["1"], + "ref": "refs/changes/77/1/1", + "revision": "e3c8ac50", + "sizeDeletions": -8, + "sizeInsertions": 83, + "uploader": JDOE}, + "project": "foo", + "refName": "refs/heads/master", + "submitter": {"name": "CI", + "username": "ci"}, + "type": "change-merged"} class App(bottle.Bottle): @@ -66,19 +127,24 @@ class App(bottle.Bottle): self.post('/make/event', callback=self._mk_event) def _mk_event(self): - if bottle.request.forms.get('type') == 'patchset-created': - data = dict(PATCHSET_CREATED) + events = {PATCHSET_CREATED['type']: PATCHSET_CREATED, + RECHECK['type']: RECHECK, + MERGED['type']: MERGED} - if 'project' in bottle.request.forms: - data['change']['project'] = bottle.request.forms['project'] - data['project'] = bottle.request.forms['project'] + if bottle.request.forms.get('type') not in events.keys(): + return - if 'branch' in bottle.request.forms: - data['change']['branch'] = bottle.request.forms['branch'] + data = dict(events[bottle.request.forms.get('type')]) + if 'project' in bottle.request.forms: + data['change']['project'] = bottle.request.forms['project'] + data['project'] = bottle.request.forms['project'] - with open(FIFO, 'w') as fobj: - fobj.write(json.dumps(data)) - fobj.write('\n') + if 'branch' in bottle.request.forms: + data['change']['branch'] = bottle.request.forms['branch'] + + with open(FIFO, 'w') as fobj: + fobj.write(json.dumps(data)) + fobj.write('\n') def _documentation(self, whatever, params=None): return @@ -122,7 +188,6 @@ class App(bottle.Bottle): return LOG.info(json.dumps(bottle.request.json)) - LOG.info('Verified: %s', labels.get('Verified')) def main(): @@ -132,7 +197,7 @@ def main(): if __name__ == "__main__": # development version, meant to be run as stand alone module, like - # python -m ferrit.http + # python -m ferrit.rest handler = logging.StreamHandler(sys.stdout) handler.setFormatter(logging.Formatter('%(asctime)s %(message)s')) LOG.addHandler(handler) diff --git a/ferrit/ssh.py b/ferrit/ssh.py index c37e758..eb7ad31 100755 --- a/ferrit/ssh.py +++ b/ferrit/ssh.py @@ -116,6 +116,7 @@ class SSHHandler(socketserver.StreamRequestHandler): LOG.debug("Writing %s to channel", data) channel.send(data) data = None + channel.close() def _version(self, channel): LOG.debug('sending version string') @@ -181,13 +182,6 @@ def main(): if __name__ == "__main__": - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('-k', '--key', default=KEY, - help='Path to the private server key') - args = parser.parse_args() - KEY = args.key - os.mkfifo(FIFO) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(logging.Formatter('%(asctime)s [%(levelname)s] ' '%(funcName)s:%(lineno)s - ' @@ -196,7 +190,17 @@ if __name__ == "__main__": LOG.setLevel(logging.DEBUG) LOG.addHandler(handler) LOG.debug('Start up development server') + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('-k', '--key', default=KEY, + help='Path to the private server key') + args = parser.parse_args() + KEY = args.key + LOG.debug('Creating FIFO: %s', FIFO) + os.mkfifo(FIFO) + try: main() finally: + LOG.debug('Removing FIFO: %s', FIFO) os.unlink(FIFO)