{"action":"created","comment":{"url":"https://api.github.com/repos/buildbot/buildbot/pulls/comments/35082389","id":35082389,"diff_hunk":"@@ -0,0 +1,140 @@\n+# This file is part of .  Buildbot is free software: you can\n+# redistribute it and/or modify it under the terms of the GNU General Public\n+# License as published by the Free Software Foundation, version 2.\n+#\n+# This program is distributed in the hope that it will be useful, but WITHOUT\n+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n+# details.\n+#\n+# You should have received a copy of the GNU General Public License along with\n+# this program; if not, write to the Free Software Foundation, Inc., 51\n+# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n+#\n+# Copyright  Team Members\n+\n+from autobahn.twisted.wamp import ApplicationSession\n+from autobahn.twisted.wamp import Service\n+from autobahn.wamp.exception import TransportLost\n+\n+from twisted.internet import defer\n+from twisted.python import failure\n+from twisted.python import log\n+\n+from buildbot.util import service\n+\n+\n+class MasterService(ApplicationSession, service.AsyncMultiService):\n+\n+    \"\"\"\n+    concatenation of all the wamp services of buildbot\n+    \"\"\"\n+\n+    def __init__(self, config):\n+        ApplicationSession.__init__(self)\n+        service.AsyncMultiService.__init__(self)\n+        self.config = config\n+        self.setServiceParent(config.extra['parent'])\n+\n+    @defer.inlineCallbacks\n+    def onJoin(self, details):\n+        log.msg(\"Wamp connection suceed!\")\n+        for handler in [self] + self.services:\n+            yield self.register(handler)\n+            yield self.subscribe(handler)\n+        yield self.publish(\"org.buildbot.%s.connected\" % (self.master.masterid))\n+        self.parent.service = self\n+        self.parent.serviceDeferred.callback(self)\n+\n+    @defer.inlineCallbacks\n+    def onLeave(self, details):\n+        # XXX We don't handle crossbar reboot, or any other disconnection well.\n+        # this is a tricky problem, as we would have to reconnect with expononential backoff\n+        # re-subscribe to subscriptions, queue messages until reconnection.\n+        # This is quite complicated, and I believe much better handled in autobahn\n+        # It is possible that such failure is practically non-existant\n+        # so for now, we just crash the master\n+        log.msg(\"Guru meditation! We have been disconnected from wamp server\")\n+        log.msg(\"We don't know how to recover this without restarting the whole system\")\n+        log.msg(str(details))\n+        yield self.master.stopService()\n+\n+    def onUserError(self, e, msg):\n+        log.err(e, msg)\n+\n+\n+def make(config):\n+    if config:\n+        return MasterService(config)\n+    else:\n+        # if no config given, return a description of this WAMPlet ..\n+        return {'label': 'Buildbot master wamplet',\n+                'description': 'This contains all the wamp methods provided by a buildbot master'}\n+\n+\n+class WampConnector(service.ReconfigurableServiceMixin, service.AsyncMultiService):","path":"master/buildbot/wamp/connector.py","position":75,"original_position":75,"commit_id":"28a6a922859bb61e81f94edffb48cffdf8783202","original_commit_id":"28a6a922859bb61e81f94edffb48cffdf8783202","user":{"login":"yetanotherion","id":2205232,"avatar_url":"https://avatars.githubusercontent.com/u/2205232?v=3","gravatar_id":"","url":"https://api.github.com/users/yetanotherion","html_url":"https://github.com/yetanotherion","followers_url":"https://api.github.com/users/yetanotherion/followers","following_url":"https://api.github.com/users/yetanotherion/following{/other_user}","gists_url":"https://api.github.com/users/yetanotherion/gists{/gist_id}","starred_url":"https://api.github.com/users/yetanotherion/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yetanotherion/subscriptions","organizations_url":"https://api.github.com/users/yetanotherion/orgs","repos_url":"https://api.github.com/users/yetanotherion/repos","events_url":"https://api.github.com/users/yetanotherion/events{/privacy}","received_events_url":"https://api.github.com/users/yetanotherion/received_events","type":"User","site_admin":false},"body":"the SchedulerManager takes the config from c['schedulers'], and we made it a BuildbotServiceManager which permitted to find/fix bugs.\r\nI think uniformizing the way we handle services (all are either BuildbotService or BuildbotServiceManager's) has a non negligible ROI","created_at":"2015-07-21T09:01:15Z","updated_at":"2015-07-21T09:01:15Z","html_url":"https://github.com/buildbot/buildbot/pull/1773#discussion_r35082389","pull_request_url":"https://api.github.com/repos/buildbot/buildbot/pulls/1773","_links":{"self":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/comments/35082389"},"html":{"href":"https://github.com/buildbot/buildbot/pull/1773#discussion_r35082389"},"pull_request":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/1773"}}},"pull_request":{"url":"https://api.github.com/repos/buildbot/buildbot/pulls/1773","id":40015916,"html_url":"https://github.com/buildbot/buildbot/pull/1773","diff_url":"https://github.com/buildbot/buildbot/pull/1773.diff","patch_url":"https://github.com/buildbot/buildbot/pull/1773.patch","issue_url":"https://api.github.com/repos/buildbot/buildbot/issues/1773","number":1773,"state":"open","locked":false,"title":"Wampmq","user":{"login":"tardyp","id":109859,"avatar_url":"https://avatars.githubusercontent.com/u/109859?v=3","gravatar_id":"","url":"https://api.github.com/users/tardyp","html_url":"https://github.com/tardyp","followers_url":"https://api.github.com/users/tardyp/followers","following_url":"https://api.github.com/users/tardyp/following{/other_user}","gists_url":"https://api.github.com/users/tardyp/gists{/gist_id}","starred_url":"https://api.github.com/users/tardyp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tardyp/subscriptions","organizations_url":"https://api.github.com/users/tardyp/orgs","repos_url":"https://api.github.com/users/tardyp/repos","events_url":"https://api.github.com/users/tardyp/events{/privacy}","received_events_url":"https://api.github.com/users/tardyp/received_events","type":"User","site_admin":false},"body":"\r\nThis is a MQ implementation using [wamp](http://wamp.ws/)  protocol.\r\nThis implementation uses [Python Autobahn](http://autobahn.ws) wamp client library, and is fully asynchronous (no use of threads)\r\nTo use this implementation, you need a wamp router like [Crossbar](http://crossbar.io).\r\nThe implementation does not yet support wamp authentication yet.\r\nThis MQ allows buildbot to run in multi-master mode.\r\n\r\nNote that this implementation also does not support message persistence across a restart of the master.\r\nFor example, if a change is received, but the master shuts down before the schedulers can create build requests for it, then those schedulers will not be notified of the change when the master starts again.\r\n","created_at":"2015-07-15T12:15:26Z","updated_at":"2015-07-21T09:01:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7bb28f137a2d30caacd3954923311124f90ad8bf","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/buildbot/buildbot/pulls/1773/commits","review_comments_url":"https://api.github.com/repos/buildbot/buildbot/pulls/1773/comments","review_comment_url":"https://api.github.com/repos/buildbot/buildbot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/buildbot/buildbot/issues/1773/comments","statuses_url":"https://api.github.com/repos/buildbot/buildbot/statuses/28a6a922859bb61e81f94edffb48cffdf8783202","head":{"label":"tardyp:wampmq","ref":"wampmq","sha":"28a6a922859bb61e81f94edffb48cffdf8783202","user":{"login":"tardyp","id":109859,"avatar_url":"https://avatars.githubusercontent.com/u/109859?v=3","gravatar_id":"","url":"https://api.github.com/users/tardyp","html_url":"https://github.com/tardyp","followers_url":"https://api.github.com/users/tardyp/followers","following_url":"https://api.github.com/users/tardyp/following{/other_user}","gists_url":"https://api.github.com/users/tardyp/gists{/gist_id}","starred_url":"https://api.github.com/users/tardyp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tardyp/subscriptions","organizations_url":"https://api.github.com/users/tardyp/orgs","repos_url":"https://api.github.com/users/tardyp/repos","events_url":"https://api.github.com/users/tardyp/events{/privacy}","received_events_url":"https://api.github.com/users/tardyp/received_events","type":"User","site_admin":false},"repo":{"id":930175,"name":"buildbot","full_name":"tardyp/buildbot","owner":{"login":"tardyp","id":109859,"avatar_url":"https://avatars.githubusercontent.com/u/109859?v=3","gravatar_id":"","url":"https://api.github.com/users/tardyp","html_url":"https://github.com/tardyp","followers_url":"https://api.github.com/users/tardyp/followers","following_url":"https://api.github.com/users/tardyp/following{/other_user}","gists_url":"https://api.github.com/users/tardyp/gists{/gist_id}","starred_url":"https://api.github.com/users/tardyp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tardyp/subscriptions","organizations_url":"https://api.github.com/users/tardyp/orgs","repos_url":"https://api.github.com/users/tardyp/repos","events_url":"https://api.github.com/users/tardyp/events{/privacy}","received_events_url":"https://api.github.com/users/tardyp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tardyp/buildbot","description":"Python-based continuous integration testing framework; send pull requests for your patches!","fork":true,"url":"https://api.github.com/repos/tardyp/buildbot","forks_url":"https://api.github.com/repos/tardyp/buildbot/forks","keys_url":"https://api.github.com/repos/tardyp/buildbot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tardyp/buildbot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tardyp/buildbot/teams","hooks_url":"https://api.github.com/repos/tardyp/buildbot/hooks","issue_events_url":"https://api.github.com/repos/tardyp/buildbot/issues/events{/number}","events_url":"https://api.github.com/repos/tardyp/buildbot/events","assignees_url":"https://api.github.com/repos/tardyp/buildbot/assignees{/user}","branches_url":"https://api.github.com/repos/tardyp/buildbot/branches{/branch}","tags_url":"https://api.github.com/repos/tardyp/buildbot/tags","blobs_url":"https://api.github.com/repos/tardyp/buildbot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tardyp/buildbot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tardyp/buildbot/git/refs{/sha}","trees_url":"https://api.github.com/repos/tardyp/buildbot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tardyp/buildbot/statuses/{sha}","languages_url":"https://api.github.com/repos/tardyp/buildbot/languages","stargazers_url":"https://api.github.com/repos/tardyp/buildbot/stargazers","contributors_url":"https://api.github.com/repos/tardyp/buildbot/contributors","subscribers_url":"https://api.github.com/repos/tardyp/buildbot/subscribers","subscription_url":"https://api.github.com/repos/tardyp/buildbot/subscription","commits_url":"https://api.github.com/repos/tardyp/buildbot/commits{/sha}","git_commits_url":"https://api.github.com/repos/tardyp/buildbot/git/commits{/sha}","comments_url":"https://api.github.com/repos/tardyp/buildbot/comments{/number}","issue_comment_url":"https://api.github.com/repos/tardyp/buildbot/issues/comments{/number}","contents_url":"https://api.github.com/repos/tardyp/buildbot/contents/{+path}","compare_url":"https://api.github.com/repos/tardyp/buildbot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tardyp/buildbot/merges","archive_url":"https://api.github.com/repos/tardyp/buildbot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tardyp/buildbot/downloads","issues_url":"https://api.github.com/repos/tardyp/buildbot/issues{/number}","pulls_url":"https://api.github.com/repos/tardyp/buildbot/pulls{/number}","milestones_url":"https://api.github.com/repos/tardyp/buildbot/milestones{/number}","notifications_url":"https://api.github.com/repos/tardyp/buildbot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tardyp/buildbot/labels{/name}","releases_url":"https://api.github.com/repos/tardyp/buildbot/releases{/id}","created_at":"2010-09-22T09:33:50Z","updated_at":"2014-06-24T21:37:41Z","pushed_at":"2015-07-17T15:26:52Z","git_url":"git://github.com/tardyp/buildbot.git","ssh_url":"git@github.com:tardyp/buildbot.git","clone_url":"https://github.com/tardyp/buildbot.git","svn_url":"https://github.com/tardyp/buildbot","homepage":"http://buildbot.net","size":38054,"stargazers_count":4,"watchers_count":4,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":4,"default_branch":"nine"}},"base":{"label":"buildbot:master","ref":"master","sha":"d85c514c0466ca8e12fe61dac31e7ef20c52269b","user":{"login":"buildbot","id":324515,"avatar_url":"https://avatars.githubusercontent.com/u/324515?v=3","gravatar_id":"","url":"https://api.github.com/users/buildbot","html_url":"https://github.com/buildbot","followers_url":"https://api.github.com/users/buildbot/followers","following_url":"https://api.github.com/users/buildbot/following{/other_user}","gists_url":"https://api.github.com/users/buildbot/gists{/gist_id}","starred_url":"https://api.github.com/users/buildbot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/buildbot/subscriptions","organizations_url":"https://api.github.com/users/buildbot/orgs","repos_url":"https://api.github.com/users/buildbot/repos","events_url":"https://api.github.com/users/buildbot/events{/privacy}","received_events_url":"https://api.github.com/users/buildbot/received_events","type":"Organization","site_admin":false},"repo":{"id":760165,"name":"buildbot","full_name":"buildbot/buildbot","owner":{"login":"buildbot","id":324515,"avatar_url":"https://avatars.githubusercontent.com/u/324515?v=3","gravatar_id":"","url":"https://api.github.com/users/buildbot","html_url":"https://github.com/buildbot","followers_url":"https://api.github.com/users/buildbot/followers","following_url":"https://api.github.com/users/buildbot/following{/other_user}","gists_url":"https://api.github.com/users/buildbot/gists{/gist_id}","starred_url":"https://api.github.com/users/buildbot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/buildbot/subscriptions","organizations_url":"https://api.github.com/users/buildbot/orgs","repos_url":"https://api.github.com/users/buildbot/repos","events_url":"https://api.github.com/users/buildbot/events{/privacy}","received_events_url":"https://api.github.com/users/buildbot/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/buildbot/buildbot","description":"Python-based continuous integration testing framework; your pull requests are more than welcome!","fork":false,"url":"https://api.github.com/repos/buildbot/buildbot","forks_url":"https://api.github.com/repos/buildbot/buildbot/forks","keys_url":"https://api.github.com/repos/buildbot/buildbot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/buildbot/buildbot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/buildbot/buildbot/teams","hooks_url":"https://api.github.com/repos/buildbot/buildbot/hooks","issue_events_url":"https://api.github.com/repos/buildbot/buildbot/issues/events{/number}","events_url":"https://api.github.com/repos/buildbot/buildbot/events","assignees_url":"https://api.github.com/repos/buildbot/buildbot/assignees{/user}","branches_url":"https://api.github.com/repos/buildbot/buildbot/branches{/branch}","tags_url":"https://api.github.com/repos/buildbot/buildbot/tags","blobs_url":"https://api.github.com/repos/buildbot/buildbot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/buildbot/buildbot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/buildbot/buildbot/git/refs{/sha}","trees_url":"https://api.github.com/repos/buildbot/buildbot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/buildbot/buildbot/statuses/{sha}","languages_url":"https://api.github.com/repos/buildbot/buildbot/languages","stargazers_url":"https://api.github.com/repos/buildbot/buildbot/stargazers","contributors_url":"https://api.github.com/repos/buildbot/buildbot/contributors","subscribers_url":"https://api.github.com/repos/buildbot/buildbot/subscribers","subscription_url":"https://api.github.com/repos/buildbot/buildbot/subscription","commits_url":"https://api.github.com/repos/buildbot/buildbot/commits{/sha}","git_commits_url":"https://api.github.com/repos/buildbot/buildbot/git/commits{/sha}","comments_url":"https://api.github.com/repos/buildbot/buildbot/comments{/number}","issue_comment_url":"https://api.github.com/repos/buildbot/buildbot/issues/comments{/number}","contents_url":"https://api.github.com/repos/buildbot/buildbot/contents/{+path}","compare_url":"https://api.github.com/repos/buildbot/buildbot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/buildbot/buildbot/merges","archive_url":"https://api.github.com/repos/buildbot/buildbot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/buildbot/buildbot/downloads","issues_url":"https://api.github.com/repos/buildbot/buildbot/issues{/number}","pulls_url":"https://api.github.com/repos/buildbot/buildbot/pulls{/number}","milestones_url":"https://api.github.com/repos/buildbot/buildbot/milestones{/number}","notifications_url":"https://api.github.com/repos/buildbot/buildbot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/buildbot/buildbot/labels{/name}","releases_url":"https://api.github.com/repos/buildbot/buildbot/releases{/id}","created_at":"2010-07-06T17:56:53Z","updated_at":"2015-07-20T15:56:07Z","pushed_at":"2015-07-20T18:25:35Z","git_url":"git://github.com/buildbot/buildbot.git","ssh_url":"git@github.com:buildbot/buildbot.git","clone_url":"https://github.com/buildbot/buildbot.git","svn_url":"https://github.com/buildbot/buildbot","homepage":"http://buildbot.net","size":51736,"stargazers_count":1640,"watchers_count":1640,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":727,"mirror_url":null,"open_issues_count":35,"forks":727,"open_issues":35,"watchers":1640,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/1773"},"html":{"href":"https://github.com/buildbot/buildbot/pull/1773"},"issue":{"href":"https://api.github.com/repos/buildbot/buildbot/issues/1773"},"comments":{"href":"https://api.github.com/repos/buildbot/buildbot/issues/1773/comments"},"review_comments":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/1773/comments"},"review_comment":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/buildbot/buildbot/pulls/1773/commits"},"statuses":{"href":"https://api.github.com/repos/buildbot/buildbot/statuses/28a6a922859bb61e81f94edffb48cffdf8783202"}}}}