)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a39b4fe4_4e920745","updated":"2023-06-09 11:22:53.000000000","message":"couple of nits here and there","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4db20ec4302d3c1733ae691fab44c01ec227b305","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"31b30fae_4b4bc761","updated":"2023-06-12 06:41:35.000000000","message":"looks good to me, just a couple of nits around testing (while we test that indeed avoid the pyroute2 crash issues","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"194538056b59b14a41557b9a166af60064c496a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"548ace9c_88f4e6e0","updated":"2023-06-15 21:58:53.000000000","message":"I\u0027m voting on this patch because last PS is not mine","commit_id":"1cbfe7823ccd1e6104529f832cddbf3f9b159eff"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"6d24504f270d948c86a0ca84d6af64b9be79ef5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"1e6c44c1_bd132c09","updated":"2023-06-15 10:38:26.000000000","message":"recheck openstack-tox-funciontal-with-sudo unrelated","commit_id":"1cbfe7823ccd1e6104529f832cddbf3f9b159eff"}],"ovn_bgp_agent/privileged/linux_net.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def set_device_status(device, status):"},{"line_number":68,"context_line":"    set_link_attribute(device, state\u003dstatus)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def ensure_vrf(vrf_name, vrf_table):"}],"source_content_type":"text/x-python","patch_set":6,"id":"190bac73_b8ac92c3","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":44},"updated":"2023-06-08 11:39:35.000000000","message":"shouldn\u0027t this need to get the netlink_exception and raise NetworkInterfaceNotFound?","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def set_device_status(device, status):"},{"line_number":68,"context_line":"    set_link_attribute(device, state\u003dstatus)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"def ensure_vrf(vrf_name, vrf_table):"}],"source_content_type":"text/x-python","patch_set":6,"id":"6bbda361_87804739","line":68,"range":{"start_line":68,"start_character":0,"end_line":68,"end_character":44},"in_reply_to":"190bac73_b8ac92c3","updated":"2023-06-09 10:53:04.000000000","message":"It is done in set_link_attribute -\u003e _run_iproute_link","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":113,"context_line":"    stop\u003dtenacity.stop_after_delay(8),"},{"line_number":114,"context_line":"    reraise\u003dTrue)"},{"line_number":115,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":116,"context_line":"def set_master_for_device(device, master):"},{"line_number":117,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":118,"context_line":"        # Check if already associated to the master, and associate it if not"},{"line_number":119,"context_line":"        if (ndb.interfaces[device].get(\u0027master\u0027) !\u003d"},{"line_number":120,"context_line":"                ndb.interfaces[master][\u0027index\u0027]):"},{"line_number":121,"context_line":"            with ndb.interfaces[device] as iface:"},{"line_number":122,"context_line":"                iface.set(\u0027master\u0027, ndb.interfaces[master][\u0027index\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def ensure_dummy_device(device):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3bf3361a_eef9818a","line":122,"range":{"start_line":116,"start_character":0,"end_line":122,"end_character":68},"updated":"2023-06-08 11:39:35.000000000","message":"this still needs to be changed","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"b21475095de6202303e99e48fcd79599f57f6847","unresolved":true,"context_lines":[{"line_number":113,"context_line":"    stop\u003dtenacity.stop_after_delay(8),"},{"line_number":114,"context_line":"    reraise\u003dTrue)"},{"line_number":115,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":116,"context_line":"def set_master_for_device(device, master):"},{"line_number":117,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":118,"context_line":"        # Check if already associated to the master, and associate it if not"},{"line_number":119,"context_line":"        if (ndb.interfaces[device].get(\u0027master\u0027) !\u003d"},{"line_number":120,"context_line":"                ndb.interfaces[master][\u0027index\u0027]):"},{"line_number":121,"context_line":"            with ndb.interfaces[device] as iface:"},{"line_number":122,"context_line":"                iface.set(\u0027master\u0027, ndb.interfaces[master][\u0027index\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def ensure_dummy_device(device):"}],"source_content_type":"text/x-python","patch_set":6,"id":"81ad8f89_f137e9a5","line":122,"range":{"start_line":116,"start_character":0,"end_line":122,"end_character":68},"in_reply_to":"3bf3361a_eef9818a","updated":"2023-06-09 07:15:33.000000000","message":"possible option for this:\n    try:\n        with pyroute2.IPRoute() as ipr:\n            dev_index \u003d ipr.link_lookup(ifname\u003ddevice)[0]\n            master_index \u003d ipr.link_lookup(ifname\u003dmaster)[0]\n\n            # Check if already associated to the master, and associate it if not\n            with ipr.link(\u0027get\u0027, index\u003ddev_index) as iface:\n                if iface.get_attr(\u0027IFLA_MASTER\u0027) !\u003d master_index:\n                    ipr.link(\u0027set\u0027, index\u003ddev_index, master\u003dmaster_index)\n    except IndexError:\n        LOG.debug(\"No need to set %s on VRF %s, as one of them is deleted\",\n                  device, master)","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    stop\u003dtenacity.stop_after_delay(8),"},{"line_number":114,"context_line":"    reraise\u003dTrue)"},{"line_number":115,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":116,"context_line":"def set_master_for_device(device, master):"},{"line_number":117,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":118,"context_line":"        # Check if already associated to the master, and associate it if not"},{"line_number":119,"context_line":"        if (ndb.interfaces[device].get(\u0027master\u0027) !\u003d"},{"line_number":120,"context_line":"                ndb.interfaces[master][\u0027index\u0027]):"},{"line_number":121,"context_line":"            with ndb.interfaces[device] as iface:"},{"line_number":122,"context_line":"                iface.set(\u0027master\u0027, ndb.interfaces[master][\u0027index\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def ensure_dummy_device(device):"}],"source_content_type":"text/x-python","patch_set":6,"id":"234592ce_d2014849","line":122,"range":{"start_line":116,"start_character":0,"end_line":122,"end_character":68},"in_reply_to":"497753af_2dd3c2d8","updated":"2023-06-09 10:53:04.000000000","message":"Done","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"26474ad275c24e76cf6e9d0cbafae05be99d205e","unresolved":true,"context_lines":[{"line_number":113,"context_line":"    stop\u003dtenacity.stop_after_delay(8),"},{"line_number":114,"context_line":"    reraise\u003dTrue)"},{"line_number":115,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":116,"context_line":"def set_master_for_device(device, master):"},{"line_number":117,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":118,"context_line":"        # Check if already associated to the master, and associate it if not"},{"line_number":119,"context_line":"        if (ndb.interfaces[device].get(\u0027master\u0027) !\u003d"},{"line_number":120,"context_line":"                ndb.interfaces[master][\u0027index\u0027]):"},{"line_number":121,"context_line":"            with ndb.interfaces[device] as iface:"},{"line_number":122,"context_line":"                iface.set(\u0027master\u0027, ndb.interfaces[master][\u0027index\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def ensure_dummy_device(device):"}],"source_content_type":"text/x-python","patch_set":6,"id":"497753af_2dd3c2d8","line":122,"range":{"start_line":116,"start_character":0,"end_line":122,"end_character":68},"in_reply_to":"81ad8f89_f137e9a5","updated":"2023-06-09 08:56:01.000000000","message":"slight modification after testing:\n    try:\n        with pyroute2.IPRoute() as ipr:\n            dev_index \u003d ipr.link_lookup(ifname\u003ddevice)[0]\n            master_index \u003d ipr.link_lookup(ifname\u003dmaster)[0]\n            # Check if already associated to the master,\n            # and associate it if not\n            iface \u003d ipr.link(\u0027get\u0027, index\u003ddev_index)[0]\n            if iface.get_attr(\u0027IFLA_MASTER\u0027) !\u003d master_index:\n                ipr.link(\u0027set\u0027, index\u003ddev_index, master\u003dmaster_index)\n    except IndexError:\n        LOG.debug(\"No need to set %s on VRF %s, as one of them is deleted\",\n                  device, master)","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":137,"context_line":"        LOG.debug(\"Interfaces %s already deleted.\", device)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":141,"context_line":"def route_create(route):"},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        with pyroute2.NDB() as ndb:"},{"line_number":144,"context_line":"            ndb.routes.create(route).commit()"},{"line_number":145,"context_line":"    except KeyError:  # Already exists"},{"line_number":146,"context_line":"        LOG.debug(\"Route %s already exists.\", route)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":150,"context_line":"def route_delete(route):"},{"line_number":151,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":152,"context_line":"        try:"},{"line_number":153,"context_line":"            with ndb.routes[route] as r:"},{"line_number":154,"context_line":"                r.remove()"},{"line_number":155,"context_line":"        except (KeyError, ValueError):"},{"line_number":156,"context_line":"            LOG.debug(\"Route already deleted: {}\".format(route))"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":6,"id":"0762f532_49d27993","line":156,"range":{"start_line":140,"start_character":2,"end_line":156,"end_character":64},"updated":"2023-06-08 11:39:35.000000000","message":"need to be adapted too","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        LOG.debug(\"Interfaces %s already deleted.\", device)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":141,"context_line":"def route_create(route):"},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        with pyroute2.NDB() as ndb:"},{"line_number":144,"context_line":"            ndb.routes.create(route).commit()"},{"line_number":145,"context_line":"    except KeyError:  # Already exists"},{"line_number":146,"context_line":"        LOG.debug(\"Route %s already exists.\", route)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":150,"context_line":"def route_delete(route):"},{"line_number":151,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":152,"context_line":"        try:"},{"line_number":153,"context_line":"            with ndb.routes[route] as r:"},{"line_number":154,"context_line":"                r.remove()"},{"line_number":155,"context_line":"        except (KeyError, ValueError):"},{"line_number":156,"context_line":"            LOG.debug(\"Route already deleted: {}\".format(route))"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":6,"id":"f406724f_ec9c05bb","line":156,"range":{"start_line":140,"start_character":2,"end_line":156,"end_character":64},"in_reply_to":"0762f532_49d27993","updated":"2023-06-09 10:53:04.000000000","message":"In future patches.","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":182,"context_line":"def delete_exposed_ips(ips, nic):"},{"line_number":183,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":184,"context_line":"        for ip in ips:"},{"line_number":185,"context_line":"            address \u003d \u0027{}/32\u0027.format(ip)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c7583f76_f5c71ac1","line":182,"updated":"2023-06-08 11:39:35.000000000","message":"ditto","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":182,"context_line":"def delete_exposed_ips(ips, nic):"},{"line_number":183,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":184,"context_line":"        for ip in ips:"},{"line_number":185,"context_line":"            address \u003d \u0027{}/32\u0027.format(ip)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7424e9d0_90c90c4f","line":182,"in_reply_to":"c7583f76_f5c71ac1","updated":"2023-06-09 10:53:04.000000000","message":"In future patches.","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":196,"context_line":"def rule_create(rule):"},{"line_number":197,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":198,"context_line":"        try:"},{"line_number":199,"context_line":"            ndb.rules[rule]"}],"source_content_type":"text/x-python","patch_set":6,"id":"37f810b2_528310ce","line":196,"updated":"2023-06-08 11:39:35.000000000","message":"ditto","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":196,"context_line":"def rule_create(rule):"},{"line_number":197,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":198,"context_line":"        try:"},{"line_number":199,"context_line":"            ndb.rules[rule]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1924f1f1_57310dbe","line":196,"in_reply_to":"37f810b2_528310ce","updated":"2023-06-09 10:54:57.000000000","message":"for follow-up patches","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":212,"context_line":"def rule_delete(rule):"},{"line_number":213,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":214,"context_line":"        try:"},{"line_number":215,"context_line":"            ndb.rules[rule].remove().commit()"}],"source_content_type":"text/x-python","patch_set":6,"id":"548c7ca6_bc92cc78","line":212,"range":{"start_line":212,"start_character":4,"end_line":212,"end_character":15},"updated":"2023-06-08 11:39:35.000000000","message":"ditto","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":212,"context_line":"def rule_delete(rule):"},{"line_number":213,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":214,"context_line":"        try:"},{"line_number":215,"context_line":"            ndb.rules[rule].remove().commit()"}],"source_content_type":"text/x-python","patch_set":6,"id":"a59212cd_b9825ad6","line":212,"range":{"start_line":212,"start_character":4,"end_line":212,"end_character":15},"in_reply_to":"548c7ca6_bc92cc78","updated":"2023-06-09 10:54:57.000000000","message":"for follow-up patches","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":229,"context_line":"def delete_ip_rules(ip_rules):"},{"line_number":230,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":231,"context_line":"        for rule_ip, rule_info in ip_rules.items():"},{"line_number":232,"context_line":"            rule \u003d {\u0027dst\u0027: rule_ip.split(\"/\")[0],"}],"source_content_type":"text/x-python","patch_set":6,"id":"22492d50_41ab40ad","line":229,"updated":"2023-06-08 11:39:35.000000000","message":"ditto","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":229,"context_line":"def delete_ip_rules(ip_rules):"},{"line_number":230,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":231,"context_line":"        for rule_ip, rule_info in ip_rules.items():"},{"line_number":232,"context_line":"            rule \u003d {\u0027dst\u0027: rule_ip.split(\"/\")[0],"}],"source_content_type":"text/x-python","patch_set":6,"id":"b7db047e_8ef8c32a","line":229,"in_reply_to":"22492d50_41ab40ad","updated":"2023-06-09 10:54:57.000000000","message":"Done","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":296,"context_line":"def add_ip_nei(ip, lladdr, dev):"},{"line_number":297,"context_line":"    ip_version \u003d l_net.get_ip_version(ip)"},{"line_number":298,"context_line":"    with pyroute2.IPRoute() as iproute:"},{"line_number":299,"context_line":"        # This is doing something like:"}],"source_content_type":"text/x-python","patch_set":6,"id":"574aaf82_ab1cf648","line":296,"updated":"2023-06-08 11:39:35.000000000","message":"it is using already iproute, but better to adapted to the new  style too","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":296,"context_line":"def add_ip_nei(ip, lladdr, dev):"},{"line_number":297,"context_line":"    ip_version \u003d l_net.get_ip_version(ip)"},{"line_number":298,"context_line":"    with pyroute2.IPRoute() as iproute:"},{"line_number":299,"context_line":"        # This is doing something like:"}],"source_content_type":"text/x-python","patch_set":6,"id":"055af4f0_a655b4da","line":296,"in_reply_to":"574aaf82_ab1cf648","updated":"2023-06-09 10:53:04.000000000","message":"In future patches.","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":324,"context_line":"def del_ip_nei(ip, lladdr, dev):"},{"line_number":325,"context_line":"    ip_version \u003d l_net.get_ip_version(ip)"},{"line_number":326,"context_line":"    with pyroute2.IPRoute() as iproute:"},{"line_number":327,"context_line":"        # This is doing something like:"}],"source_content_type":"text/x-python","patch_set":6,"id":"17f88216_a9a1298a","line":324,"updated":"2023-06-08 11:39:35.000000000","message":"ditto","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":324,"context_line":"def del_ip_nei(ip, lladdr, dev):"},{"line_number":325,"context_line":"    ip_version \u003d l_net.get_ip_version(ip)"},{"line_number":326,"context_line":"    with pyroute2.IPRoute() as iproute:"},{"line_number":327,"context_line":"        # This is doing something like:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d3b7b09f_f03a1b2b","line":324,"in_reply_to":"17f88216_a9a1298a","updated":"2023-06-09 10:54:57.000000000","message":"for follow-up patches","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":383,"context_line":"#     if e.code \u003d\u003d errno.EINVAL:"},{"line_number":384,"context_line":"#         raise InvalidArgument(device\u003ddevice, namespace\u003dnamespace)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"def get_attr(pyroute2_obj, attr_name):"},{"line_number":387,"context_line":"    \"\"\"Get an attribute in a pyroute object"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    pyroute2 object attributes are stored under a key called \u0027attrs\u0027. This key"}],"source_content_type":"text/x-python","patch_set":6,"id":"0d8df439_56cb7288","line":386,"updated":"2023-06-08 11:39:35.000000000","message":"not used/needed for now","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":383,"context_line":"#     if e.code \u003d\u003d errno.EINVAL:"},{"line_number":384,"context_line":"#         raise InvalidArgument(device\u003ddevice, namespace\u003dnamespace)"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"def get_attr(pyroute2_obj, attr_name):"},{"line_number":387,"context_line":"    \"\"\"Get an attribute in a pyroute object"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    pyroute2 object attributes are stored under a key called \u0027attrs\u0027. This key"}],"source_content_type":"text/x-python","patch_set":6,"id":"e74313f3_2004c886","line":386,"in_reply_to":"0d8df439_56cb7288","updated":"2023-06-09 10:53:04.000000000","message":"Moved to testing code","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":401,"context_line":"        return attr[1]"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"def make_serializable(value):"},{"line_number":405,"context_line":"    \"\"\"Make a pyroute2 object serializable"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    This function converts \u0027netlink.nla_slot\u0027 object (key, value) in a list"}],"source_content_type":"text/x-python","patch_set":6,"id":"db7157d0_9ab61557","line":404,"range":{"start_line":404,"start_character":4,"end_line":404,"end_character":21},"updated":"2023-06-08 11:39:35.000000000","message":"not used/needed for now","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        return attr[1]"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"def make_serializable(value):"},{"line_number":405,"context_line":"    \"\"\"Make a pyroute2 object serializable"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    This function converts \u0027netlink.nla_slot\u0027 object (key, value) in a list"}],"source_content_type":"text/x-python","patch_set":6,"id":"509fffbc_322c3216","line":404,"range":{"start_line":404,"start_character":4,"end_line":404,"end_character":21},"in_reply_to":"db7157d0_9ab61557","updated":"2023-06-09 10:53:04.000000000","message":"Moved to testing code","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":444,"context_line":"def get_link_devices(**kwargs):"},{"line_number":445,"context_line":"    \"\"\"List interfaces in a namespace"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    :return: (list) interfaces in a namespace"}],"source_content_type":"text/x-python","patch_set":6,"id":"73e826a9_06eac14c","line":444,"updated":"2023-06-08 11:39:35.000000000","message":"not used/needed","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":444,"context_line":"def get_link_devices(**kwargs):"},{"line_number":445,"context_line":"    \"\"\"List interfaces in a namespace"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    :return: (list) interfaces in a namespace"}],"source_content_type":"text/x-python","patch_set":6,"id":"828d3455_eac6e569","line":444,"in_reply_to":"5c228198_ca0165fc","updated":"2023-06-09 10:54:57.000000000","message":"Done","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":true,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":444,"context_line":"def get_link_devices(**kwargs):"},{"line_number":445,"context_line":"    \"\"\"List interfaces in a namespace"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    :return: (list) interfaces in a namespace"}],"source_content_type":"text/x-python","patch_set":6,"id":"5c228198_ca0165fc","line":444,"in_reply_to":"73e826a9_06eac14c","updated":"2023-06-09 10:53:04.000000000","message":"Used in testing code, I can\u0027t move it because I need to keep it under the privileged directory, because privsep needs that.","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":490,"context_line":"    _run_iproute_link(\"set\", ifname, **attributes)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"def set_up(ifname):"},{"line_number":494,"context_line":"    set_link_attribute(ifname, state\u003d\u0027up\u0027)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"db9d3aa2_d59edd84","line":493,"updated":"2023-06-08 11:39:35.000000000","message":"not used/needed for now","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"79a0a6ab680d21e3bef7c28084f1971ba254bd45","unresolved":false,"context_lines":[{"line_number":490,"context_line":"    _run_iproute_link(\"set\", ifname, **attributes)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"def set_up(ifname):"},{"line_number":494,"context_line":"    set_link_attribute(ifname, state\u003d\u0027up\u0027)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9e2a3baf_13882f49","line":493,"in_reply_to":"06c5ade0_43c0fe5a","updated":"2023-06-09 10:54:57.000000000","message":"Done","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":true,"context_lines":[{"line_number":490,"context_line":"    _run_iproute_link(\"set\", ifname, **attributes)"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"def set_up(ifname):"},{"line_number":494,"context_line":"    set_link_attribute(ifname, state\u003d\u0027up\u0027)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"06c5ade0_43c0fe5a","line":493,"in_reply_to":"db9d3aa2_d59edd84","updated":"2023-06-09 10:53:04.000000000","message":"Move to testing","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":541,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":542,"context_line":"        # address\u0027)"},{"line_number":543,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":544,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":545,"context_line":"            return"},{"line_number":546,"context_line":"        raise"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"def get_devices_info(**kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"74df6510_ae3ebcec","line":546,"range":{"start_line":544,"start_character":0,"end_line":546,"end_character":13},"updated":"2023-06-08 11:39:35.000000000","message":"perhaps we should also catch \"if e.code \u003d\u003d errno.ENOENT:\" in case the interface is not there anymore?","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":541,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":542,"context_line":"        # address\u0027)"},{"line_number":543,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":544,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":545,"context_line":"            return"},{"line_number":546,"context_line":"        raise"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"def get_devices_info(**kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"38c2b6a3_e9d1d9db","line":546,"range":{"start_line":544,"start_character":0,"end_line":546,"end_character":13},"in_reply_to":"74df6510_ae3ebcec","updated":"2023-06-09 10:53:04.000000000","message":"This is done inside _run_iproute_addr","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"804cd6d65032e945bf5c88dc1750f07bf0adabc2","unresolved":true,"context_lines":[{"line_number":546,"context_line":"        raise"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"def get_devices_info(**kwargs):"},{"line_number":550,"context_line":"    devices \u003d get_link_devices(**kwargs)"},{"line_number":551,"context_line":"    retval \u003d {}"},{"line_number":552,"context_line":"    for device in devices:"}],"source_content_type":"text/x-python","patch_set":6,"id":"0a3478d6_bf78cf6d","line":549,"updated":"2023-06-08 11:39:35.000000000","message":"not used/needed for now","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c1e675fa1afd2b22dcc6ccd96d2958816153e956","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        raise"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"def get_devices_info(**kwargs):"},{"line_number":550,"context_line":"    devices \u003d get_link_devices(**kwargs)"},{"line_number":551,"context_line":"    retval \u003d {}"},{"line_number":552,"context_line":"    for device in devices:"}],"source_content_type":"text/x-python","patch_set":6,"id":"67e58f92_220d48bb","line":549,"in_reply_to":"0a3478d6_bf78cf6d","updated":"2023-06-09 10:53:04.000000000","message":"moved to testing","commit_id":"5cb1c34999e1365ab35c9dbee629a933f0a2cccb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":true,"context_lines":[{"line_number":182,"context_line":"    vlan_device_name \u003d \u0027{}.{}\u0027.format(bridge, vlan_tag)"},{"line_number":183,"context_line":"    try:"},{"line_number":184,"context_line":"        set_device_status(vlan_device_name, constants.LINK_UP)"},{"line_number":185,"context_line":"    except KeyError:"},{"line_number":186,"context_line":"        create_interface(vlan_device_name, \u0027vlan\u0027,"},{"line_number":187,"context_line":"                         physical_interface\u003dbridge,"},{"line_number":188,"context_line":"                         vlan_id\u003dvlan_tag)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1b4765df_1b2d437c","line":185,"range":{"start_line":185,"start_character":11,"end_line":185,"end_character":19},"updated":"2023-06-09 11:22:53.000000000","message":"should this be NetworkInterfaceNotFound?","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"758d8cf68f75af89fba88a9a535827d20f26ba64","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    vlan_device_name \u003d \u0027{}.{}\u0027.format(bridge, vlan_tag)"},{"line_number":183,"context_line":"    try:"},{"line_number":184,"context_line":"        set_device_status(vlan_device_name, constants.LINK_UP)"},{"line_number":185,"context_line":"    except KeyError:"},{"line_number":186,"context_line":"        create_interface(vlan_device_name, \u0027vlan\u0027,"},{"line_number":187,"context_line":"                         physical_interface\u003dbridge,"},{"line_number":188,"context_line":"                         vlan_id\u003dvlan_tag)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfb84f7d_d42bb155","line":185,"range":{"start_line":185,"start_character":11,"end_line":185,"end_character":19},"in_reply_to":"1b4765df_1b2d437c","updated":"2023-06-09 14:08:54.000000000","message":"Right!\n\nI should implement these tests in the FT FW, I didn\u0027t have time.","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":true,"context_lines":[{"line_number":199,"context_line":"        raise"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":203,"context_line":"def delete_exposed_ips(ips, nic):"},{"line_number":204,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":205,"context_line":"        for ip in ips:"},{"line_number":206,"context_line":"            address \u003d \u0027{}/32\u0027.format(ip)"},{"line_number":207,"context_line":"            if l_net.get_ip_version(ip) \u003d\u003d constants.IP_VERSION_6:"},{"line_number":208,"context_line":"                address \u003d \u0027{}/128\u0027.format(ip)"},{"line_number":209,"context_line":"            try:"},{"line_number":210,"context_line":"                ndb.interfaces[nic].ipaddr[address].remove().commit()"},{"line_number":211,"context_line":"            except KeyError:"},{"line_number":212,"context_line":"                LOG.debug(\"IP address {} already removed from nic {}.\".format("},{"line_number":213,"context_line":"                    ip, nic))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":11,"id":"69892d48_d0a0894e","line":213,"range":{"start_line":202,"start_character":1,"end_line":213,"end_character":29},"updated":"2023-06-09 11:22:53.000000000","message":"perhaps this should be adapted too","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"758d8cf68f75af89fba88a9a535827d20f26ba64","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        raise"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":203,"context_line":"def delete_exposed_ips(ips, nic):"},{"line_number":204,"context_line":"    with pyroute2.NDB() as ndb:"},{"line_number":205,"context_line":"        for ip in ips:"},{"line_number":206,"context_line":"            address \u003d \u0027{}/32\u0027.format(ip)"},{"line_number":207,"context_line":"            if l_net.get_ip_version(ip) \u003d\u003d constants.IP_VERSION_6:"},{"line_number":208,"context_line":"                address \u003d \u0027{}/128\u0027.format(ip)"},{"line_number":209,"context_line":"            try:"},{"line_number":210,"context_line":"                ndb.interfaces[nic].ipaddr[address].remove().commit()"},{"line_number":211,"context_line":"            except KeyError:"},{"line_number":212,"context_line":"                LOG.debug(\"IP address {} already removed from nic {}.\".format("},{"line_number":213,"context_line":"                    ip, nic))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":11,"id":"b26c413c_fc81b08d","line":213,"range":{"start_line":202,"start_character":1,"end_line":213,"end_character":29},"in_reply_to":"69892d48_d0a0894e","updated":"2023-06-09 14:08:54.000000000","message":"Actually there is a method to remove IPs","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":true,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":515,"context_line":"def set_link_attribute(ifname, **kwargs):"},{"line_number":516,"context_line":"    _run_iproute_link(\"set\", ifname, **kwargs)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _run_iproute_addr(command, device, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"20646482_bda5cb64","line":516,"range":{"start_line":515,"start_character":0,"end_line":516,"end_character":46},"updated":"2023-06-09 11:22:53.000000000","message":"this will try to set the status regardless of it already being right, I hope this does not matter","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"758d8cf68f75af89fba88a9a535827d20f26ba64","unresolved":false,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":515,"context_line":"def set_link_attribute(ifname, **kwargs):"},{"line_number":516,"context_line":"    _run_iproute_link(\"set\", ifname, **kwargs)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _run_iproute_addr(command, device, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"25d5aac6_eeb7bb60","line":516,"range":{"start_line":515,"start_character":0,"end_line":516,"end_character":46},"in_reply_to":"20646482_bda5cb64","updated":"2023-06-09 14:08:54.000000000","message":"Yes, it will. This is idempotent. I\u0027ll test it.","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":true,"context_lines":[{"line_number":516,"context_line":"    _run_iproute_link(\"set\", ifname, **kwargs)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _run_iproute_addr(command, device, **kwargs):"},{"line_number":520,"context_line":"    try:"},{"line_number":521,"context_line":"        with iproute.IPRoute() as ip:"},{"line_number":522,"context_line":"            idx \u003d _get_link_id(device)"}],"source_content_type":"text/x-python","patch_set":11,"id":"04c9f446_2569fe99","line":519,"range":{"start_line":519,"start_character":0,"end_line":519,"end_character":21},"updated":"2023-06-09 11:22:53.000000000","message":"super nit: perhaps worth to put all the \"_run_iproute_XXX\" together, one after another.","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"758d8cf68f75af89fba88a9a535827d20f26ba64","unresolved":false,"context_lines":[{"line_number":516,"context_line":"    _run_iproute_link(\"set\", ifname, **kwargs)"},{"line_number":517,"context_line":""},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"def _run_iproute_addr(command, device, **kwargs):"},{"line_number":520,"context_line":"    try:"},{"line_number":521,"context_line":"        with iproute.IPRoute() as ip:"},{"line_number":522,"context_line":"            idx \u003d _get_link_id(device)"}],"source_content_type":"text/x-python","patch_set":11,"id":"000859f7_e58972fd","line":519,"range":{"start_line":519,"start_character":0,"end_line":519,"end_character":21},"in_reply_to":"04c9f446_2569fe99","updated":"2023-06-09 14:08:54.000000000","message":"Done","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"141cce36cce756a65d9fcdfcf65bb3604f9f9675","unresolved":true,"context_lines":[{"line_number":525,"context_line":"        _translate_ip_device_exception(e, device)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":529,"context_line":"def add_ip_address(ip_address, ifname):"},{"line_number":530,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":531,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":532,"context_line":"    address \u003d str(net.ip)"},{"line_number":533,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":534,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":535,"context_line":"    try:"},{"line_number":536,"context_line":"        _run_iproute_addr(\u0027add\u0027,"},{"line_number":537,"context_line":"                          ifname,"},{"line_number":538,"context_line":"                          address\u003daddress,"},{"line_number":539,"context_line":"                          mask\u003dprefixlen,"},{"line_number":540,"context_line":"                          family\u003dfamily)"},{"line_number":541,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":542,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":543,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":544,"context_line":"        raise"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":548,"context_line":"def delete_ip_address(ip_address, ifname):"},{"line_number":549,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":550,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":551,"context_line":"    address \u003d str(net.ip)"},{"line_number":552,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":553,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":554,"context_line":"    try:"},{"line_number":555,"context_line":"        _run_iproute_addr(\"delete\","},{"line_number":556,"context_line":"                          ifname,"},{"line_number":557,"context_line":"                          address\u003daddress,"},{"line_number":558,"context_line":"                          mask\u003dprefixlen,"},{"line_number":559,"context_line":"                          family\u003dfamily)"},{"line_number":560,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":561,"context_line":"        # when trying to delete a non-existent IP address, pyroute2 raises"},{"line_number":562,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":563,"context_line":"        # address\u0027)"},{"line_number":564,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":565,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":566,"context_line":"            return"},{"line_number":567,"context_line":"        raise"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":11,"id":"617be46e_7be112b2","line":567,"range":{"start_line":528,"start_character":0,"end_line":567,"end_character":13},"updated":"2023-06-09 11:22:53.000000000","message":"as in the other patch, perhaps these two can be joined in one, of course using your _run_ipdroute_addr function instead:\ndef _update_ip_on_dev(command, ip, nic):\n    mask \u003d 128 if l_net.get_ip_version(ip) \u003d\u003d constants.IP_VERSION_6 else 32\n    try:\n        with pyroute2.IPRoute() as ipr:\n            idx \u003d ipr.link_lookup(ifname\u003dnic)[0]\n            ipr.addr(command, index\u003didx, address\u003dip, mask\u003dmask)\n    except netlink_exceptions.NetlinkError as e:  # Already exists\n        if command \u003d\u003d \u0027add\u0027:\n            if e.code \u003d\u003d errno.EEXIST:\n                LOG.debug(\"IP %s already added to interface %s.\", ip, nic)\n            else:\n                raise\n        if command \u003d\u003d \u0027del\u0027:\n            if e.code \u003d\u003d errno.ENOENT:\n                LOG.debug(\"IP %s already deleted from interface %s.\", ip, nic)\n            # when trying to delete a non-existent IP address, pyroute2 raises\n            # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign\n            # requested address\u0027)\n            # this shouldn\u0027t raise an error\n            if e.code \u003d\u003d errno.EADDRNOTAVAIL:\n                LOG.debug(\"IP %s already deleted from interface %s.\", ip, nic)\n            else:\n                raise\n    except IndexError:\n        LOG.debug(\"No need to %s ip on dev %s as it does not exist\",\n                  command, nic)","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"758d8cf68f75af89fba88a9a535827d20f26ba64","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        _translate_ip_device_exception(e, device)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":529,"context_line":"def add_ip_address(ip_address, ifname):"},{"line_number":530,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":531,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":532,"context_line":"    address \u003d str(net.ip)"},{"line_number":533,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":534,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":535,"context_line":"    try:"},{"line_number":536,"context_line":"        _run_iproute_addr(\u0027add\u0027,"},{"line_number":537,"context_line":"                          ifname,"},{"line_number":538,"context_line":"                          address\u003daddress,"},{"line_number":539,"context_line":"                          mask\u003dprefixlen,"},{"line_number":540,"context_line":"                          family\u003dfamily)"},{"line_number":541,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":542,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":543,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":544,"context_line":"        raise"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":548,"context_line":"def delete_ip_address(ip_address, ifname):"},{"line_number":549,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":550,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":551,"context_line":"    address \u003d str(net.ip)"},{"line_number":552,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":553,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":554,"context_line":"    try:"},{"line_number":555,"context_line":"        _run_iproute_addr(\"delete\","},{"line_number":556,"context_line":"                          ifname,"},{"line_number":557,"context_line":"                          address\u003daddress,"},{"line_number":558,"context_line":"                          mask\u003dprefixlen,"},{"line_number":559,"context_line":"                          family\u003dfamily)"},{"line_number":560,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":561,"context_line":"        # when trying to delete a non-existent IP address, pyroute2 raises"},{"line_number":562,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":563,"context_line":"        # address\u0027)"},{"line_number":564,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":565,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":566,"context_line":"            return"},{"line_number":567,"context_line":"        raise"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":11,"id":"796309b3_b62880c5","line":567,"range":{"start_line":528,"start_character":0,"end_line":567,"end_character":13},"in_reply_to":"617be46e_7be112b2","updated":"2023-06-09 14:08:54.000000000","message":"I\u0027ll use this implementation for \"delete_exposed_ips\"","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"295bf2c526e96c96e55d696f10079160ca8f0c30","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        _translate_ip_device_exception(e, device)"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":529,"context_line":"def add_ip_address(ip_address, ifname):"},{"line_number":530,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":531,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":532,"context_line":"    address \u003d str(net.ip)"},{"line_number":533,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":534,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":535,"context_line":"    try:"},{"line_number":536,"context_line":"        _run_iproute_addr(\u0027add\u0027,"},{"line_number":537,"context_line":"                          ifname,"},{"line_number":538,"context_line":"                          address\u003daddress,"},{"line_number":539,"context_line":"                          mask\u003dprefixlen,"},{"line_number":540,"context_line":"                          family\u003dfamily)"},{"line_number":541,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":542,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":543,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":544,"context_line":"        raise"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":548,"context_line":"def delete_ip_address(ip_address, ifname):"},{"line_number":549,"context_line":"    net \u003d netaddr.IPNetwork(ip_address)"},{"line_number":550,"context_line":"    ip_version \u003d l_net.get_ip_version(ip_address)"},{"line_number":551,"context_line":"    address \u003d str(net.ip)"},{"line_number":552,"context_line":"    prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":553,"context_line":"    family \u003d _IP_VERSION_FAMILY_MAP[ip_version]"},{"line_number":554,"context_line":"    try:"},{"line_number":555,"context_line":"        _run_iproute_addr(\"delete\","},{"line_number":556,"context_line":"                          ifname,"},{"line_number":557,"context_line":"                          address\u003daddress,"},{"line_number":558,"context_line":"                          mask\u003dprefixlen,"},{"line_number":559,"context_line":"                          family\u003dfamily)"},{"line_number":560,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":561,"context_line":"        # when trying to delete a non-existent IP address, pyroute2 raises"},{"line_number":562,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":563,"context_line":"        # address\u0027)"},{"line_number":564,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":565,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":566,"context_line":"            return"},{"line_number":567,"context_line":"        raise"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":11,"id":"34f99bfc_a6463365","line":567,"range":{"start_line":528,"start_character":0,"end_line":567,"end_character":13},"in_reply_to":"796309b3_b62880c5","updated":"2023-06-09 14:41:41.000000000","message":"I meant something else, there is a lot of of code that is the same in both add_ip_address and delete_ip_address, so we can have those 2 methods calling `update_ip_address` or something similar, taking op\u003d\u0027add\u0027 or op\u003d\u0027delete\u0027 and then handling the exceptions depending on operation... but this is minor thing, no need to handle it now","commit_id":"90376dcd2cf47b9ee8c8b9f52c6d7b198896f6b1"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"295bf2c526e96c96e55d696f10079160ca8f0c30","unresolved":true,"context_lines":[{"line_number":553,"context_line":"        # address\u0027)"},{"line_number":554,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":555,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":556,"context_line":"            LOG.debug(\u0027No need to delete IP address %s on dev %s as it does \u0027"},{"line_number":557,"context_line":"                      \u0027not exist\u0027, ip_address, ifname)"},{"line_number":558,"context_line":"        raise"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"c9fa0e3b_6de90d58","line":557,"range":{"start_line":556,"start_character":0,"end_line":557,"end_character":54},"updated":"2023-06-09 14:41:41.000000000","message":"this should have a return right? to not raise the exception","commit_id":"8be33f088089853405c40048b9fad2135038593b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"97626f30153d3674921ad59e5fb231dbc30a5e53","unresolved":false,"context_lines":[{"line_number":553,"context_line":"        # address\u0027)"},{"line_number":554,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":555,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":556,"context_line":"            LOG.debug(\u0027No need to delete IP address %s on dev %s as it does \u0027"},{"line_number":557,"context_line":"                      \u0027not exist\u0027, ip_address, ifname)"},{"line_number":558,"context_line":"        raise"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7a6a932f_9c69c084","line":557,"range":{"start_line":556,"start_character":0,"end_line":557,"end_character":54},"in_reply_to":"c9fa0e3b_6de90d58","updated":"2023-06-09 14:43:09.000000000","message":"right, I missed that","commit_id":"8be33f088089853405c40048b9fad2135038593b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"8f212500ecb730b1727fd33236135bda8af68884","unresolved":true,"context_lines":[{"line_number":39,"context_line":"_IP_VERSION_FAMILY_MAP \u003d {4: socket.AF_INET, 6: socket.AF_INET6}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class NetworkInterfaceNotFound(RuntimeError):"},{"line_number":43,"context_line":"    message \u003d \u0027Network interface %(device)s not found\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":46,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":47,"context_line":"        super(NetworkInterfaceNotFound, self).__init__(message)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class InterfaceAlreadyExists(RuntimeError):"},{"line_number":51,"context_line":"    message \u003d \"Interface %(device)s already exists.\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":54,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":55,"context_line":"        super(InterfaceAlreadyExists, self).__init__(message)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class IpAddressAlreadyExists(RuntimeError):"},{"line_number":59,"context_line":"    message \u003d \"IP address %(ip)s already configured on %(device)s.\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self, message\u003dNone, ip\u003dNone, device\u003dNone):"},{"line_number":62,"context_line":"        message \u003d message or self.message % {\u0027ip\u0027: ip, \u0027device\u0027: device}"},{"line_number":63,"context_line":"        super(IpAddressAlreadyExists, self).__init__(message)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"class InterfaceOperationNotSupported(RuntimeError):"},{"line_number":67,"context_line":"    message \u003d \"Operation not supported on interface %(device)s.\""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":70,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":71,"context_line":"        super(InterfaceOperationNotSupported, self).__init__(message)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class InvalidArgument(RuntimeError):"},{"line_number":75,"context_line":"    message \u003d \"Invalid parameter/value used on interface %(device)s.\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":78,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":79,"context_line":"        super(InvalidArgument, self).__init__(message)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def set_device_status(device, status):"}],"source_content_type":"text/x-python","patch_set":15,"id":"0a403621_4f4a9e37","line":79,"range":{"start_line":42,"start_character":0,"end_line":79,"end_character":54},"updated":"2023-06-12 09:13:15.000000000","message":"perhaps woth to move these to the common agent.exceptions as that will later be used by utils/linux_net.py when NDB usage removed from there too","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"_IP_VERSION_FAMILY_MAP \u003d {4: socket.AF_INET, 6: socket.AF_INET6}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class NetworkInterfaceNotFound(RuntimeError):"},{"line_number":43,"context_line":"    message \u003d \u0027Network interface %(device)s not found\u0027"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":46,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":47,"context_line":"        super(NetworkInterfaceNotFound, self).__init__(message)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class InterfaceAlreadyExists(RuntimeError):"},{"line_number":51,"context_line":"    message \u003d \"Interface %(device)s already exists.\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":54,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":55,"context_line":"        super(InterfaceAlreadyExists, self).__init__(message)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class IpAddressAlreadyExists(RuntimeError):"},{"line_number":59,"context_line":"    message \u003d \"IP address %(ip)s already configured on %(device)s.\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def __init__(self, message\u003dNone, ip\u003dNone, device\u003dNone):"},{"line_number":62,"context_line":"        message \u003d message or self.message % {\u0027ip\u0027: ip, \u0027device\u0027: device}"},{"line_number":63,"context_line":"        super(IpAddressAlreadyExists, self).__init__(message)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"class InterfaceOperationNotSupported(RuntimeError):"},{"line_number":67,"context_line":"    message \u003d \"Operation not supported on interface %(device)s.\""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":70,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":71,"context_line":"        super(InterfaceOperationNotSupported, self).__init__(message)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"class InvalidArgument(RuntimeError):"},{"line_number":75,"context_line":"    message \u003d \"Invalid parameter/value used on interface %(device)s.\""},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":78,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":79,"context_line":"        super(InvalidArgument, self).__init__(message)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def set_device_status(device, status):"}],"source_content_type":"text/x-python","patch_set":15,"id":"20b1b492_2d0d36b7","line":79,"range":{"start_line":42,"start_character":0,"end_line":79,"end_character":54},"in_reply_to":"0a403621_4f4a9e37","updated":"2023-06-12 18:46:22.000000000","message":"We can move these exceptions later if needed. For now, we are only using them here.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"eea017e9179d0113845440813b20e8f32ca40545","unresolved":true,"context_lines":[{"line_number":435,"context_line":"    return _ensure_string(value)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"def _get_link_id(ifname, raise_exception\u003dTrue):"},{"line_number":439,"context_line":"    with iproute.IPRoute() as ip:"},{"line_number":440,"context_line":"        link_id \u003d ip.link_lookup(ifname\u003difname)"},{"line_number":441,"context_line":"    if not link_id or len(link_id) \u003c 1:"},{"line_number":442,"context_line":"        if raise_exception:"},{"line_number":443,"context_line":"            raise NetworkInterfaceNotFound(device\u003difname)"},{"line_number":444,"context_line":"        LOG.debug(\u0027Interface %(dev)s not found\u0027, {\u0027dev\u0027: ifname})"},{"line_number":445,"context_line":"        return None"},{"line_number":446,"context_line":"    return link_id[0]"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":450,"context_line":"def get_link_id(device):"},{"line_number":451,"context_line":"    return _get_link_id(device, raise_exception\u003dFalse)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"@tenacity.retry("}],"source_content_type":"text/x-python","patch_set":15,"id":"d47d6a48_54c204f6","line":451,"range":{"start_line":438,"start_character":0,"end_line":451,"end_character":54},"updated":"2023-06-12 08:57:32.000000000","message":"this should be moved to utils/linux_net.py instead as it does not require priviledged, right?","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    return _ensure_string(value)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"def _get_link_id(ifname, raise_exception\u003dTrue):"},{"line_number":439,"context_line":"    with iproute.IPRoute() as ip:"},{"line_number":440,"context_line":"        link_id \u003d ip.link_lookup(ifname\u003difname)"},{"line_number":441,"context_line":"    if not link_id or len(link_id) \u003c 1:"},{"line_number":442,"context_line":"        if raise_exception:"},{"line_number":443,"context_line":"            raise NetworkInterfaceNotFound(device\u003difname)"},{"line_number":444,"context_line":"        LOG.debug(\u0027Interface %(dev)s not found\u0027, {\u0027dev\u0027: ifname})"},{"line_number":445,"context_line":"        return None"},{"line_number":446,"context_line":"    return link_id[0]"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":450,"context_line":"def get_link_id(device):"},{"line_number":451,"context_line":"    return _get_link_id(device, raise_exception\u003dFalse)"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"@tenacity.retry("}],"source_content_type":"text/x-python","patch_set":15,"id":"2c6af60f_7714a5a6","line":451,"range":{"start_line":438,"start_character":0,"end_line":451,"end_character":54},"in_reply_to":"d47d6a48_54c204f6","updated":"2023-06-12 18:46:22.000000000","message":"Do you mean the private \"_get_link_id\" method. No, this is used only in this module. I\u0027ve implemented the non private one \"get_link_id\" if anyone is calling it outside it and, more important, outside a privsep context. We need both and in this module.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"92a09b524690fcd68cf445aa9049b094fafc9985","unresolved":true,"context_lines":[{"line_number":528,"context_line":"                          address\u003daddress,"},{"line_number":529,"context_line":"                          mask\u003dprefixlen,"},{"line_number":530,"context_line":"                          family\u003dfamily)"},{"line_number":531,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":532,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":533,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":534,"context_line":"        raise"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":15,"id":"fb54fa56_691ba133","line":534,"range":{"start_line":531,"start_character":1,"end_line":534,"end_character":13},"updated":"2023-06-12 08:11:20.000000000","message":"shouldn\u0027t this be moved to _translate_ip_device_exception instead?","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                          address\u003daddress,"},{"line_number":529,"context_line":"                          mask\u003dprefixlen,"},{"line_number":530,"context_line":"                          family\u003dfamily)"},{"line_number":531,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":532,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":533,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":534,"context_line":"        raise"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":""},{"line_number":537,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":15,"id":"b6b8751c_fd1e283c","line":534,"range":{"start_line":531,"start_character":1,"end_line":534,"end_character":13},"in_reply_to":"fb54fa56_691ba133","updated":"2023-06-12 18:46:22.000000000","message":"EEXIST is raised here because the IP address is already present in the interface (this is \"ip address\" exception). But the EEXIST exception catch in the translated method is raising a InterfaceAlreadyExists exception (\"ip link\" exception).","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"92a09b524690fcd68cf445aa9049b094fafc9985","unresolved":true,"context_lines":[{"line_number":547,"context_line":"                          address\u003daddress,"},{"line_number":548,"context_line":"                          mask\u003dprefixlen,"},{"line_number":549,"context_line":"                          family\u003dfamily)"},{"line_number":550,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":551,"context_line":"        # when trying to delete a non-existent IP address, pyroute2 raises"},{"line_number":552,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":553,"context_line":"        # address\u0027)"},{"line_number":554,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":555,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":556,"context_line":"            LOG.debug(\u0027No need to delete IP address %s on dev %s as it does \u0027"},{"line_number":557,"context_line":"                      \u0027not exist\u0027, ip_address, ifname)"},{"line_number":558,"context_line":"            return"},{"line_number":559,"context_line":"        raise e"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":15,"id":"e79434ee_950b9f9c","line":559,"range":{"start_line":550,"start_character":0,"end_line":559,"end_character":15},"updated":"2023-06-12 08:11:20.000000000","message":"shouldn\u0027t this be moved to _translate_ip_device_exception instead?","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":547,"context_line":"                          address\u003daddress,"},{"line_number":548,"context_line":"                          mask\u003dprefixlen,"},{"line_number":549,"context_line":"                          family\u003dfamily)"},{"line_number":550,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":551,"context_line":"        # when trying to delete a non-existent IP address, pyroute2 raises"},{"line_number":552,"context_line":"        # NetlinkError with code EADDRNOTAVAIL (99, \u0027Cannot assign requested"},{"line_number":553,"context_line":"        # address\u0027)"},{"line_number":554,"context_line":"        # this shouldn\u0027t raise an error"},{"line_number":555,"context_line":"        if e.code \u003d\u003d errno.EADDRNOTAVAIL:"},{"line_number":556,"context_line":"            LOG.debug(\u0027No need to delete IP address %s on dev %s as it does \u0027"},{"line_number":557,"context_line":"                      \u0027not exist\u0027, ip_address, ifname)"},{"line_number":558,"context_line":"            return"},{"line_number":559,"context_line":"        raise e"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":15,"id":"05057389_7f1c288d","line":559,"range":{"start_line":550,"start_character":0,"end_line":559,"end_character":15},"in_reply_to":"e79434ee_950b9f9c","updated":"2023-06-12 18:46:22.000000000","message":"No, we are catching this exception and not raising it. In any case, I\u0027ll catch any other exception calling the translate method.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"09479a7eb17e9e61543254d708954568c976b233","unresolved":true,"context_lines":[{"line_number":559,"context_line":"        raise e"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":563,"context_line":"def get_ip_addresses(**kwargs):"},{"line_number":564,"context_line":"    \"\"\"List of IP addresses in a namespace"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    :return: (tuple) IP addresses in a namespace"},{"line_number":567,"context_line":"    \"\"\""},{"line_number":568,"context_line":"    with iproute.IPRoute() as ip:"},{"line_number":569,"context_line":"        return make_serializable(ip.get_addr(**kwargs))"}],"source_content_type":"text/x-python","patch_set":15,"id":"9fbfbb60_3f272907","line":569,"range":{"start_line":562,"start_character":0,"end_line":569,"end_character":55},"updated":"2023-06-12 09:45:23.000000000","message":"should this be here in the privileged linux_net or in the utils/linux_net instead?","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        raise e"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"},{"line_number":563,"context_line":"def get_ip_addresses(**kwargs):"},{"line_number":564,"context_line":"    \"\"\"List of IP addresses in a namespace"},{"line_number":565,"context_line":""},{"line_number":566,"context_line":"    :return: (tuple) IP addresses in a namespace"},{"line_number":567,"context_line":"    \"\"\""},{"line_number":568,"context_line":"    with iproute.IPRoute() as ip:"},{"line_number":569,"context_line":"        return make_serializable(ip.get_addr(**kwargs))"}],"source_content_type":"text/x-python","patch_set":15,"id":"15ee4f06_a56b3bd7","line":569,"range":{"start_line":562,"start_character":0,"end_line":569,"end_character":55},"in_reply_to":"9fbfbb60_3f272907","updated":"2023-06-12 18:46:22.000000000","message":"That is under the privsep decorator, it needs to be under the \"privileged\" directory.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"60814bd56ca40111cedfdedc79cd8fd992a92221","unresolved":true,"context_lines":[{"line_number":176,"context_line":"            LOG.debug(\"Route already deleted: {}\".format(route))"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def ensure_vlan_device_for_network(bridge, vlan_tag):"},{"line_number":180,"context_line":"    vlan_device_name \u003d \u0027{}.{}\u0027.format(bridge, vlan_tag)"},{"line_number":181,"context_line":"    try:"},{"line_number":182,"context_line":"        set_device_state(vlan_device_name, constants.LINK_UP)"},{"line_number":183,"context_line":"    except NetworkInterfaceNotFound:"},{"line_number":184,"context_line":"        create_interface(vlan_device_name, \u0027vlan\u0027,"},{"line_number":185,"context_line":"                         physical_interface\u003dbridge,"},{"line_number":186,"context_line":"                         vlan_id\u003dvlan_tag)"},{"line_number":187,"context_line":"        set_device_state(vlan_device_name, constants.LINK_UP)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":19,"id":"a17d8115_04167691","line":187,"range":{"start_line":179,"start_character":0,"end_line":187,"end_character":61},"updated":"2023-06-13 06:43:30.000000000","message":"perhaps do the saame as with the other ensure_X, so that all of them are together. Also, can we set it up on the create too","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"f08b9437cfde8b73ed46ab16f8c602f0b1efbd58","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.debug(\"Route already deleted: {}\".format(route))"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def ensure_vlan_device_for_network(bridge, vlan_tag):"},{"line_number":180,"context_line":"    vlan_device_name \u003d \u0027{}.{}\u0027.format(bridge, vlan_tag)"},{"line_number":181,"context_line":"    try:"},{"line_number":182,"context_line":"        set_device_state(vlan_device_name, constants.LINK_UP)"},{"line_number":183,"context_line":"    except NetworkInterfaceNotFound:"},{"line_number":184,"context_line":"        create_interface(vlan_device_name, \u0027vlan\u0027,"},{"line_number":185,"context_line":"                         physical_interface\u003dbridge,"},{"line_number":186,"context_line":"                         vlan_id\u003dvlan_tag)"},{"line_number":187,"context_line":"        set_device_state(vlan_device_name, constants.LINK_UP)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"@ovn_bgp_agent.privileged.default.entrypoint"}],"source_content_type":"text/x-python","patch_set":19,"id":"be806ff6_e4eb219b","line":187,"range":{"start_line":179,"start_character":0,"end_line":187,"end_character":61},"in_reply_to":"a17d8115_04167691","updated":"2023-06-13 12:54:45.000000000","message":"Done","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"60814bd56ca40111cedfdedc79cd8fd992a92221","unresolved":true,"context_lines":[{"line_number":539,"context_line":"                          address\u003daddress,"},{"line_number":540,"context_line":"                          mask\u003dprefixlen,"},{"line_number":541,"context_line":"                          family\u003dfamily)"},{"line_number":542,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":543,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":544,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":545,"context_line":"        raise"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"4260a81b_b5bd3927","line":544,"range":{"start_line":542,"start_character":0,"end_line":544,"end_character":67},"updated":"2023-06-13 06:43:30.000000000","message":"Sorry, I don\u0027t get this.\n\nI see the _run_iproute_addr is internally catching \"except netlink_exceptions.NetlinkError as e\", and then, if \"e.code \u003d\u003d errno.EEXIST\" it raises InterfaceAlreadyExists. \n\nThat means that \"e.code \u003d errno.EEXIST\" cannot be catch in here as we will get aInterfaceAlreadyExist exception here instead. Or what am I missing?","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"cd3bc5cd2a64f418fb491df9ec80fcecf8eff227","unresolved":true,"context_lines":[{"line_number":539,"context_line":"                          address\u003daddress,"},{"line_number":540,"context_line":"                          mask\u003dprefixlen,"},{"line_number":541,"context_line":"                          family\u003dfamily)"},{"line_number":542,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":543,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":544,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":545,"context_line":"        raise"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5446831e_e9a2a7e6","line":544,"range":{"start_line":542,"start_character":0,"end_line":544,"end_character":67},"in_reply_to":"234476c7_0ea2b255","updated":"2023-06-13 10:44:13.000000000","message":"ok, this should translate the exception from InterfaceAlreadyExists to IPAddressAlreadyExists, and then it needs to be modified in utils/linux_net.py (add_ips_to_dev) so that the exception is catch in there instead","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"f3fa677e6beab3a75d6c5d5a20089ce2832a9dbf","unresolved":true,"context_lines":[{"line_number":539,"context_line":"                          address\u003daddress,"},{"line_number":540,"context_line":"                          mask\u003dprefixlen,"},{"line_number":541,"context_line":"                          family\u003dfamily)"},{"line_number":542,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":543,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":544,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":545,"context_line":"        raise"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"7541ed2d_1a8541af","line":544,"range":{"start_line":542,"start_character":0,"end_line":544,"end_character":67},"in_reply_to":"4260a81b_b5bd3927","updated":"2023-06-13 07:54:20.000000000","message":"testing this, seems this is indeed wrong and it throws the next:\n\n2023-06-13T07:43:10.811259399+00:00 stdout F Traceback (most recent call last):\n2023-06-13T07:43:10.811259399+00:00 stdout F   File \"/usr/lib/python3.9/site-packages/oslo_privsep/daemon.py\", line 487, in _process_cmd                                                                                                     \n2023-06-13T07:43:10.811259399+00:00 stdout F     ret \u003d func(*f_args, **f_kwargs)\n2023-06-13T07:43:10.811259399+00:00 stdout F   File \"/usr/lib/python3.9/site-packages/oslo_privsep/priv_context.py\", line 255, in _wrap                                                                                                      \n2023-06-13T07:43:10.811259399+00:00 stdout F     return func(*args, **kwargs)\n2023-06-13T07:43:10.811259399+00:00 stdout F   File \"/usr/lib/python3.9/site-packages/ovn_bgp_agent/privileged/linux_net.py\", line 528, in add_ip_address                                                                                    \n2023-06-13T07:43:10.811259399+00:00 stdout F     _run_iproute_addr(\u0027add\u0027,\n2023-06-13T07:43:10.811259399+00:00 stdout F   File \"/usr/lib/python3.9/site-packages/ovn_bgp_agent/privileged/linux_net.py\", line 477, in _run_iproute_addr                                                                                 \n2023-06-13T07:43:10.811259399+00:00 stdout F     _translate_ip_device_exception(e, device)\n2023-06-13T07:43:10.811259399+00:00 stdout F   File \"/usr/lib/python3.9/site-packages/ovn_bgp_agent/privileged/linux_net.py\", line 362, in _translate_ip_device_exception                                                                    \n2023-06-13T07:43:10.811259399+00:00 stdout F     raise InterfaceAlreadyExists(device\u003ddevice)\n2023-06-13T07:43:10.811259399+00:00 stdout F ovn_bgp_agent.privileged.linux_net.InterfaceAlreadyExists: Interface br-ex already exists","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"f08b9437cfde8b73ed46ab16f8c602f0b1efbd58","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                          address\u003daddress,"},{"line_number":540,"context_line":"                          mask\u003dprefixlen,"},{"line_number":541,"context_line":"                          family\u003dfamily)"},{"line_number":542,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":543,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":544,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":545,"context_line":"        raise"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"2e4fdc8e_6d27c81f","line":544,"range":{"start_line":542,"start_character":0,"end_line":544,"end_character":67},"in_reply_to":"5446831e_e9a2a7e6","updated":"2023-06-13 12:54:45.000000000","message":"Done","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"3b821c98dcdc2bb9901cdeca4302477f74f0d3c2","unresolved":true,"context_lines":[{"line_number":539,"context_line":"                          address\u003daddress,"},{"line_number":540,"context_line":"                          mask\u003dprefixlen,"},{"line_number":541,"context_line":"                          family\u003dfamily)"},{"line_number":542,"context_line":"    except netlink_exceptions.NetlinkError as e:"},{"line_number":543,"context_line":"        if e.code \u003d\u003d errno.EEXIST:"},{"line_number":544,"context_line":"            raise IpAddressAlreadyExists(ip\u003daddress, device\u003difname)"},{"line_number":545,"context_line":"        raise"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"234476c7_0ea2b255","line":544,"range":{"start_line":542,"start_character":0,"end_line":544,"end_character":67},"in_reply_to":"7541ed2d_1a8541af","updated":"2023-06-13 08:02:34.000000000","message":"and to add another point here, if the IP is already there, this should not fail (same as in the delete if it is not there)","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"29ee8cc3bc445870605377be101872e78d78e980","unresolved":true,"context_lines":[{"line_number":40,"context_line":"_IP_VERSION_FAMILY_MAP \u003d {4: socket.AF_INET, 6: socket.AF_INET6}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class NetworkInterfaceNotFound(RuntimeError):"},{"line_number":44,"context_line":"    message \u003d \u0027Network interface %(device)s not found\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":47,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":48,"context_line":"        super(NetworkInterfaceNotFound, self).__init__(message)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class InterfaceAlreadyExists(RuntimeError):"},{"line_number":52,"context_line":"    message \u003d \"Interface %(device)s already exists.\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":55,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":56,"context_line":"        super(InterfaceAlreadyExists, self).__init__(message)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"class InterfaceOperationNotSupported(RuntimeError):"},{"line_number":60,"context_line":"    message \u003d \"Operation not supported on interface %(device)s.\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":63,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":64,"context_line":"        super(InterfaceOperationNotSupported, self).__init__(message)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class InvalidArgument(RuntimeError):"},{"line_number":68,"context_line":"    message \u003d \"Invalid parameter/value used on interface %(device)s.\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def __init__(self, message\u003dNone, device\u003dNone):"},{"line_number":71,"context_line":"        message \u003d message or self.message % {\u0027device\u0027: device}"},{"line_number":72,"context_line":"        super(InvalidArgument, self).__init__(message)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def set_device_state(device, state):"}],"source_content_type":"text/x-python","patch_set":25,"id":"6902a09b_4b742c17","line":72,"range":{"start_line":43,"start_character":0,"end_line":72,"end_character":1},"updated":"2023-06-19 08:54:20.000000000","message":"Why is IpAddressAlreadyExists() exception in the exceptions.py module and these ones here ? Cause even the IpAddressAlreadyExists inherits from RuntimeError instead of Agent specific. So I don\u0027t see the difference ?","commit_id":"1cbfe7823ccd1e6104529f832cddbf3f9b159eff"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"29ee8cc3bc445870605377be101872e78d78e980","unresolved":true,"context_lines":[{"line_number":457,"context_line":"        if raise_exception:"},{"line_number":458,"context_line":"            raise NetworkInterfaceNotFound(device\u003difname)"},{"line_number":459,"context_line":"        LOG.debug(\u0027Interface %(dev)s not found\u0027, {\u0027dev\u0027: ifname})"},{"line_number":460,"context_line":"        return None"},{"line_number":461,"context_line":"    return link_id[0]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"613458d7_dbdbab27","line":460,"range":{"start_line":460,"start_character":8,"end_line":460,"end_character":19},"updated":"2023-06-19 08:54:20.000000000","message":"nit: return (None is implicit)","commit_id":"1cbfe7823ccd1e6104529f832cddbf3f9b159eff"}],"ovn_bgp_agent/tests/functional/privileged/test_linux_net.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4db20ec4302d3c1733ae691fab44c01ec227b305","unresolved":true,"context_lines":[{"line_number":291,"context_line":"            self.assertEqual(master_info[\u0027index\u0027], device_info[\u0027master\u0027])"},{"line_number":292,"context_line":"            self.assertEqual(\u0027vrf\u0027, device_info[\u0027slave_kind\u0027])"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def test_set_master_for_device_bridge(self):"},{"line_number":295,"context_line":"        vrf_table \u003d random.randint(10, 2000)"},{"line_number":296,"context_line":"        linux_net.create_interface(self.dev_name, \u0027vrf\u0027, vrf_table\u003dvrf_table)"},{"line_number":297,"context_line":"        linux_net.create_interface(self.dev_name2, \u0027bridge\u0027, br_stp_state\u003d0)"}],"source_content_type":"text/x-python","patch_set":15,"id":"8fa2dfb3_407a5e11","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":42},"updated":"2023-06-12 06:41:35.000000000","message":"as the main case for BGP driver is set master (VRF) for dummy device, worth to add it here too as an extra case","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            self.assertEqual(master_info[\u0027index\u0027], device_info[\u0027master\u0027])"},{"line_number":292,"context_line":"            self.assertEqual(\u0027vrf\u0027, device_info[\u0027slave_kind\u0027])"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"    def test_set_master_for_device_bridge(self):"},{"line_number":295,"context_line":"        vrf_table \u003d random.randint(10, 2000)"},{"line_number":296,"context_line":"        linux_net.create_interface(self.dev_name, \u0027vrf\u0027, vrf_table\u003dvrf_table)"},{"line_number":297,"context_line":"        linux_net.create_interface(self.dev_name2, \u0027bridge\u0027, br_stp_state\u003d0)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5dd21191_f2cecbb2","line":294,"range":{"start_line":294,"start_character":0,"end_line":294,"end_character":42},"in_reply_to":"8fa2dfb3_407a5e11","updated":"2023-06-12 18:46:22.000000000","message":"We are not calling this method in the code against a dummy interface, but I\u0027ll add this method.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4db20ec4302d3c1733ae691fab44c01ec227b305","unresolved":true,"context_lines":[{"line_number":334,"context_line":"            device \u003d self._get_device(vlan_device_name)"},{"line_number":335,"context_line":"            self.assertEqual(constants.LINK_UP, device[\u0027state\u0027])"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def test_ensure_vrf(self):"},{"line_number":338,"context_line":"        vrf_table \u003d random.randint(10, 2000)"},{"line_number":339,"context_line":"        # Ensure the method call is idempotent."},{"line_number":340,"context_line":"        for _ in range(2):"}],"source_content_type":"text/x-python","patch_set":15,"id":"8a804026_2076ffc0","line":337,"range":{"start_line":337,"start_character":0,"end_line":337,"end_character":24},"updated":"2023-06-12 06:41:35.000000000","message":"same here, add test_ensure_dummy_device","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            device \u003d self._get_device(vlan_device_name)"},{"line_number":335,"context_line":"            self.assertEqual(constants.LINK_UP, device[\u0027state\u0027])"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def test_ensure_vrf(self):"},{"line_number":338,"context_line":"        vrf_table \u003d random.randint(10, 2000)"},{"line_number":339,"context_line":"        # Ensure the method call is idempotent."},{"line_number":340,"context_line":"        for _ in range(2):"}],"source_content_type":"text/x-python","patch_set":15,"id":"42fb9950_1f645cdb","line":337,"range":{"start_line":337,"start_character":0,"end_line":337,"end_character":24},"in_reply_to":"8a804026_2076ffc0","updated":"2023-06-12 18:46:22.000000000","message":"We don\u0027t have a ensure_dummy_device method.\n\nCORRECTION: we do have it but after \"set_master_for_device\". I\u0027ve reordered the methods to have all \"ensure_*\" in one section. Thanks!!","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"13238560c43ce5a06ad76fd055c7539a7b3e7b8b","unresolved":true,"context_lines":[{"line_number":243,"context_line":"        self.assertEqual(vrf_table, device[\u0027vrf_table\u0027])"},{"line_number":244,"context_line":"        self._check_status(self.dev_name)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def test_add_and_delete_ip_address(self):"},{"line_number":247,"context_line":"        def check_ip_address(ip_address, device_name, present\u003dTrue):"},{"line_number":248,"context_line":"            ip_addresses \u003d get_ip_addresses(self.dev_name)"},{"line_number":249,"context_line":"            if l_net.get_ip_version(ip_address) \u003d\u003d constants.IP_VERSION_6:"}],"source_content_type":"text/x-python","patch_set":19,"id":"a50bed2d_1390fc40","line":246,"updated":"2023-06-13 08:10:10.000000000","message":"we should also add coverage for adding an IP that is already there, and deleting an ip that is not there","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"f08b9437cfde8b73ed46ab16f8c602f0b1efbd58","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        self.assertEqual(vrf_table, device[\u0027vrf_table\u0027])"},{"line_number":244,"context_line":"        self._check_status(self.dev_name)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def test_add_and_delete_ip_address(self):"},{"line_number":247,"context_line":"        def check_ip_address(ip_address, device_name, present\u003dTrue):"},{"line_number":248,"context_line":"            ip_addresses \u003d get_ip_addresses(self.dev_name)"},{"line_number":249,"context_line":"            if l_net.get_ip_version(ip_address) \u003d\u003d constants.IP_VERSION_6:"}],"source_content_type":"text/x-python","patch_set":19,"id":"4eecfebb_36e71273","line":246,"in_reply_to":"a50bed2d_1390fc40","updated":"2023-06-13 12:54:45.000000000","message":"Done","commit_id":"f47b8ee88f93299191aaf656d2d7428b5b88adc6"}],"tox.ini":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4db20ec4302d3c1733ae691fab44c01ec227b305","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    VIRTUAL_ENV\u003d{envdir}"},{"line_number":41,"context_line":"    PYTHON\u003dcoverage run --source ovn_bgp_agent --parallel-mode"},{"line_number":42,"context_line":"commands \u003d"},{"line_number":43,"context_line":"    stestr run --exclude-regex \".tests.functional\" {posargs}"},{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"}],"source_content_type":"text/x-properties","patch_set":15,"id":"8f0821e6_773cae1a","line":43,"range":{"start_line":43,"start_character":11,"end_line":43,"end_character":60},"updated":"2023-06-12 06:41:35.000000000","message":"the gate is green but I don\u0027t see the cover results, so, something is broken here","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    VIRTUAL_ENV\u003d{envdir}"},{"line_number":41,"context_line":"    PYTHON\u003dcoverage run --source ovn_bgp_agent --parallel-mode"},{"line_number":42,"context_line":"commands \u003d"},{"line_number":43,"context_line":"    stestr run --exclude-regex \".tests.functional\" {posargs}"},{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"}],"source_content_type":"text/x-properties","patch_set":15,"id":"d02c4766_5c55bd67","line":43,"range":{"start_line":43,"start_character":11,"end_line":43,"end_character":60},"in_reply_to":"8f0821e6_773cae1a","updated":"2023-06-12 18:46:22.000000000","message":"Restored.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4db20ec4302d3c1733ae691fab44c01ec227b305","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"},{"line_number":47,"context_line":"    coverage report --fail-under\u003d80 --skip-covered --omit\u003d\u0027*tests*\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[testenv:docs]"},{"line_number":50,"context_line":"deps \u003d -r{toxinidir}/doc/requirements.txt"}],"source_content_type":"text/x-properties","patch_set":15,"id":"44856f42_d0b69b4f","line":47,"range":{"start_line":47,"start_character":33,"end_line":47,"end_character":37},"updated":"2023-06-12 06:41:35.000000000","message":"if we are ommiting the functional files, I don\u0027t think we should reduce the cover here. Currently it seems it is 88% but is reporting some of the functions test files","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9e41156cbafd56abdb9cdeb0a12207231b6e342c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"},{"line_number":47,"context_line":"    coverage report --fail-under\u003d80 --skip-covered --omit\u003d\u0027*tests*\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[testenv:docs]"},{"line_number":50,"context_line":"deps \u003d -r{toxinidir}/doc/requirements.txt"}],"source_content_type":"text/x-properties","patch_set":15,"id":"4eabd23b_0a095776","line":47,"range":{"start_line":47,"start_character":33,"end_line":47,"end_character":37},"in_reply_to":"44856f42_d0b69b4f","updated":"2023-06-12 18:46:22.000000000","message":"I\u0027ve set it to 88. We can investigate this later.\n\nIn Neutron, for example, this value is 82.","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"60814bd56ca40111cedfdedc79cd8fd992a92221","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"},{"line_number":47,"context_line":"    coverage report --fail-under\u003d80 --skip-covered --omit\u003d\u0027*tests*\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[testenv:docs]"},{"line_number":50,"context_line":"deps \u003d -r{toxinidir}/doc/requirements.txt"}],"source_content_type":"text/x-properties","patch_set":15,"id":"b2b7bb6f_54c4e263","line":47,"range":{"start_line":47,"start_character":33,"end_line":47,"end_character":37},"in_reply_to":"4eabd23b_0a095776","updated":"2023-06-13 06:43:30.000000000","message":"probably you forgot to commit the changes here (raise to 88, still on 80)","commit_id":"203117ef8d196d10a6519ac88148caa0ff8d5435"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1adc4ac7628022e13052f62a217b03a696b639a0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"},{"line_number":47,"context_line":"    coverage report --fail-under\u003d88 --skip-covered --omit\u003d\u0027*tests*\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[testenv:docs]"},{"line_number":50,"context_line":"deps \u003d -r{toxinidir}/doc/requirements.txt"}],"source_content_type":"text/x-properties","patch_set":18,"id":"81bb38ce_996cf3dc","line":47,"range":{"start_line":47,"start_character":21,"end_line":47,"end_character":35},"updated":"2023-06-12 21:48:03.000000000","message":"I can\u0027t execute the functional tests in the \"cover\" env. I need to investigate that but after this series of patches.","commit_id":"3fd7217870af97a4215840bc62d7dcc3077d6564"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"29ee8cc3bc445870605377be101872e78d78e980","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    coverage combine"},{"line_number":45,"context_line":"    coverage html -d cover --omit\u003d\u0027*tests*\u0027"},{"line_number":46,"context_line":"    coverage xml -o cover/coverage.xml --omit\u003d\u0027*tests*\u0027"},{"line_number":47,"context_line":"    coverage report --fail-under\u003d85 --skip-covered --omit\u003d\u0027*tests*\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"[testenv:docs]"},{"line_number":50,"context_line":"deps \u003d -r{toxinidir}/doc/requirements.txt"}],"source_content_type":"text/x-properties","patch_set":25,"id":"3edb3e99_4d0ad834","line":47,"updated":"2023-06-19 08:54:20.000000000","message":":-(","commit_id":"1cbfe7823ccd1e6104529f832cddbf3f9b159eff"}]}
