)]}'
{"neutron/agent/ovn/metadata/agent.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        # it\u0027s already set."},{"line_number":254,"context_line":"        table \u003d (\u0027Chassis_Private\u0027 if self.has_chassis_private else \u0027Chassis\u0027)"},{"line_number":255,"context_line":"        chassis_id \u003d uuid.UUID(self._get_own_chassis_name())"},{"line_number":256,"context_line":"        # Generate unique, but consistent metadata id for chassis name"},{"line_number":257,"context_line":"        agent_id \u003d uuid.uuid5(chassis_id, \u0027metadata_agent\u0027)"},{"line_number":258,"context_line":"        ext_ids \u003d {ovn_const.OVN_AGENT_METADATA_ID_KEY: str(agent_id)}"},{"line_number":259,"context_line":"        self.sb_idl.db_add(table, self.chassis, \u0027external_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_8e1d6675","line":256,"updated":"2020-11-03 11:35:58.000000000","message":"Is this the reason uuid module is used instead of uuidutils from oslo.utils?","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        # it\u0027s already set."},{"line_number":254,"context_line":"        table \u003d (\u0027Chassis_Private\u0027 if self.has_chassis_private else \u0027Chassis\u0027)"},{"line_number":255,"context_line":"        chassis_id \u003d uuid.UUID(self._get_own_chassis_name())"},{"line_number":256,"context_line":"        # Generate unique, but consistent metadata id for chassis name"},{"line_number":257,"context_line":"        agent_id \u003d uuid.uuid5(chassis_id, \u0027metadata_agent\u0027)"},{"line_number":258,"context_line":"        ext_ids \u003d {ovn_const.OVN_AGENT_METADATA_ID_KEY: str(agent_id)}"},{"line_number":259,"context_line":"        self.sb_idl.db_add(table, self.chassis, \u0027external_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_361d8473","line":256,"in_reply_to":"1f621f24_8e1d6675","updated":"2020-11-03 15:26:51.000000000","message":"yes. Can\u0027t use uuid4(), which oslo.utils uses, because we need the metadata uuid to stay the same for the same chassis because of the cache.","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"}],"neutron/plugins/ml2/drivers/ovn/agent/neutron_agent.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"52f01b2473cd32f55705f65fba5f5ff6fd3c9334","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def __new__(cls, chassis_private, driver, updated_at\u003dNone):"},{"line_number":108,"context_line":"        if (\u0027enable-chassis-as-gw\u0027 in"},{"line_number":109,"context_line":"                chassis_private.external_ids.get(\u0027ovn-cms-options\u0027, [])):"},{"line_number":110,"context_line":"            cls \u003d ControllerGatewayAgent"},{"line_number":111,"context_line":"        return super().__new__(cls)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_046d7702","line":110,"updated":"2020-09-22 04:20:46.000000000","message":"pep8: W0642: Invalid assignment to cls in method (self-cls-assignment)","commit_id":"fc88983f07bd40974b467cc0f4f79fbae61aea39"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"45efbbdecb54eed708f66e03c39466cb5aff93f4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def alive(self):"},{"line_number":73,"context_line":"        if self.set_down:"},{"line_number":74,"context_line":"            return False"},{"line_number":75,"context_line":"        # TODO (twilson) Determine if we can go back to just checking:"},{"line_number":76,"context_line":"        # if self.driver._nb_ovn.nb_global.nb_cfg \u003d\u003d self.nb_cfg:"},{"line_number":77,"context_line":"        if self.driver._nb_ovn.nb_global.nb_cfg - self.nb_cfg \u003c\u003d 1:"},{"line_number":78,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f65232a_5d73fdb1","line":75,"updated":"2020-10-27 23:37:27.000000000","message":"pep8: H101: Use TODO(NAME)","commit_id":"a646d2f9322fffe1ed02a10a6d6e970fd2245f1e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            self.agents[agent.agent_id] \u003d agent"},{"line_number":204,"context_line":"        return agent"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def remove(self, agent_id):"},{"line_number":207,"context_line":"        del self.agents[agent_id]"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def agents_by_chassis_private(self, chassis_private):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_cde64317","line":206,"updated":"2020-11-03 11:35:58.000000000","message":"nit: If __getitem__ is implemented, maybe we can do __delitem__ instead to provide dict-like experience?","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            self.agents[agent.agent_id] \u003d agent"},{"line_number":204,"context_line":"        return agent"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def remove(self, agent_id):"},{"line_number":207,"context_line":"        del self.agents[agent_id]"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def agents_by_chassis_private(self, chassis_private):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_f6d5cce6","line":206,"in_reply_to":"1f621f24_cde64317","updated":"2020-11-03 15:26:51.000000000","message":"Good call.","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"},{"line_number":220,"context_line":"            # also more complex elsewhere."},{"line_number":221,"context_line":"            if type(agent) \u003d\u003d cls:  # pylint: disable\u003dunidiomatic-typecheck"},{"line_number":222,"context_line":"                agents.add(agent)"},{"line_number":223,"context_line":"        return agents"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_2dbb77c4","line":221,"updated":"2020-11-03 11:35:58.000000000","message":"I don\u0027t understand this check. How is it possible to get wrong agent type based on id? The id is always unique, this would mean one agent type refers to id of a different agent, no?","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"},{"line_number":220,"context_line":"            # also more complex elsewhere."},{"line_number":221,"context_line":"            if type(agent) \u003d\u003d cls:  # pylint: disable\u003dunidiomatic-typecheck"},{"line_number":222,"context_line":"                agents.add(agent)"},{"line_number":223,"context_line":"        return agents"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_b67194e1","line":221,"in_reply_to":"1f621f24_2dbb77c4","updated":"2020-11-03 15:26:51.000000000","message":"We are iterating through all of the types: ControllerAgent, ControllerGatewayAgent, and MetadataAgent. id_from_chassis_private() will return the agent id of each *possible* agent on the chassis, which will be the same for ControllerAgent and ControllerGatewayAgent (it\u0027s just the chassis name). Since we can only have a ControllerAgent or a ControllerGatewayAgent, we have to skip the one not matching the type.\n\nThis is, admittedly, really ugly. I don\u0027t like it. Having just a ControllerAgent where the agent_type property changes based on the chassis external_id values would make this part of the code much simpler. I started to do that and ran into it making things more complex elsewhere...but it seems like I should just be able to undo this patch https://review.opendev.org/#/c/747794/5/neutron/plugins/ml2/drivers/ovn/agent/neutron_agent.py to get it working.","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c6367967dd53046e2c1512ce025da42706033a07","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"},{"line_number":220,"context_line":"            # also more complex elsewhere."},{"line_number":221,"context_line":"            if type(agent) \u003d\u003d cls:  # pylint: disable\u003dunidiomatic-typecheck"},{"line_number":222,"context_line":"                agents.add(agent)"},{"line_number":223,"context_line":"        return agents"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_3c63a31c","line":221,"in_reply_to":"1f621f24_b67194e1","updated":"2020-11-03 16:17:03.000000000","message":"Ah, you\u0027re right! As we discussed over video, the fact that we are using a set() means that it\u0027s ok if we try to add the Agent we actually look up twice even if in the loop it is looked up for the ControllerAgent when it is really a ControllerGatewayAgent or vice versa.","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"04d0ba519d753ddaf5583b8f3451d82d4f8f2892","unresolved":true,"context_lines":[{"line_number":182,"context_line":"        # AgentCache() with no arguments, despite init only being called the"},{"line_number":183,"context_line":"        # first time--and we do really want a driver passed in."},{"line_number":184,"context_line":"        if driver is None:"},{"line_number":185,"context_line":"            raise ValueError(_(\"driver cannot be None\"))"},{"line_number":186,"context_line":"        self.agents \u003d {}"},{"line_number":187,"context_line":"        self.driver \u003d driver"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"e9c931d3_bb86cdc4","line":185,"range":{"start_line":185,"start_character":29,"end_line":185,"end_character":31},"updated":"2020-11-23 10:49:56.000000000","message":"this isn\u0027t user visible message, but it\u0027s only visible in logs, right? If yes, I think we shouldn\u0027t translate it.","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6b1d2dfe7736e8997608abd1951c48b3169dd47d","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        # AgentCache() with no arguments, despite init only being called the"},{"line_number":183,"context_line":"        # first time--and we do really want a driver passed in."},{"line_number":184,"context_line":"        if driver is None:"},{"line_number":185,"context_line":"            raise ValueError(_(\"driver cannot be None\"))"},{"line_number":186,"context_line":"        self.agents \u003d {}"},{"line_number":187,"context_line":"        self.driver \u003d driver"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9e22bb3e_61a47ecb","line":185,"range":{"start_line":185,"start_character":29,"end_line":185,"end_character":31},"in_reply_to":"30a2b363_f7b9ad9a","updated":"2020-11-23 15:56:02.000000000","message":"When I run locally: \n\n:581: DeprecationWarning: invalid escape sequence \\u\n./neutron/plugins/ml2/drivers/ovn/agent/neutron_agent.py:184:30: N534: Untranslated exception message.\n            raise ValueError(\"driver cannot be None\")\n\nI\u0027ll go ahead and change it and see if it actually fails in CI as well, but may either have to add the change back in or fix the pep8 test if this isn\u0027t something that should be checked.","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7b0c08168354ee4ada21759a0b63f20282149797","unresolved":true,"context_lines":[{"line_number":182,"context_line":"        # AgentCache() with no arguments, despite init only being called the"},{"line_number":183,"context_line":"        # first time--and we do really want a driver passed in."},{"line_number":184,"context_line":"        if driver is None:"},{"line_number":185,"context_line":"            raise ValueError(_(\"driver cannot be None\"))"},{"line_number":186,"context_line":"        self.agents \u003d {}"},{"line_number":187,"context_line":"        self.driver \u003d driver"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"30a2b363_f7b9ad9a","line":185,"range":{"start_line":185,"start_character":29,"end_line":185,"end_character":31},"in_reply_to":"e9c931d3_bb86cdc4","updated":"2020-11-23 15:28:32.000000000","message":"I think I got a pep8 error for not doing the _(), otherwise I wouldn\u0027t have even thought to add it. I can try removing it again and see if pep8 will let it go.","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"04d0ba519d753ddaf5583b8f3451d82d4f8f2892","unresolved":true,"context_lines":[{"line_number":210,"context_line":"        agents \u003d set()"},{"line_number":211,"context_line":"        for cls in NeutronAgent.types.values():"},{"line_number":212,"context_line":"            id_ \u003d cls.id_from_chassis_private(chassis_private)"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                agent \u003d self.agents[id_]"},{"line_number":215,"context_line":"            except KeyError:"},{"line_number":216,"context_line":"                continue"},{"line_number":217,"context_line":"            # NOTE (twilson) we are distinguishing between subclasses, so"},{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"}],"source_content_type":"text/x-python","patch_set":21,"id":"cd242a0b_5ef0ccb2","line":216,"range":{"start_line":213,"start_character":12,"end_line":216,"end_character":24},"updated":"2020-11-23 10:49:56.000000000","message":"why not simply:\n\n    agent \u003d self.agents.get(id_)\n\n?","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6b1d2dfe7736e8997608abd1951c48b3169dd47d","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        agents \u003d set()"},{"line_number":211,"context_line":"        for cls in NeutronAgent.types.values():"},{"line_number":212,"context_line":"            id_ \u003d cls.id_from_chassis_private(chassis_private)"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                agent \u003d self.agents[id_]"},{"line_number":215,"context_line":"            except KeyError:"},{"line_number":216,"context_line":"                continue"},{"line_number":217,"context_line":"            # NOTE (twilson) we are distinguishing between subclasses, so"},{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"}],"source_content_type":"text/x-python","patch_set":21,"id":"8694857b_c52da0a7","line":216,"range":{"start_line":213,"start_character":12,"end_line":216,"end_character":24},"in_reply_to":"8c0255ae_8f7f1d3e","updated":"2020-11-23 15:56:02.000000000","message":"Yeah, it looks like patchset 20 clobbered changes from 18 and 19 where this code changed. Re-adding code from those changes. Glad you had a question about this code. ;)","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7b0c08168354ee4ada21759a0b63f20282149797","unresolved":true,"context_lines":[{"line_number":210,"context_line":"        agents \u003d set()"},{"line_number":211,"context_line":"        for cls in NeutronAgent.types.values():"},{"line_number":212,"context_line":"            id_ \u003d cls.id_from_chassis_private(chassis_private)"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                agent \u003d self.agents[id_]"},{"line_number":215,"context_line":"            except KeyError:"},{"line_number":216,"context_line":"                continue"},{"line_number":217,"context_line":"            # NOTE (twilson) we are distinguishing between subclasses, so"},{"line_number":218,"context_line":"            # isinstance() will not work. It would be simpler here if we went"},{"line_number":219,"context_line":"            # back to not having ControllerGatewayAgent as separate cls, but"}],"source_content_type":"text/x-python","patch_set":21,"id":"8c0255ae_8f7f1d3e","line":216,"range":{"start_line":213,"start_character":12,"end_line":216,"end_character":24},"in_reply_to":"cd242a0b_5ef0ccb2","updated":"2020-11-23 15:28:32.000000000","message":"Because I need to not execute the rest of the for loop on KeyError. With that said, I could have sworn that I\u0027d removed some of this code after a conversation with jlibosvar. I\u0027ll recheck the history and see.","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"3a2605bf881fe05bead18e64ecd5ac05c5c25b9a","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # AgentCache() with no arguments, despite init only being called the"},{"line_number":182,"context_line":"        # first time--and we do really want a driver passed in."},{"line_number":183,"context_line":"        if driver is None:"},{"line_number":184,"context_line":"            raise ValueError(\"driver cannot be None\")"},{"line_number":185,"context_line":"        self.agents \u003d {}"},{"line_number":186,"context_line":"        self.driver \u003d driver"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"a5100482_1684ca47","line":184,"updated":"2020-11-24 09:34:11.000000000","message":"I have to say it\u0027s strange to have this here and the default value of the driver being None. It may confuse people if they do not pay attention to the decorator.\n\nI think I clearer way of doing this is by having a set_driver() method instead of having it in the constructor.","commit_id":"71280c2c344840481333b44ef0eda9cbd5ed978c"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"04d0ba519d753ddaf5583b8f3451d82d4f8f2892","unresolved":true,"context_lines":[{"line_number":1224,"context_line":"    # NOTE(twilson) According to the API docs, an agent must be disabled"},{"line_number":1225,"context_line":"    # before deletion. Otherwise, behavior seems to be undefined. We could"},{"line_number":1226,"context_line":"    # check that alive\u003dFalse before allowing deletion, but depending on the"},{"line_number":1227,"context_line":"    # agent_down_time setting, that could take quite a while."},{"line_number":1228,"context_line":"    # If ovn-controller is up, the Chassis will be recreated and so the agent"},{"line_number":1229,"context_line":"    # will still show as up. The recreated Chassis will cause all kinds of"},{"line_number":1230,"context_line":"    # events to fire. But again, undefined behavior."}],"source_content_type":"text/x-python","patch_set":21,"id":"0ed46067_67e4248e","line":1227,"updated":"2020-11-23 10:49:56.000000000","message":"I think that this would be an API behaviour change as currently we don\u0027t forbid deletion of the running agents. So IMO better not to do that and keep it like it\u0027s now :)","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7b0c08168354ee4ada21759a0b63f20282149797","unresolved":false,"context_lines":[{"line_number":1224,"context_line":"    # NOTE(twilson) According to the API docs, an agent must be disabled"},{"line_number":1225,"context_line":"    # before deletion. Otherwise, behavior seems to be undefined. We could"},{"line_number":1226,"context_line":"    # check that alive\u003dFalse before allowing deletion, but depending on the"},{"line_number":1227,"context_line":"    # agent_down_time setting, that could take quite a while."},{"line_number":1228,"context_line":"    # If ovn-controller is up, the Chassis will be recreated and so the agent"},{"line_number":1229,"context_line":"    # will still show as up. The recreated Chassis will cause all kinds of"},{"line_number":1230,"context_line":"    # events to fire. But again, undefined behavior."}],"source_content_type":"text/x-python","patch_set":21,"id":"52aa44eb_d628c96d","line":1227,"in_reply_to":"0ed46067_67e4248e","updated":"2020-11-23 15:28:32.000000000","message":"Ack","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dfc3212b82f28b4c944314ab80d9b0db69067f58","unresolved":false,"context_lines":[{"line_number":475,"context_line":"            self.notifications.put((match, event, row, updates))"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def matching_events(self, event, row, updates, global_\u003dFalse):"},{"line_number":478,"context_line":"        with self._lock:"},{"line_number":479,"context_line":"            return tuple(t for t in self._watched_events"},{"line_number":480,"context_line":"                         if getattr(t, \u0027GLOBAL\u0027, False) \u003d\u003d global_ and"},{"line_number":481,"context_line":"                         self.match(t, event, row, updates))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_d314fea1","line":478,"updated":"2020-09-19 14:34:02.000000000","message":"This will fail tests here because I locally changed a __lock to _lock in ovsdbapp. Not sure why I thought ever using __lock was a good idea.","commit_id":"0861caa2cdc37efece87e028ccf262615c4b18a4"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0385e858479b36de344f01ec410997d3b828f92b","unresolved":false,"context_lines":[{"line_number":475,"context_line":"            self.notifications.put((match, event, row, updates))"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def matching_events(self, event, row, updates, global_\u003dFalse):"},{"line_number":478,"context_line":"        with self._lock:"},{"line_number":479,"context_line":"            return tuple(t for t in self._watched_events"},{"line_number":480,"context_line":"                         if getattr(t, \u0027GLOBAL\u0027, False) \u003d\u003d global_ and"},{"line_number":481,"context_line":"                         self.match(t, event, row, updates))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_736a521b","line":478,"in_reply_to":"9f560f44_d314fea1","updated":"2020-09-19 14:43:42.000000000","message":"Also, with this solution you end up iterating over all of the events twice and picking out the global/not global that you want. It would be better to have a separate list of global/not global events...but the number of events being watched is really small so I doubt it will matter.","commit_id":"0861caa2cdc37efece87e028ccf262615c4b18a4"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"class ChassisAgentDeleteEvent(ChassisAgentEvent):"},{"line_number":250,"context_line":"    events \u003d (BaseEvent.ROW_UPDATE,)"},{"line_number":251,"context_line":"    GLOBAL \u003d True"},{"line_number":252,"context_line":"    table \u003d \u0027SB_Global\u0027"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def match_fn(self, event, row, old\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_2d17f7a5","line":251,"updated":"2020-11-03 11:35:58.000000000","message":"Not declaring GLOBAL for this class will refer to L218, no? Do we need it here?","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"class ChassisAgentDeleteEvent(ChassisAgentEvent):"},{"line_number":250,"context_line":"    events \u003d (BaseEvent.ROW_UPDATE,)"},{"line_number":251,"context_line":"    GLOBAL \u003d True"},{"line_number":252,"context_line":"    table \u003d \u0027SB_Global\u0027"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def match_fn(self, event, row, old\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_d60d303f","line":251,"in_reply_to":"1f621f24_2d17f7a5","updated":"2020-11-03 15:26:51.000000000","message":"Yep, good point. :)","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        self._last_touch \u003d None"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    def notify(self, event, row, updates\u003dNone):"},{"line_number":549,"context_line":"        self.notify_handler.notify(event, row, updates, global_\u003dTrue)"},{"line_number":550,"context_line":"        try:"},{"line_number":551,"context_line":"            target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":552,"context_line":"        except exceptions.HashRingIsEmpty as e:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_eddfbfd3","line":549,"updated":"2020-11-03 11:35:58.000000000","message":"This is much much smarter than what I\u0027ve been doing with my \"fanout\" messages :)","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        self._last_touch \u003d None"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    def notify(self, event, row, updates\u003dNone):"},{"line_number":549,"context_line":"        self.notify_handler.notify(event, row, updates, global_\u003dTrue)"},{"line_number":550,"context_line":"        try:"},{"line_number":551,"context_line":"            target_node \u003d self._hash_ring.get_node(str(row.uuid))"},{"line_number":552,"context_line":"        except exceptions.HashRingIsEmpty as e:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_21d54044","line":549,"in_reply_to":"1f621f24_eddfbfd3","updated":"2020-11-03 15:26:51.000000000","message":"This is probably at least the 3rd major iteration of the code I did. Given enough tries, even I can look smart. :D","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"04d0ba519d753ddaf5583b8f3451d82d4f8f2892","unresolved":true,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    # NOTE (twilson) Do not run new transactions out of a GLOBAL Event since"},{"line_number":221,"context_line":"    # it will be running on every single process, and you almost certainly"},{"line_number":222,"context_line":"    # don\u0027t want to insert/update/delete something a bajillion times."},{"line_number":223,"context_line":"    def __init__(self, driver):"},{"line_number":224,"context_line":"        self.driver \u003d driver"},{"line_number":225,"context_line":"        super().__init__()"}],"source_content_type":"text/x-python","patch_set":21,"id":"aa75ba83_a8203cf5","line":222,"range":{"start_line":222,"start_character":53,"end_line":222,"end_character":62},"updated":"2020-11-23 10:49:56.000000000","message":"LOL, I suppose it\u0027s some big number ;)","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7b0c08168354ee4ada21759a0b63f20282149797","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    # NOTE (twilson) Do not run new transactions out of a GLOBAL Event since"},{"line_number":221,"context_line":"    # it will be running on every single process, and you almost certainly"},{"line_number":222,"context_line":"    # don\u0027t want to insert/update/delete something a bajillion times."},{"line_number":223,"context_line":"    def __init__(self, driver):"},{"line_number":224,"context_line":"        self.driver \u003d driver"},{"line_number":225,"context_line":"        super().__init__()"}],"source_content_type":"text/x-python","patch_set":21,"id":"bcd60f86_6d68a923","line":222,"range":{"start_line":222,"start_character":53,"end_line":222,"end_character":62},"in_reply_to":"aa75ba83_a8203cf5","updated":"2020-11-23 15:28:32.000000000","message":"Ack","commit_id":"79d901d6743f2b2ab5b75d4d6c51fc742d2e2c26"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/test_mech_driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        return status[\u0027id\u0027]"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"    def test_agent_show(self):"},{"line_number":775,"context_line":"        for _type, agent_id in self.agent_types.items():"},{"line_number":776,"context_line":"            self.assertTrue(self.plugin.get_agent(self.context, agent_id))"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def test_agent_list(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_6d70cfdd","line":775,"range":{"start_line":775,"start_character":8,"end_line":775,"end_character":55},"updated":"2020-11-03 11:35:58.000000000","message":"nit:\n\n for agent_id in self.agent_types.values()","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e11608dbc1779047ad26383ecaba1523da8fbf21","unresolved":false,"context_lines":[{"line_number":772,"context_line":"        return status[\u0027id\u0027]"},{"line_number":773,"context_line":""},{"line_number":774,"context_line":"    def test_agent_show(self):"},{"line_number":775,"context_line":"        for _type, agent_id in self.agent_types.items():"},{"line_number":776,"context_line":"            self.assertTrue(self.plugin.get_agent(self.context, agent_id))"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def test_agent_list(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_c14a8c25","line":775,"range":{"start_line":775,"start_character":8,"end_line":775,"end_character":55},"in_reply_to":"1f621f24_6d70cfdd","updated":"2020-11-03 15:26:51.000000000","message":"Oh, look at that I didn\u0027t end up needing the key! Thanks!","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d36c936fa64e5d1a17c71eddc6de45f493d168dd","unresolved":false,"context_lines":[{"line_number":781,"context_line":"        self.assertCountEqual(self.agent_types.values(), agent_ids)"},{"line_number":782,"context_line":""},{"line_number":783,"context_line":"    def test_agent_delete(self):"},{"line_number":784,"context_line":"        for _type, agent_id in self.agent_types.items():"},{"line_number":785,"context_line":"            self.plugin.delete_agent(self.context, agent_id)"},{"line_number":786,"context_line":"            self.assertRaises(agent_exc.AgentNotFound, self.plugin.get_agent,"},{"line_number":787,"context_line":"                              self.context, agent_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1f621f24_ad5ae74c","line":784,"range":{"start_line":784,"start_character":8,"end_line":784,"end_character":55},"updated":"2020-11-03 11:35:58.000000000","message":"ditto L775","commit_id":"fea2c1762f4a376b8ceb938bd9c039b037650441"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"085c49ec8823a669015c9433a6587447fd99da02","unresolved":true,"context_lines":[{"line_number":814,"context_line":"    def test_agent_list(self):"},{"line_number":815,"context_line":"        agent_ids \u003d [a[\u0027id\u0027] for a in self.plugin.get_agents("},{"line_number":816,"context_line":"            self.context, filters\u003d{\u0027host\u0027: self.host})]"},{"line_number":817,"context_line":"        self.assertCountEqual(self.agent_types.values(), agent_ids)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def test_agent_delete(self):"},{"line_number":820,"context_line":"        for agent_id in self.agent_types.values():"}],"source_content_type":"text/x-python","patch_set":23,"id":"e33d3d88_d70e4dc3","line":817,"range":{"start_line":817,"start_character":30,"end_line":817,"end_character":55},"updated":"2020-11-24 17:26:42.000000000","message":"\"agent_ids\" only contains agent_type[\u0027test\u0027], not \"OVN controller\" nor \"OVN metadata\"","commit_id":"eeb0f4321223ca1bef104870f4c792987a3efc12"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4277f23e7166bdea92537f27bf3fd1f191cb2b6e","unresolved":false,"context_lines":[{"line_number":814,"context_line":"    def test_agent_list(self):"},{"line_number":815,"context_line":"        agent_ids \u003d [a[\u0027id\u0027] for a in self.plugin.get_agents("},{"line_number":816,"context_line":"            self.context, filters\u003d{\u0027host\u0027: self.host})]"},{"line_number":817,"context_line":"        self.assertCountEqual(self.agent_types.values(), agent_ids)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def test_agent_delete(self):"},{"line_number":820,"context_line":"        for agent_id in self.agent_types.values():"}],"source_content_type":"text/x-python","patch_set":23,"id":"36b572ac_082a3862","line":817,"range":{"start_line":817,"start_character":30,"end_line":817,"end_character":55},"in_reply_to":"e33d3d88_d70e4dc3","updated":"2020-11-24 18:50:28.000000000","message":"This was because of the extra add_fake_chassis call that happened and overwrote the original self.chassis. Good catch!","commit_id":"eeb0f4321223ca1bef104870f4c792987a3efc12"}],"releasenotes/notes/support-deleting-ovn-agents-0a5635d9078498ba.yaml":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2784ff9f97d95af7ae5dce3ce6174cc4c95e8a6a","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for deleting ML2/OVN agents. Previously, deleting an agent"},{"line_number":5,"context_line":"    would return a Bad Request error. In addition to deleting the agent,"},{"line_number":6,"context_line":"    this change also drastically improves the scalability of the ML2/OVN"},{"line_number":7,"context_line":"    agent handling code."}],"source_content_type":"text/x-yaml","patch_set":29,"id":"28c19aab_a6e0c486","line":6,"range":{"start_line":6,"start_character":21,"end_line":6,"end_character":41},"updated":"2021-01-13 14:16:18.000000000","message":"I like that 😊","commit_id":"da3ce7319866e8dc874d405e91f9af160e2c3d31"}]}
