Move github webhook from webapp to zuul-web
We want to have zuul-web to handle all http serving stuff so also the
github webhook handling needs to be moved to zuul-web.
Note that this changes the url of the github webhooks to
/driver/github/<connection_name>/payload.
Change-Id: I6482de6c5b9655ac0b9bf353b37a59cd5406f1b7
Signed-off-by: Jesse Keating <omgjlk@us.ibm.com>
Co-Authored-by: Tobias Henkel <tobias.henkel@bmw.de>
diff --git a/tests/base.py b/tests/base.py
index c449242..e7151df 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -66,9 +66,11 @@
import zuul.merger.server
import zuul.model
import zuul.nodepool
+import zuul.rpcclient
import zuul.zk
import zuul.configloader
from zuul.exceptions import MergeFailure
+from zuul.lib.config import get_default
FIXTURE_DIR = os.path.join(os.path.dirname(__file__),
'fixtures')
@@ -939,7 +941,7 @@
class FakeGithubConnection(githubconnection.GithubConnection):
log = logging.getLogger("zuul.test.FakeGithubConnection")
- def __init__(self, driver, connection_name, connection_config,
+ def __init__(self, driver, connection_name, connection_config, rpcclient,
changes_db=None, upstream_root=None):
super(FakeGithubConnection, self).__init__(driver, connection_name,
connection_config)
@@ -952,12 +954,16 @@
self.merge_not_allowed_count = 0
self.reports = []
self.github_client = tests.fakegithub.FakeGithub(changes_db)
+ self.rpcclient = rpcclient
def getGithubClient(self,
project=None,
user_id=None):
return self.github_client
+ def setZuulWebPort(self, port):
+ self.zuul_web_port = port
+
def openFakePullRequest(self, project, branch, subject, files=[],
body=None):
self.pr_number += 1
@@ -991,19 +997,25 @@
}
return (name, data)
- def emitEvent(self, event):
+ def emitEvent(self, event, use_zuulweb=False):
"""Emulates sending the GitHub webhook event to the connection."""
- port = self.webapp.server.socket.getsockname()[1]
name, data = event
payload = json.dumps(data).encode('utf8')
secret = self.connection_config['webhook_token']
signature = githubconnection._sign_request(payload, secret)
- headers = {'X-Github-Event': name, 'X-Hub-Signature': signature}
- req = urllib.request.Request(
- 'http://localhost:%s/connection/%s/payload'
- % (port, self.connection_name),
- data=payload, headers=headers)
- return urllib.request.urlopen(req)
+ headers = {'x-github-event': name, 'x-hub-signature': signature}
+
+ if use_zuulweb:
+ req = urllib.request.Request(
+ 'http://127.0.0.1:%s/driver/github/%s/payload'
+ % (self.zuul_web_port, self.connection_name),
+ data=payload, headers=headers)
+ return urllib.request.urlopen(req)
+ else:
+ job = self.rpcclient.submitJob(
+ 'github:%s:payload' % self.connection_name,
+ {'headers': headers, 'body': data})
+ return json.loads(job.data[0])
def addProject(self, project):
# use the original method here and additionally register it in the
@@ -1983,6 +1995,13 @@
'gearman', 'ssl_key',
os.path.join(FIXTURE_DIR, 'gearman/client.key'))
+ self.rpcclient = zuul.rpcclient.RPCClient(
+ self.config.get('gearman', 'server'),
+ self.gearman_server.port,
+ get_default(self.config, 'gearman', 'ssl_key'),
+ get_default(self.config, 'gearman', 'ssl_cert'),
+ get_default(self.config, 'gearman', 'ssl_ca'))
+
gerritsource.GerritSource.replication_timeout = 1.5
gerritsource.GerritSource.replication_retry_interval = 0.5
gerritconnection.GerritEventConnector.delay = 0.0
@@ -2000,7 +2019,7 @@
]
self.configure_connections()
- self.sched.registerConnections(self.connections, self.webapp)
+ self.sched.registerConnections(self.connections)
self.executor_server = RecordingExecutorServer(
self.config, self.connections,
@@ -2065,6 +2084,7 @@
server = config.get('server', 'github.com')
db = self.github_changes_dbs.setdefault(server, {})
con = FakeGithubConnection(driver, name, config,
+ self.rpcclient,
changes_db=db,
upstream_root=self.upstream_root)
self.event_queues.append(con.event_queue)
@@ -2297,6 +2317,7 @@
self.statsd.join()
self.webapp.stop()
self.webapp.join()
+ self.rpcclient.shutdown()
self.gearman_server.shutdown()
self.fake_nodepool.stop()
self.zk.disconnect()