)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3c34889e58a83cf1a8dbf122214d9ef417e7877e","unresolved":true,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"76b03453_5c38061e","line":21,"range":{"start_line":21,"start_character":10,"end_line":21,"end_character":26},"updated":"2023-09-22 15:01:42.000000000","message":"s/Invalid argument (at least that\u0027s the string in errno.h)","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ad28606d_6164d36f","line":21,"range":{"start_line":21,"start_character":10,"end_line":21,"end_character":26},"in_reply_to":"0600489f_22b586ea","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"42e5704dfade0274addf3be61a70ef20ad4d33ea","unresolved":true,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"0600489f_22b586ea","line":21,"range":{"start_line":21,"start_character":10,"end_line":21,"end_character":26},"in_reply_to":"76b03453_5c38061e","updated":"2023-09-25 09:15:34.000000000","message":"sorry, fixed","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0fbddc764f35e800705af3b9fc7ab878f1db2b90","unresolved":true,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"},{"line_number":25,"context_line":"Change-Id: I7c43812fed5903f98a2e491076c24a8d926a59b4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f7f0b494_949144d6","line":22,"range":{"start_line":21,"start_character":37,"end_line":22,"end_character":42},"updated":"2023-09-22 14:42:34.000000000","message":"When is this happening? Is there a github issue open?","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"},{"line_number":25,"context_line":"Change-Id: I7c43812fed5903f98a2e491076c24a8d926a59b4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d203d1d2_7503f836","line":22,"range":{"start_line":21,"start_character":37,"end_line":22,"end_character":42},"in_reply_to":"04903388_d93ea82d","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c5f1770e04562ed78699db57941d10d0aab5ee24","unresolved":true,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"},{"line_number":25,"context_line":"Change-Id: I7c43812fed5903f98a2e491076c24a8d926a59b4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"efa9da0b_677100f7","line":22,"range":{"start_line":21,"start_character":37,"end_line":22,"end_character":42},"in_reply_to":"f7f0b494_949144d6","updated":"2023-09-22 14:56:05.000000000","message":"^^ this question here?","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"e2f462c7ad119358334fbc3c90e05a93bd112d8d","unresolved":true,"context_lines":[{"line_number":18,"context_line":"around."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"To fix this we treat network namespaces where we get an `OSError` with"},{"line_number":21,"context_line":"errno 22 (Illegal Argument) as empty. The calls to pyroute2 to delete"},{"line_number":22,"context_line":"the namespace will then clean up the file."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Closes-Bug: #2037102"},{"line_number":25,"context_line":"Change-Id: I7c43812fed5903f98a2e491076c24a8d926a59b4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"04903388_d93ea82d","line":22,"range":{"start_line":21,"start_character":37,"end_line":22,"end_character":42},"in_reply_to":"f7f0b494_949144d6","updated":"2023-09-22 14:57:20.000000000","message":"the removal of the namespace is here https://github.com/svinota/pyroute2/blob/master/pyroute2/netns/__init__.py#L308-L315\n\nIt seems that `umount2` with `MNT_DETACH` will not fail if the target is not a mountpoint and will just do nothing. Therefor we afterwards call `os.unlink` to get the file gone","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5e786a6d137642f0424d75bf3a438f80ea668ae9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dae9167f_7a159d59","updated":"2023-12-08 09:58:50.000000000","message":"-1 just to get answer to my questions. I can change it to +2 if I will have answers 😊\nwhat about https://github.com/openstack/neutron/blob/c0e0a841fa3bc9544c3715a3e60740105a907f60/neutron/cmd/netns_cleanup.py#L116 ? Shouldn\u0027t this place be also changed?","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0b6b68829e592f50f8fc56ea38f616531adc2f07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"06fbc186_2770de4b","updated":"2023-10-09 07:32:13.000000000","message":"recheck\nhttps://review.opendev.org/c/openstack/neutron/+/897332 fixed recent n-t-p failures","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"b2d689c09c28da5b8af186d030ae00bc2d2c3bbf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"93f09ca2_3f8be54f","updated":"2023-10-02 13:03:00.000000000","message":"recheck (maybe it helps with https://bugs.launchpad.net/neutron/+bug/2037239)","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c1b856bc_e36e7a6e","in_reply_to":"1229c86c_15bc20ba","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"aa3ff63624116dc8b499eddb978e3ed25050604b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1229c86c_15bc20ba","in_reply_to":"dae9167f_7a159d59","updated":"2023-12-08 12:24:25.000000000","message":"sounds good. i combined it with your other suggestion and just reused namespace_is_empty","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"196f2853942e595675be96387cca58f02b1d0965","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b7a9633c_2857ca56","updated":"2023-12-12 18:32:10.000000000","message":"Felix - I think this looks fine, can you just verify all the comments have been resolved and mark them Done if so? I just didn\u0027t want to miss one. Thanks","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"71a6c27e5d65a127ed5dc3200b3f29fd95fd16da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"89aee9d0_8c17d503","updated":"2024-01-02 18:13:28.000000000","message":"Thanks for the patch! some nits/ideas, otherwise looks good to me","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":1004,"name":"Mohammed Naser","email":"mnaser@vexxhost.com","username":"mnaser"},"change_message_id":"a6dbeda7060ecbc82d6b782d1f3786b2a2c57099","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cfa5fd77_29d63f1d","updated":"2023-12-08 16:26:43.000000000","message":"recheck\n\nSegmentation fault in the booted vm, unrelated","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"ac7b1f9e61c047067feee802390a81c4375c6db1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"699f7db0_11243733","updated":"2023-12-11 07:36:47.000000000","message":"recheck some download error of ubuntu images","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"08be27f5_ae892659","in_reply_to":"b7a9633c_2857ca56","updated":"2023-12-13 06:51:32.000000000","message":"thanks i did that","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"91a8f61836c3a2448bfa7739b4e814a6e7cd17d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"162db9c4_d86daf5f","updated":"2024-01-03 08:25:59.000000000","message":"Thx for the patch 😊","commit_id":"8b2508400d5a2615ac92a3525e141ca731edc73a"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b4b30cab5cecd939305e36108e885e6b0a97f0b9","unresolved":true,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d086d473_fcf718ea","line":278,"range":{"start_line":278,"start_character":12,"end_line":278,"end_character":28},"updated":"2023-09-22 14:41:56.000000000","message":"Please use errno codes:\n```\nimport errno\nerrno.EINVAL\n```","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3c34889e58a83cf1a8dbf122214d9ef417e7877e","unresolved":true,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"96b002e3_9dd003bd","line":278,"range":{"start_line":278,"start_character":26,"end_line":278,"end_character":28},"updated":"2023-09-22 15:01:42.000000000","message":"s/errno.EINVAL","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dff7c1e6_ceb4cd91","line":278,"range":{"start_line":278,"start_character":12,"end_line":278,"end_character":28},"in_reply_to":"8aa9b176_12e85266","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"42e5704dfade0274addf3be61a70ef20ad4d33ea","unresolved":true,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bee5db99_d680b376","line":278,"range":{"start_line":278,"start_character":26,"end_line":278,"end_character":28},"in_reply_to":"96b002e3_9dd003bd","updated":"2023-09-25 09:15:34.000000000","message":"fixed in patchset 2","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"443ec5fd_ae40dbb6","line":278,"range":{"start_line":278,"start_character":26,"end_line":278,"end_character":28},"in_reply_to":"bee5db99_d680b376","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"e2f462c7ad119358334fbc3c90e05a93bd112d8d","unresolved":true,"context_lines":[{"line_number":275,"context_line":"            # can not have changed."},{"line_number":276,"context_line":"            # Future calls to pyroute2 to remove that namespace will clean up"},{"line_number":277,"context_line":"            # the leftover file."},{"line_number":278,"context_line":"            if e.errno \u003d\u003d 22:"},{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8aa9b176_12e85266","line":278,"range":{"start_line":278,"start_character":12,"end_line":278,"end_character":28},"in_reply_to":"d086d473_fcf718ea","updated":"2023-09-22 14:57:20.000000000","message":"thanks. fixed","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3c34889e58a83cf1a8dbf122214d9ef417e7877e","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def garbage_collect_namespace(self):"},{"line_number":283,"context_line":"        \"\"\"Conditionally destroy the namespace if it is empty.\"\"\""},{"line_number":284,"context_line":"        if self.namespace and self.netns.exists(self.namespace):"},{"line_number":285,"context_line":"            if self.namespace_is_empty_or_dead():"}],"source_content_type":"text/x-python","patch_set":1,"id":"84b88b6d_5de62f0f","line":282,"updated":"2023-09-22 15:01:42.000000000","message":"One nit I have is that there are only two callers of this method. The one in the netns_cleanup code has it in a try/except:\n\n    try:\n        ...\n        ip.garbage_collect_namespace()\n    except Exception:\n        LOG.exception(\u0027Error unable to destroy namespace: %s\u0027, namespace)\n\nThe one in the OVN metadata agent should do something similar so a single failure doesn\u0027t stop other namespaces from being removed.","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def garbage_collect_namespace(self):"},{"line_number":283,"context_line":"        \"\"\"Conditionally destroy the namespace if it is empty.\"\"\""},{"line_number":284,"context_line":"        if self.namespace and self.netns.exists(self.namespace):"},{"line_number":285,"context_line":"            if self.namespace_is_empty_or_dead():"}],"source_content_type":"text/x-python","patch_set":1,"id":"6419ff17_dde2e519","line":282,"in_reply_to":"54b1cea5_9ea1bfc9","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"42e5704dfade0274addf3be61a70ef20ad4d33ea","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def garbage_collect_namespace(self):"},{"line_number":283,"context_line":"        \"\"\"Conditionally destroy the namespace if it is empty.\"\"\""},{"line_number":284,"context_line":"        if self.namespace and self.netns.exists(self.namespace):"},{"line_number":285,"context_line":"            if self.namespace_is_empty_or_dead():"}],"source_content_type":"text/x-python","patch_set":1,"id":"c74c8c99_38e8df1e","line":282,"in_reply_to":"84b88b6d_5de62f0f","updated":"2023-09-25 09:15:34.000000000","message":"I disagree with that. If deleting a namespace fails i need to assume that any other kind of usage of that namespace will also fail. This means if the namespace would ever need to be reused (e.g. since a VM is spawned there using that network), then the agent would crash then. This would mask the issue until then and would make troubleshooting significantly harder.\nSo i would only see that as useful if such individual namespace errors are also handled during provisioning on the datapath. However we then also need a way for the user to find out, if this provisioning has actually worked as intended.","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b51e2bff5ab3d127d95335eea627ec4d189bf500","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def garbage_collect_namespace(self):"},{"line_number":283,"context_line":"        \"\"\"Conditionally destroy the namespace if it is empty.\"\"\""},{"line_number":284,"context_line":"        if self.namespace and self.netns.exists(self.namespace):"},{"line_number":285,"context_line":"            if self.namespace_is_empty_or_dead():"}],"source_content_type":"text/x-python","patch_set":1,"id":"d41c1f06_3f7b8a88","line":282,"in_reply_to":"c74c8c99_38e8df1e","updated":"2023-09-25 14:50:33.000000000","message":"I guess I see this from another perspective. In the sync() code in the OVN metadata agent it does this:\n\n        for ns in unused_namespaces:\n            self.teardown_datapath(self._get_datapath_name(ns))\n\n        # resync all network namespaces based on the associated datapaths,\n        # even those that are already running. This is to make sure\n        # everything within each namespace is up to date.\n        for datapath in net_datapaths:\n            self.provision_datapath(datapath)\n\nteardown_datapath() calls ip.garbage_collect_namespace()\n\nIf there is one failure there, it impacts provisioning for all the datapaths. I would rather it not affect everyone at the expense of one tenant.\n\nThis patch should help solve the issue you mentioned as it will call delete the next time we garbage collect right?","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"d25010e4a36d4fc1e44a104fe62470449ab1be77","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                return True"},{"line_number":280,"context_line":"            raise e"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def garbage_collect_namespace(self):"},{"line_number":283,"context_line":"        \"\"\"Conditionally destroy the namespace if it is empty.\"\"\""},{"line_number":284,"context_line":"        if self.namespace and self.netns.exists(self.namespace):"},{"line_number":285,"context_line":"            if self.namespace_is_empty_or_dead():"}],"source_content_type":"text/x-python","patch_set":1,"id":"54b1cea5_9ea1bfc9","line":282,"in_reply_to":"d41c1f06_3f7b8a88","updated":"2023-10-02 09:41:25.000000000","message":"now i got it.\n\nI have added the guard you mentioned above to agent.py as well, so that in the future it does not kill the whole agent","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5e786a6d137642f0424d75bf3a438f80ea668ae9","unresolved":true,"context_lines":[{"line_number":258,"context_line":"            ip \u003d IPWrapper(namespace\u003dname)"},{"line_number":259,"context_line":"        return ip"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def namespace_is_empty(self):"},{"line_number":262,"context_line":"        return not self.get_devices()"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def namespace_is_empty_or_dead(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ae9510f_f9a59fb2","line":261,"updated":"2023-12-08 09:58:50.000000000","message":"do we really need this method still? Can\u0027t we merge this new one and that one and have only one method?","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            ip \u003d IPWrapper(namespace\u003dname)"},{"line_number":259,"context_line":"        return ip"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def namespace_is_empty(self):"},{"line_number":262,"context_line":"        return not self.get_devices()"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def namespace_is_empty_or_dead(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"b9f228dd_bf08796e","line":261,"in_reply_to":"26eacf97_ec280120","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"aa3ff63624116dc8b499eddb978e3ed25050604b","unresolved":true,"context_lines":[{"line_number":258,"context_line":"            ip \u003d IPWrapper(namespace\u003dname)"},{"line_number":259,"context_line":"        return ip"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def namespace_is_empty(self):"},{"line_number":262,"context_line":"        return not self.get_devices()"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    def namespace_is_empty_or_dead(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"26eacf97_ec280120","line":261,"in_reply_to":"9ae9510f_f9a59fb2","updated":"2023-12-08 12:24:25.000000000","message":"done","commit_id":"afc81829a30c3f9c78a31f3f595e7e698e0d9b06"}],"neutron/tests/unit/agent/linux/test_ip_lib.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3c34889e58a83cf1a8dbf122214d9ef417e7877e","unresolved":true,"context_lines":[{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027namespace_is_empty\u0027) as mock_is_empty:"},{"line_number":367,"context_line":"                oserr \u003d OSError()"},{"line_number":368,"context_line":"                oserr.errno \u003d 22"},{"line_number":369,"context_line":"                mock_is_empty.side_effect \u003d oserr"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"506548b0_7d6d1105","line":369,"updated":"2023-09-22 15:01:42.000000000","message":"You can do this all on one line like is done below in other tests:\n\nmock_is_empty.side_effect \u003d OSError(errno.EINVAL)","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"42e5704dfade0274addf3be61a70ef20ad4d33ea","unresolved":true,"context_lines":[{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027namespace_is_empty\u0027) as mock_is_empty:"},{"line_number":367,"context_line":"                oserr \u003d OSError()"},{"line_number":368,"context_line":"                oserr.errno \u003d 22"},{"line_number":369,"context_line":"                mock_is_empty.side_effect \u003d oserr"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"79cfa483_89f40e87","line":369,"in_reply_to":"506548b0_7d6d1105","updated":"2023-09-25 09:15:34.000000000","message":"thanks fixed","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"df88776bd7b8efe4ac0fb5323bfb6e0dfabf8b68","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027namespace_is_empty\u0027) as mock_is_empty:"},{"line_number":367,"context_line":"                oserr \u003d OSError()"},{"line_number":368,"context_line":"                oserr.errno \u003d 22"},{"line_number":369,"context_line":"                mock_is_empty.side_effect \u003d oserr"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"cb468dc9_fce62752","line":369,"in_reply_to":"79cfa483_89f40e87","updated":"2023-12-13 06:51:32.000000000","message":"Done","commit_id":"300c86a96e6432e8101f6a194efa28a0ad3a3fa4"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"71a6c27e5d65a127ed5dc3200b3f29fd95fd16da","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            ip \u003d ip_lib.IPWrapper(namespace\u003d\u0027ns\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027get_devices\u0027) as mock_get_devices:"},{"line_number":367,"context_line":"                mock_get_devices.side_effect \u003d OSError(errno.EINVAL, None)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"0c70f1cc_34af1e0d","line":367,"updated":"2024-01-02 18:13:28.000000000","message":"nit: Since the OSError instance isn\u0027t referenced anywhere, it can be initialized when the mock object was created, like:\n```\nwith mock.patch.object(ip, \u0027get_devices\u0027, side_effect\u003dOSError(...)) as mock_get_devices:\n```","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"22814365146b05fd4da5d2b21cd98aca1f129ced","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            ip \u003d ip_lib.IPWrapper(namespace\u003d\u0027ns\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027get_devices\u0027) as mock_get_devices:"},{"line_number":367,"context_line":"                mock_get_devices.side_effect \u003d OSError(errno.EINVAL, None)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"64f256f8_5b1d1873","line":367,"in_reply_to":"0c70f1cc_34af1e0d","updated":"2024-01-03 07:11:34.000000000","message":"thanks, done","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"b5236612b5e0a460482fdb4decfb03c38a51dbf1","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            ip \u003d ip_lib.IPWrapper(namespace\u003d\u0027ns\u0027)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"            with mock.patch.object(ip, \u0027get_devices\u0027) as mock_get_devices:"},{"line_number":367,"context_line":"                mock_get_devices.side_effect \u003d OSError(errno.EINVAL, None)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"                self.assertTrue(ip.garbage_collect_namespace())"},{"line_number":370,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"98bdaf22_c23c4601","line":367,"in_reply_to":"64f256f8_5b1d1873","updated":"2024-01-03 07:14:46.000000000","message":"Done","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"71a6c27e5d65a127ed5dc3200b3f29fd95fd16da","unresolved":true,"context_lines":[{"line_number":371,"context_line":"                mock_get_devices.assert_called_once_with()"},{"line_number":372,"context_line":"                expected \u003d [mock.call(ip),"},{"line_number":373,"context_line":"                            mock.call().exists(\u0027ns\u0027),"},{"line_number":374,"context_line":"                            mock.call().delete(\u0027ns\u0027)]"},{"line_number":375,"context_line":"                self.assertEqual(ip_ns_cmd_cls.mock_calls, expected)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    @mock.patch.object(priv_lib, \u0027create_interface\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"951934c3_51fb110b","line":374,"range":{"start_line":374,"start_character":28,"end_line":374,"end_character":52},"updated":"2024-01-02 18:13:28.000000000","message":"I would recommend to not match on exact calls that were made to the ip wrapper object but only check the `delete()` was called as that\u0027s what matters. Otherwise, if we add new code calling to the ip wrapper object we would need to update this test, which may be irrelevant to the change.","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"25bed7f536292da6220aa9863f804ef361886545","unresolved":true,"context_lines":[{"line_number":371,"context_line":"                mock_get_devices.assert_called_once_with()"},{"line_number":372,"context_line":"                expected \u003d [mock.call(ip),"},{"line_number":373,"context_line":"                            mock.call().exists(\u0027ns\u0027),"},{"line_number":374,"context_line":"                            mock.call().delete(\u0027ns\u0027)]"},{"line_number":375,"context_line":"                self.assertEqual(ip_ns_cmd_cls.mock_calls, expected)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    @mock.patch.object(priv_lib, \u0027create_interface\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"08753ed8_0b7ca50b","line":374,"range":{"start_line":374,"start_character":28,"end_line":374,"end_character":52},"in_reply_to":"22c6b64f_378f45c0","updated":"2024-01-08 06:51:46.000000000","message":"thank you for that clarification. Thats adapted now.","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"22814365146b05fd4da5d2b21cd98aca1f129ced","unresolved":true,"context_lines":[{"line_number":371,"context_line":"                mock_get_devices.assert_called_once_with()"},{"line_number":372,"context_line":"                expected \u003d [mock.call(ip),"},{"line_number":373,"context_line":"                            mock.call().exists(\u0027ns\u0027),"},{"line_number":374,"context_line":"                            mock.call().delete(\u0027ns\u0027)]"},{"line_number":375,"context_line":"                self.assertEqual(ip_ns_cmd_cls.mock_calls, expected)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    @mock.patch.object(priv_lib, \u0027create_interface\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"de7c9602_d1fb0b5a","line":374,"range":{"start_line":374,"start_character":28,"end_line":374,"end_character":52},"in_reply_to":"951934c3_51fb110b","updated":"2024-01-03 07:11:34.000000000","message":"i took the current approach from the tests above. They all use the same logic for the expected calls. Additionally the parameter \"ns\" here refers to my knowledge to the name of the namespace we want deleted, which should always be \"ns\".","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"f71a66edb24a3004229286c906bb4f0b0f9b6efb","unresolved":true,"context_lines":[{"line_number":371,"context_line":"                mock_get_devices.assert_called_once_with()"},{"line_number":372,"context_line":"                expected \u003d [mock.call(ip),"},{"line_number":373,"context_line":"                            mock.call().exists(\u0027ns\u0027),"},{"line_number":374,"context_line":"                            mock.call().delete(\u0027ns\u0027)]"},{"line_number":375,"context_line":"                self.assertEqual(ip_ns_cmd_cls.mock_calls, expected)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    @mock.patch.object(priv_lib, \u0027create_interface\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"22c6b64f_378f45c0","line":374,"range":{"start_line":374,"start_character":28,"end_line":374,"end_character":52},"in_reply_to":"de7c9602_d1fb0b5a","updated":"2024-01-08 05:44:35.000000000","message":"IIUC Jakub suggested to do below, usage of \"ns\" for namespace name should be fine here.\n\nexpected \u003d [mock.call().delete(\u0027ns\u0027)]\nip_ns_cmd_cls.assert_has_calls(expected)","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"}],"neutron/tests/unit/agent/ovn/metadata/test_agent.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"71a6c27e5d65a127ed5dc3200b3f29fd95fd16da","unresolved":true,"context_lines":[{"line_number":148,"context_line":"                    ip_lib, \u0027list_network_namespaces\u0027) as lnn,\\"},{"line_number":149,"context_line":"                mock.patch.object("},{"line_number":150,"context_line":"                    self.agent, \u0027teardown_datapath\u0027) as tdp:"},{"line_number":151,"context_line":"            lnn.return_value \u003d [\u0027ovnmeta-1\u0027, \u0027ovnmeta-2\u0027, \u0027ovnmeta-3\u0027,"},{"line_number":152,"context_line":"                                \u0027ns1\u0027, \u0027ns2\u0027]"},{"line_number":153,"context_line":"            tdp.side_effect \u003d Exception()"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            self.agent.sync()"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ca5ee01e_c5d32b76","line":153,"range":{"start_line":151,"start_character":0,"end_line":153,"end_character":41},"updated":"2024-01-02 18:13:28.000000000","message":"ditto: both can be set during initialization","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"b5236612b5e0a460482fdb4decfb03c38a51dbf1","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ip_lib, \u0027list_network_namespaces\u0027) as lnn,\\"},{"line_number":149,"context_line":"                mock.patch.object("},{"line_number":150,"context_line":"                    self.agent, \u0027teardown_datapath\u0027) as tdp:"},{"line_number":151,"context_line":"            lnn.return_value \u003d [\u0027ovnmeta-1\u0027, \u0027ovnmeta-2\u0027, \u0027ovnmeta-3\u0027,"},{"line_number":152,"context_line":"                                \u0027ns1\u0027, \u0027ns2\u0027]"},{"line_number":153,"context_line":"            tdp.side_effect \u003d Exception()"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            self.agent.sync()"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"afc61e18_9998aa37","line":153,"range":{"start_line":151,"start_character":0,"end_line":153,"end_character":41},"in_reply_to":"85703658_1b5f7eb0","updated":"2024-01-03 07:14:46.000000000","message":"Done","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"22814365146b05fd4da5d2b21cd98aca1f129ced","unresolved":true,"context_lines":[{"line_number":148,"context_line":"                    ip_lib, \u0027list_network_namespaces\u0027) as lnn,\\"},{"line_number":149,"context_line":"                mock.patch.object("},{"line_number":150,"context_line":"                    self.agent, \u0027teardown_datapath\u0027) as tdp:"},{"line_number":151,"context_line":"            lnn.return_value \u003d [\u0027ovnmeta-1\u0027, \u0027ovnmeta-2\u0027, \u0027ovnmeta-3\u0027,"},{"line_number":152,"context_line":"                                \u0027ns1\u0027, \u0027ns2\u0027]"},{"line_number":153,"context_line":"            tdp.side_effect \u003d Exception()"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"            self.agent.sync()"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"85703658_1b5f7eb0","line":153,"range":{"start_line":151,"start_character":0,"end_line":153,"end_character":41},"in_reply_to":"ca5ee01e_c5d32b76","updated":"2024-01-03 07:11:34.000000000","message":"done","commit_id":"f2052b30532c94b27847048df33282d4e2a99c32"}]}
