)]}'
{"doc/source/discussion/components.rst":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"      finger gateway of the other zone is a central entrypoint for all live"},{"line_number":1027,"context_line":"      log streams of that zone."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"      If this is used the finger gateways should be configured accordingly."},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":".. _web-server-tenant-scoped-api:"},{"line_number":1032,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"1b3c4604_577d6b11","line":1029,"updated":"2021-03-29 23:04:21.000000000","message":"We should support zuul-web being unzoned in a mixed system (zuul-web unzoned, and both zoned and unzoned executors).  In that case, a user should omit \"zone\" here.  We should explicitly mention that.","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"1c2de638e227eb14ed1c2861e8a4bae1e5ce9dab","unresolved":true,"context_lines":[{"line_number":1027,"context_line":"      log streams of that zone."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"      If this is used the finger gateways should be configured accordingly."},{"line_number":1030,"context_line":""},{"line_number":1031,"context_line":".. _web-server-tenant-scoped-api:"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"Enabling tenant-scoped access to privileged actions"}],"source_content_type":"text/x-rst","patch_set":20,"id":"c9e2691d_4210261d","line":1030,"updated":"2021-03-31 07:55:35.000000000","message":"Hostname override should be documented here.","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":1287,"context_line":"      The zone where the finger gateway is located. This is only needed for"},{"line_number":1288,"context_line":"      live log streaming if the zuul deployment is spread over multiple"},{"line_number":1289,"context_line":"      zones without the ability to directly connect to all executors from"},{"line_number":1290,"context_line":"      zuul-web. See :attr:`executor.zone` for further information."},{"line_number":1291,"context_line":""},{"line_number":1292,"context_line":"Operation"},{"line_number":1293,"context_line":"~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":20,"id":"b8f9fc60_e19e9b4b","line":1290,"updated":"2021-03-29 23:04:21.000000000","message":"Ditto.","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"}],"releasenotes/notes/distributed-executors-270abdf6cd3dc303.yaml":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Zuul now can route live log streams via finger gateways to make it possible"},{"line_number":5,"context_line":"    to distribute executors over multiple datacenters without the possibility"},{"line_number":6,"context_line":"    to directly contact every executor from within zuul-web. This is typical"},{"line_number":7,"context_line":"    the case in an k8s based deployment."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"1cec5430_2410a582","line":6,"updated":"2021-03-29 23:04:21.000000000","message":"typo: typically","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"}],"tests/unit/test_component_registry.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            \u0027fingergw\u0027: {"},{"line_number":98,"context_line":"                \u0027listen_address\u0027: self.host,"},{"line_number":99,"context_line":"                \u0027port\u0027: \u00270\u0027,"},{"line_number":100,"context_line":"                \u0027hostname\u0027: \u0027localhost\u0027,"},{"line_number":101,"context_line":"            }"},{"line_number":102,"context_line":"        })"},{"line_number":103,"context_line":"        gateway \u003d FingerGateway("}],"source_content_type":"text/x-python","patch_set":20,"id":"8a10d4ae_5489243e","line":100,"updated":"2021-03-29 23:04:21.000000000","message":"Is this adding an undocumented config value?","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"1c2de638e227eb14ed1c2861e8a4bae1e5ce9dab","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            \u0027fingergw\u0027: {"},{"line_number":98,"context_line":"                \u0027listen_address\u0027: self.host,"},{"line_number":99,"context_line":"                \u0027port\u0027: \u00270\u0027,"},{"line_number":100,"context_line":"                \u0027hostname\u0027: \u0027localhost\u0027,"},{"line_number":101,"context_line":"            }"},{"line_number":102,"context_line":"        })"},{"line_number":103,"context_line":"        gateway \u003d FingerGateway("}],"source_content_type":"text/x-python","patch_set":20,"id":"9fd2d7ca_26c94b02","line":100,"in_reply_to":"8a10d4ae_5489243e","updated":"2021-03-31 07:55:35.000000000","message":"That adds the hostname config value just like the executor has as an optional override. I agree that this should be documented.","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"}],"tests/unit/test_streaming.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"675f3b3300a5da0e7d51aa9c1cd02637eb924dbf","unresolved":true,"context_lines":[{"line_number":596,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":597,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":598,"context_line":"        # if not hasattr(self.fingergw, \u0027history\u0027):"},{"line_number":599,"context_line":"        #     self.fingergw.history \u003d []"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _fingerClient(self, server, port, build_uuid):"},{"line_number":602,"context_line":"        self.fingergw.history.append(build_uuid)"}],"source_content_type":"text/x-python","patch_set":23,"id":"c48e4186_90b82add","line":599,"updated":"2021-07-27 22:15:31.000000000","message":"Does this get cleaned up at some point?","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3b8a651b6c512b0beab7ce8396d13be2f8e88637","unresolved":false,"context_lines":[{"line_number":596,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":597,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":598,"context_line":"        # if not hasattr(self.fingergw, \u0027history\u0027):"},{"line_number":599,"context_line":"        #     self.fingergw.history \u003d []"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _fingerClient(self, server, port, build_uuid):"},{"line_number":602,"context_line":"        self.fingergw.history.append(build_uuid)"}],"source_content_type":"text/x-python","patch_set":23,"id":"b83dfbfe_a372b3c5","line":599,"updated":"2021-07-27 22:19:23.000000000","message":"Nope, I\u0027ll make a followup.","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"675f3b3300a5da0e7d51aa9c1cd02637eb924dbf","unresolved":true,"context_lines":[{"line_number":766,"context_line":"        logfile.close()"},{"line_number":767,"context_line":"        self.log.debug(\"\\n\\nFile contents: %s\\n\\n\", file_contents)"},{"line_number":768,"context_line":"        self.log.debug(\"\\n\\nStreamed: %s\\n\\n\","},{"line_number":769,"context_line":"                       self.streaming_data[\u0027us-west-alone\u0027])"},{"line_number":770,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027us-west-alone\u0027])"},{"line_number":771,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027us-west\u0027])"},{"line_number":772,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027unzoned\u0027])"}],"source_content_type":"text/x-python","patch_set":23,"id":"662ad638_701103a4","line":769,"updated":"2021-07-27 22:15:31.000000000","message":"This is an odd one to debug? I guess they should all be equivalent?","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3b8a651b6c512b0beab7ce8396d13be2f8e88637","unresolved":false,"context_lines":[{"line_number":766,"context_line":"        logfile.close()"},{"line_number":767,"context_line":"        self.log.debug(\"\\n\\nFile contents: %s\\n\\n\", file_contents)"},{"line_number":768,"context_line":"        self.log.debug(\"\\n\\nStreamed: %s\\n\\n\","},{"line_number":769,"context_line":"                       self.streaming_data[\u0027us-west-alone\u0027])"},{"line_number":770,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027us-west-alone\u0027])"},{"line_number":771,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027us-west\u0027])"},{"line_number":772,"context_line":"        self.assertEqual(file_contents, self.streaming_data[\u0027unzoned\u0027])"}],"source_content_type":"text/x-python","patch_set":23,"id":"56e66de9_01521fd5","line":769,"updated":"2021-07-27 22:19:23.000000000","message":"Yeah, can always add more later.","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"}],"zuul/lib/fingergw.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                config,"},{"line_number":186,"context_line":"                jobs)"},{"line_number":187,"context_line":"        else:"},{"line_number":188,"context_line":"            self.gearworker \u003d None"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.zk_client \u003d ZooKeeperClient.fromConfig(config)"},{"line_number":191,"context_line":"        self.zk_client.connect()"}],"source_content_type":"text/x-python","patch_set":20,"id":"e043ed6b_61d6f0f8","line":188,"updated":"2021-03-29 23:04:21.000000000","message":"Instead of this, why don\u0027t we register this information in the component registry?","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"1c2de638e227eb14ed1c2861e8a4bae1e5ce9dab","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                config,"},{"line_number":186,"context_line":"                jobs)"},{"line_number":187,"context_line":"        else:"},{"line_number":188,"context_line":"            self.gearworker \u003d None"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.zk_client \u003d ZooKeeperClient.fromConfig(config)"},{"line_number":191,"context_line":"        self.zk_client.connect()"}],"source_content_type":"text/x-python","patch_set":20,"id":"b29fba65_e87bf0bd","line":188,"in_reply_to":"e043ed6b_61d6f0f8","updated":"2021-03-31 07:55:35.000000000","message":"Ack, now that the component registry exists we should use that instead.","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"5957562eb3127d986a98bb407149f2d1ff1b5721","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.zk_client \u003d ZooKeeperClient.fromConfig(config)"},{"line_number":191,"context_line":"        self.zk_client.connect()"},{"line_number":192,"context_line":"        self.hostname \u003d socket.getfqdn()"},{"line_number":193,"context_line":"        self.component_info \u003d FingerGatewayComponent("},{"line_number":194,"context_line":"            self.zk_client, self.hostname"},{"line_number":195,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":22,"id":"03a0f8fa_f050e5e6","line":192,"updated":"2021-06-21 20:40:04.000000000","message":"Done in https://review.opendev.org/793666 PS4 (where we switch to using the component registry).","commit_id":"98a1faac12eac17e11b9ad8f31a7f1686812619f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"301f76b1125fa639e74b846bf5b1dbcfd4ec8f16","unresolved":true,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.zk_client \u003d ZooKeeperClient.fromConfig(config)"},{"line_number":191,"context_line":"        self.zk_client.connect()"},{"line_number":192,"context_line":"        self.hostname \u003d socket.getfqdn()"},{"line_number":193,"context_line":"        self.component_info \u003d FingerGatewayComponent("},{"line_number":194,"context_line":"            self.zk_client, self.hostname"},{"line_number":195,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":22,"id":"cc9948a6_e7c35f08","line":192,"updated":"2021-06-10 12:09:38.000000000","message":"This line overwrites the hostname config from above and needs to be removed.","commit_id":"98a1faac12eac17e11b9ad8f31a7f1686812619f"},{"author":{"_account_id":16068,"name":"Tobias Henkel","email":"tobias.henkel@bmw.de","username":"tobias.henkel"},"change_message_id":"e26d7be6b8c07ad6bd4ae39ced7b6dbc33ec0fb4","unresolved":true,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.zk_client \u003d ZooKeeperClient.fromConfig(config)"},{"line_number":191,"context_line":"        self.zk_client.connect()"},{"line_number":192,"context_line":"        self.hostname \u003d socket.getfqdn()"},{"line_number":193,"context_line":"        self.component_info \u003d FingerGatewayComponent("},{"line_number":194,"context_line":"            self.zk_client, self.hostname"},{"line_number":195,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":22,"id":"bff2b497_93045e6c","line":192,"in_reply_to":"cc9948a6_e7c35f08","updated":"2021-06-10 12:13:45.000000000","message":"This hit us during local testing in our integration deployment. I guess we should add a test case that validates the hostname override in the component registry.","commit_id":"98a1faac12eac17e11b9ad8f31a7f1686812619f"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"675f3b3300a5da0e7d51aa9c1cd02637eb924dbf","unresolved":true,"context_lines":[{"line_number":326,"context_line":"        self.log.debug(\"Submitting job %s with data %s\" % (name, data))"},{"line_number":327,"context_line":"        job \u003d gear.TextJob(name,"},{"line_number":328,"context_line":"                           json.dumps(data),"},{"line_number":329,"context_line":"                           unique\u003dstr(time.time()))"},{"line_number":330,"context_line":"        self.gearman.submitJob(job, timeout\u003d300)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.log.debug(\"Waiting for job completion\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"2b68adb9_e03fb67f","line":329,"range":{"start_line":329,"start_character":38,"end_line":329,"end_character":49},"updated":"2021-07-27 22:15:31.000000000","message":"I know this doesn\u0027t matter much as the next change deletes this code, but probably better to use uuid4 if this sticks around?","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3b8a651b6c512b0beab7ce8396d13be2f8e88637","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        self.log.debug(\"Submitting job %s with data %s\" % (name, data))"},{"line_number":327,"context_line":"        job \u003d gear.TextJob(name,"},{"line_number":328,"context_line":"                           json.dumps(data),"},{"line_number":329,"context_line":"                           unique\u003dstr(time.time()))"},{"line_number":330,"context_line":"        self.gearman.submitJob(job, timeout\u003d300)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        self.log.debug(\"Waiting for job completion\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"c7d106a2_19ea26fa","line":329,"updated":"2021-07-27 22:19:23.000000000","message":"Yeah.  It\u0027s a copy pasta from rpcclient; apparently it\u0027s worked well enough, but I agree, uuid4 is better.","commit_id":"5c4e8d7ddddafc1f4964a0498dfcaa7ac28da09d"}],"zuul/rpclistener.py":[{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"3ff07aa2c9e698e7fb7ddff0311d92bd4885f88c","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            # via a finger gateway in that zone."},{"line_number":321,"context_line":"            source_zone \u003d args.get(\u0027source_zone\u0027)"},{"line_number":322,"context_line":"            if (source_zone and build.worker.zone and"},{"line_number":323,"context_line":"                    source_zone !\u003d build.worker.zone):"},{"line_number":324,"context_line":"                info \u003d self.sched.finger_client.get_fingergw_in_zone("},{"line_number":325,"context_line":"                    build.worker.zone)"},{"line_number":326,"context_line":"                if info:"}],"source_content_type":"text/x-python","patch_set":20,"id":"88649c9a_0d730ebc","line":323,"updated":"2021-03-29 23:04:21.000000000","message":"This doesn\u0027t appear to handle the case of an unzoned request in a mixed zoned/unzoned system.  I think for that we could just do this:\n\nif (build.worker.zone and source_zone !\u003d build.worker.zone):","commit_id":"a786e5cd49a5b47d1e951910cebf57fc5b541abb"}]}
