)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"33fbacb222f2686cffba8d4b375a5738bce3a091","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"61b9c80a_c13daf8d","updated":"2023-06-12 18:51:38.000000000","message":"This patch should include FTs.","commit_id":"7b555169db1a8d4b60e61c49b9166d913dcbaa8d"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"f414fc2ed9c814dd8c47588f4b324ef610f84db6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d0b867f2_0f1376a5","updated":"2023-06-12 14:13:05.000000000","message":"recheck functional unrelated","commit_id":"7b555169db1a8d4b60e61c49b9166d913dcbaa8d"}],"ovn_bgp_agent/privileged/linux_net.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9343c51a49697de2a9160eaf30d609a3cba62e8c","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":163,"context_line":"def route_create(route):"},{"line_number":164,"context_line":"    _run_iproute_route(\u0027add\u0027, **route)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":3,"id":"acfa37d5_b75ac125","line":164,"range":{"start_line":164,"start_character":4,"end_line":164,"end_character":22},"updated":"2023-06-12 19:14:44.000000000","message":"These methods should expose the valid input parameters: table, scope, etc\n\n\"oif\" should not be an input parameter but the device name. We should calculate it inside this method.","commit_id":"7b555169db1a8d4b60e61c49b9166d913dcbaa8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"33fbacb222f2686cffba8d4b375a5738bce3a091","unresolved":false,"context_lines":[{"line_number":385,"context_line":"    elif e.code \u003d\u003d errno.ENOENT:  # Not found"},{"line_number":386,"context_line":"        LOG.debug(\"Route already deleted: %s\", kwargs)"},{"line_number":387,"context_line":"    else:"},{"line_number":388,"context_line":"        raise"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"def get_attr(pyroute2_obj, attr_name):"}],"source_content_type":"text/x-python","patch_set":3,"id":"4ed3e606_0f697a43","line":388,"range":{"start_line":388,"start_character":8,"end_line":388,"end_character":13},"updated":"2023-06-12 18:51:38.000000000","message":"raise e","commit_id":"7b555169db1a8d4b60e61c49b9166d913dcbaa8d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6ae10cfcc6f54e49e3893d9a90668f40363f0c0f","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    route[\u0027scope\u0027] \u003d get_scope_name(scope)"},{"line_number":175,"context_line":"    if \u0027family\u0027 not in route:"},{"line_number":176,"context_line":"        route[\u0027family\u0027] \u003d socket.AF_INET"},{"line_number":177,"context_line":"    _run_iproute_route(\u0027add\u0027, **route)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":4,"id":"316b3c0e_694d939d","line":177,"range":{"start_line":177,"start_character":24,"end_line":177,"end_character":27},"updated":"2023-06-13 00:05:25.000000000","message":"\"replace\" will work better, if the route exists, it won\u0027t fail (same as in Neutron)","commit_id":"f266d95f46081bef99abe1c9a74d9a88b721a9a8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6ae10cfcc6f54e49e3893d9a90668f40363f0c0f","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":374,"context_line":"def add_unreachable_route(vrf_name):"},{"line_number":375,"context_line":"    for ip_version in [4, 6]:"},{"line_number":376,"context_line":"        kwargs \u003d {\u0027dst\u0027: \"default\","},{"line_number":377,"context_line":"                  \u0027family\u0027: ip_version,"},{"line_number":378,"context_line":"                  \u0027vrf\u0027: vrf_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"e964a4db_c1f08e88","line":375,"range":{"start_line":375,"start_character":22,"end_line":375,"end_character":29},"updated":"2023-06-13 00:05:25.000000000","message":"If we are passing this value to pyroute directly, we should use socket.AF_INET and AF_INET6.","commit_id":"f266d95f46081bef99abe1c9a74d9a88b721a9a8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6ae10cfcc6f54e49e3893d9a90668f40363f0c0f","unresolved":false,"context_lines":[{"line_number":375,"context_line":"    for ip_version in [4, 6]:"},{"line_number":376,"context_line":"        kwargs \u003d {\u0027dst\u0027: \"default\","},{"line_number":377,"context_line":"                  \u0027family\u0027: ip_version,"},{"line_number":378,"context_line":"                  \u0027vrf\u0027: vrf_name,"},{"line_number":379,"context_line":"                  \u0027type\u0027: RTN_UNREACHABLE,"},{"line_number":380,"context_line":"                  \u0027metrics\u0027: {\"mtu\": 4278198272}}"},{"line_number":381,"context_line":"        _run_iproute_route(\u0027add\u0027, **kwargs)"}],"source_content_type":"text/x-python","patch_set":4,"id":"460aa87f_8e8425dc","line":378,"range":{"start_line":378,"start_character":0,"end_line":378,"end_character":2},"updated":"2023-06-13 00:05:25.000000000","message":"We should find the vfr device table","commit_id":"f266d95f46081bef99abe1c9a74d9a88b721a9a8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6ae10cfcc6f54e49e3893d9a90668f40363f0c0f","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                  \u0027family\u0027: ip_version,"},{"line_number":378,"context_line":"                  \u0027vrf\u0027: vrf_name,"},{"line_number":379,"context_line":"                  \u0027type\u0027: RTN_UNREACHABLE,"},{"line_number":380,"context_line":"                  \u0027metrics\u0027: {\"mtu\": 4278198272}}"},{"line_number":381,"context_line":"        _run_iproute_route(\u0027add\u0027, **kwargs)"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"262c9b74_e3beaa2e","line":380,"range":{"start_line":380,"start_character":18,"end_line":380,"end_character":49},"updated":"2023-06-13 00:05:25.000000000","message":"This parameter is not the MTU","commit_id":"f266d95f46081bef99abe1c9a74d9a88b721a9a8"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"72b08e3312b12824e6e138fb9163631901327b31","unresolved":true,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":182,"context_line":"def route_create(route):"},{"line_number":183,"context_line":"    scope \u003d \u0027link\u0027 if \u0027scope\u0027 not in route else route.pop(\u0027scope\u0027)"},{"line_number":184,"context_line":"    if scope is not None:"},{"line_number":185,"context_line":"        route[\u0027scope\u0027] \u003d get_scope_name(scope)"},{"line_number":186,"context_line":"    if \u0027family\u0027 not in route:"}],"source_content_type":"text/x-python","patch_set":15,"id":"55de60f9_8b8321c6","line":183,"updated":"2023-06-19 08:54:08.000000000","message":"pop() should support a default value. For example:\n\n```\nIn [13]: route \u003d {}\nIn [14]: route.pop(\u0027scope\u0027, \u0027link\u0027)\nOut[14]: \u0027link\u0027\n```","commit_id":"6f1d816f762123cd110724aa97d165020ea71739"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"d4c5f052fba4a0359a84838949274362de26ae79","unresolved":true,"context_lines":[{"line_number":185,"context_line":"        route[\u0027scope\u0027] \u003d get_scope_name(scope)"},{"line_number":186,"context_line":"    if \u0027family\u0027 not in route:"},{"line_number":187,"context_line":"        route[\u0027family\u0027] \u003d socket.AF_INET"},{"line_number":188,"context_line":"    _run_iproute_route(\u0027replace\u0027, **route)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":15,"id":"0b800a2e_7ccb4103","line":188,"range":{"start_line":188,"start_character":24,"end_line":188,"end_character":31},"updated":"2023-06-16 14:30:57.000000000","message":"Looks like this will \u0027add\u0027 the route if it does not exist","commit_id":"6f1d816f762123cd110724aa97d165020ea71739"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"72b08e3312b12824e6e138fb9163631901327b31","unresolved":true,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":192,"context_line":"def route_delete(route):"},{"line_number":193,"context_line":"    scope \u003d \u0027link\u0027 if \u0027scope\u0027 not in route else route.pop(\u0027scope\u0027)"},{"line_number":194,"context_line":"    if scope is not None:"},{"line_number":195,"context_line":"        route[\u0027scope\u0027] \u003d get_scope_name(scope)"},{"line_number":196,"context_line":"    if \u0027family\u0027 not in route:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fb7ef96_b930e12e","line":193,"updated":"2023-06-19 08:54:08.000000000","message":"ditto, route.pop(\u0027scope\u0027, \u0027link\u0027)","commit_id":"6f1d816f762123cd110724aa97d165020ea71739"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"d4c5f052fba4a0359a84838949274362de26ae79","unresolved":true,"context_lines":[{"line_number":387,"context_line":"                  \u0027type\u0027: \u0027unreachable\u0027,"},{"line_number":388,"context_line":"                  \u0027scope\u0027: None,"},{"line_number":389,"context_line":"                  \u0027proto\u0027: \u0027boot\u0027,"},{"line_number":390,"context_line":"                  \u0027priority\u0027: 4278198272}"},{"line_number":391,"context_line":"        route_create(kwargs)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"c8aad101_3f252575","line":390,"range":{"start_line":390,"start_character":30,"end_line":390,"end_character":40},"updated":"2023-06-16 14:30:57.000000000","message":"I had to google this 😊\n\nhttps://www.kernel.org/doc/Documentation/networking/vrf.txt\n\n3. Set the default route for the table (and hence default route for the VRF).\n       ip route add table 10 unreachable default metric 4278198272","commit_id":"6f1d816f762123cd110724aa97d165020ea71739"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"72b08e3312b12824e6e138fb9163631901327b31","unresolved":true,"context_lines":[{"line_number":387,"context_line":"                  \u0027type\u0027: \u0027unreachable\u0027,"},{"line_number":388,"context_line":"                  \u0027scope\u0027: None,"},{"line_number":389,"context_line":"                  \u0027proto\u0027: \u0027boot\u0027,"},{"line_number":390,"context_line":"                  \u0027priority\u0027: 4278198272}"},{"line_number":391,"context_line":"        route_create(kwargs)"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3ac460f9_b064aeec","line":390,"range":{"start_line":390,"start_character":30,"end_line":390,"end_character":40},"in_reply_to":"c8aad101_3f252575","updated":"2023-06-19 08:54:08.000000000","message":"Thanks! Perhaps a NOTE in the code here would be helpful for future readability","commit_id":"6f1d816f762123cd110724aa97d165020ea71739"}],"ovn_bgp_agent/tests/functional/privileged/test_linux_net.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"13af634b8b5263ea8b64695e2fca9c96ea842ae1","unresolved":true,"context_lines":[{"line_number":459,"context_line":"                     \u0027scope\u0027: scope,"},{"line_number":460,"context_line":"                     \u0027proto\u0027: proto}"},{"line_number":461,"context_line":"            linux_net.route_create(route)"},{"line_number":462,"context_line":"        # recreate route to ensure it does not break anything"},{"line_number":463,"context_line":"        linux_net.route_create(route)"},{"line_number":464,"context_line":"        self._check_routes(cidrs, self.dev_name, table\u003dtable, scope\u003dscope,"},{"line_number":465,"context_line":"                           proto\u003dproto)"},{"line_number":466,"context_line":"        for cidr in cidrs:"}],"source_content_type":"text/x-python","patch_set":9,"id":"d5bcfd49_af18774f","line":463,"range":{"start_line":462,"start_character":9,"end_line":463,"end_character":37},"updated":"2023-06-13 14:31:45.000000000","message":"If you want to test that, you should check that in the loop","commit_id":"6a30fdf30bed0dc432653c00a3bb50becd0e982d"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"8c2c3b9f531c5a21b153866493069c090717a0cd","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                     \u0027scope\u0027: scope,"},{"line_number":460,"context_line":"                     \u0027proto\u0027: proto}"},{"line_number":461,"context_line":"            linux_net.route_create(route)"},{"line_number":462,"context_line":"        # recreate route to ensure it does not break anything"},{"line_number":463,"context_line":"        linux_net.route_create(route)"},{"line_number":464,"context_line":"        self._check_routes(cidrs, self.dev_name, table\u003dtable, scope\u003dscope,"},{"line_number":465,"context_line":"                           proto\u003dproto)"},{"line_number":466,"context_line":"        for cidr in cidrs:"}],"source_content_type":"text/x-python","patch_set":9,"id":"d427c57a_62b75dce","line":463,"range":{"start_line":462,"start_character":9,"end_line":463,"end_character":37},"in_reply_to":"d5bcfd49_af18774f","updated":"2023-06-13 14:50:59.000000000","message":"Done","commit_id":"6a30fdf30bed0dc432653c00a3bb50becd0e982d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"13af634b8b5263ea8b64695e2fca9c96ea842ae1","unresolved":true,"context_lines":[{"line_number":474,"context_line":"                     \u0027proto\u0027: proto}"},{"line_number":475,"context_line":"            linux_net.route_delete(route)"},{"line_number":476,"context_line":"        # redelete route to ensure it does not break anything"},{"line_number":477,"context_line":"        linux_net.route_delete(route)"},{"line_number":478,"context_line":"        self._check_routes(cidrs, self.dev_name, table\u003dtable, scope\u003dscope,"},{"line_number":479,"context_line":"                           proto\u003dproto, route_present\u003dFalse)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"780ccd19_3de58cc8","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":37},"updated":"2023-06-13 14:31:45.000000000","message":"That will raise an exception, the route doesn\u0027t exist. If you need that, we need to handle in a different way","commit_id":"6a30fdf30bed0dc432653c00a3bb50becd0e982d"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"8c2c3b9f531c5a21b153866493069c090717a0cd","unresolved":true,"context_lines":[{"line_number":474,"context_line":"                     \u0027proto\u0027: proto}"},{"line_number":475,"context_line":"            linux_net.route_delete(route)"},{"line_number":476,"context_line":"        # redelete route to ensure it does not break anything"},{"line_number":477,"context_line":"        linux_net.route_delete(route)"},{"line_number":478,"context_line":"        self._check_routes(cidrs, self.dev_name, table\u003dtable, scope\u003dscope,"},{"line_number":479,"context_line":"                           proto\u003dproto, route_present\u003dFalse)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"e7b437d3_a7a3520c","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":37},"in_reply_to":"780ccd19_3de58cc8","updated":"2023-06-13 14:50:59.000000000","message":"Why? we are grabbing the errno.ENOENT (not found)","commit_id":"6a30fdf30bed0dc432653c00a3bb50becd0e982d"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"965286220b8dc7a3425699b56240feeb70e25231","unresolved":false,"context_lines":[{"line_number":474,"context_line":"                     \u0027proto\u0027: proto}"},{"line_number":475,"context_line":"            linux_net.route_delete(route)"},{"line_number":476,"context_line":"        # redelete route to ensure it does not break anything"},{"line_number":477,"context_line":"        linux_net.route_delete(route)"},{"line_number":478,"context_line":"        self._check_routes(cidrs, self.dev_name, table\u003dtable, scope\u003dscope,"},{"line_number":479,"context_line":"                           proto\u003dproto, route_present\u003dFalse)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1e38b5cb_b420ab37","line":477,"range":{"start_line":477,"start_character":8,"end_line":477,"end_character":37},"in_reply_to":"e7b437d3_a7a3520c","updated":"2023-06-15 07:58:51.000000000","message":"ok, it seems I need to catch errno.ESRCH","commit_id":"6a30fdf30bed0dc432653c00a3bb50becd0e982d"}]}
