)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"06b06c074aa0e112c669e64f4518f2c08f145c30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"604a2c43_118e95fa","updated":"2021-10-12 07:56:21.000000000","message":"\u003e Patch Set 25:\n\u003e \n\u003e \u003e Patch Set 25: Code-Review-1\n\u003e \u003e \n\u003e \u003e Please check CI jobs\u0027 results. I think that failures there can be related to that patch.\n\u003e \n\u003e Thanks for your review, but the error in CI jobs\u0027 results is socket timeout, I re-run the failed test cases in my local environment, and there is no problem, so I think the cause of the error is not the patch but the CI environment.\n\nrecheck\n\nLet\u0027s see if it will be ok in next run then 😊","commit_id":"c81d2175b53d05af2f4b250c8b0c9f372dc0e494"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c1ce3ef266f727ae2cf52309df901e37b3c001e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"3a756ec6_fc5d093f","updated":"2021-10-19 07:46:21.000000000","message":"Every time You recheck that patch, same test is failing in same jobs. I really think that it is related to that patch. Please try to reproduce and debug it locally before rechecking. Recheck will not help here :)","commit_id":"c81d2175b53d05af2f4b250c8b0c9f372dc0e494"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"8de4ec2e32b567bae3fc4f335eca70e1504f9c01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"087e69cd_707f99d5","updated":"2021-10-13 06:20:53.000000000","message":"recheck","commit_id":"c81d2175b53d05af2f4b250c8b0c9f372dc0e494"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"a9462074e2cca3ea6048143f3ad7c45689f98a9e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"f354a8c8_b23a2e2a","updated":"2021-10-13 01:35:43.000000000","message":"recheck","commit_id":"c81d2175b53d05af2f4b250c8b0c9f372dc0e494"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"283e96a23e101fadfcc46f2b0d0c4a30a35b7c39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"f4664440_074dac64","updated":"2021-10-14 07:15:51.000000000","message":"recheck","commit_id":"c81d2175b53d05af2f4b250c8b0c9f372dc0e494"}],"doc/source/admin/ovn/features.rst":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":99,"context_line":"+----------------------------------+---------------------------+"},{"line_number":100,"context_line":"| Quality of Service               | qos                       |"},{"line_number":101,"context_line":"+----------------------------------+---------------------------+"},{"line_number":102,"context_line":"| QoS of Floating IP               | qos-fip                   |"},{"line_number":103,"context_line":"+----------------------------------+---------------------------+"},{"line_number":104,"context_line":"| QoS of Router Gateway IP         | qos-gateway-ip            |"},{"line_number":105,"context_line":"+----------------------------------+---------------------------+"}],"source_content_type":"text/x-rst","patch_set":19,"id":"9a420a43_73542999","line":102,"range":{"start_line":102,"start_character":37,"end_line":102,"end_character":45},"updated":"2021-03-23 11:02:26.000000000","message":"+1 thanks for this one (I missed it)","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":114,"context_line":"+----------------------------------+---------------------------+"},{"line_number":115,"context_line":"| Quality of Service               | qos                       |"},{"line_number":116,"context_line":"+----------------------------------+---------------------------+"},{"line_number":117,"context_line":"| QoS of Floating IP               | qos-fip                   |"},{"line_number":118,"context_line":"+----------------------------------+---------------------------+"},{"line_number":119,"context_line":"| QoS of Router Gateway IP         | qos-gateway-ip            |"},{"line_number":120,"context_line":"+----------------------------------+---------------------------+"},{"line_number":121,"context_line":"| Quota management support         | quotas                    |"},{"line_number":122,"context_line":"+----------------------------------+---------------------------+"}],"source_content_type":"text/x-rst","patch_set":22,"id":"1f9f8649_ff89a54f","line":119,"range":{"start_line":117,"start_character":2,"end_line":119,"end_character":53},"updated":"2021-07-28 13:12:00.000000000","message":"Please, change only those extensions related to this patch/bug.\n\nIf needed, push another patch to change the whole list here.","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":114,"context_line":"+----------------------------------+---------------------------+"},{"line_number":115,"context_line":"| Quality of Service               | qos                       |"},{"line_number":116,"context_line":"+----------------------------------+---------------------------+"},{"line_number":117,"context_line":"| QoS of Floating IP               | qos-fip                   |"},{"line_number":118,"context_line":"+----------------------------------+---------------------------+"},{"line_number":119,"context_line":"| QoS of Router Gateway IP         | qos-gateway-ip            |"},{"line_number":120,"context_line":"+----------------------------------+---------------------------+"},{"line_number":121,"context_line":"| Quota management support         | quotas                    |"},{"line_number":122,"context_line":"+----------------------------------+---------------------------+"}],"source_content_type":"text/x-rst","patch_set":22,"id":"3804e2b7_940e2ba5","line":119,"range":{"start_line":117,"start_character":2,"end_line":119,"end_character":53},"in_reply_to":"1f9f8649_ff89a54f","updated":"2021-07-29 03:12:57.000000000","message":"ok, i remove it next patch","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f30886016e961fe86e96cd211306abc85b50baa5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"+----------------------------------+---------------------------+"},{"line_number":115,"context_line":"| Quality of Service               | qos                       |"},{"line_number":116,"context_line":"+----------------------------------+---------------------------+"},{"line_number":117,"context_line":"| QoS of Floating IP               | qos-fip                   |"},{"line_number":118,"context_line":"+----------------------------------+---------------------------+"},{"line_number":119,"context_line":"| QoS of Router Gateway IP         | qos-gateway-ip            |"},{"line_number":120,"context_line":"+----------------------------------+---------------------------+"},{"line_number":121,"context_line":"| Quota management support         | quotas                    |"},{"line_number":122,"context_line":"+----------------------------------+---------------------------+"}],"source_content_type":"text/x-rst","patch_set":22,"id":"47e10986_2273510b","line":119,"range":{"start_line":117,"start_character":2,"end_line":119,"end_character":53},"in_reply_to":"3804e2b7_940e2ba5","updated":"2021-07-29 11:34:23.000000000","message":"What I was saying is that you need to modify ONLY those extensions related to this patch.","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"1eed85c6ba25d14d118044ecdcf4973b34c2adff","unresolved":false,"context_lines":[{"line_number":114,"context_line":"+----------------------------------+---------------------------+"},{"line_number":115,"context_line":"| Quality of Service               | qos                       |"},{"line_number":116,"context_line":"+----------------------------------+---------------------------+"},{"line_number":117,"context_line":"| QoS of Floating IP               | qos-fip                   |"},{"line_number":118,"context_line":"+----------------------------------+---------------------------+"},{"line_number":119,"context_line":"| QoS of Router Gateway IP         | qos-gateway-ip            |"},{"line_number":120,"context_line":"+----------------------------------+---------------------------+"},{"line_number":121,"context_line":"| Quota management support         | quotas                    |"},{"line_number":122,"context_line":"+----------------------------------+---------------------------+"}],"source_content_type":"text/x-rst","patch_set":22,"id":"0c7e93cb_cd26304a","line":119,"range":{"start_line":117,"start_character":2,"end_line":119,"end_character":53},"in_reply_to":"47e10986_2273510b","updated":"2021-07-29 12:27:39.000000000","message":"ok","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"}],"neutron/common/ovn/extensions.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    fip_port_details.ALIAS,"},{"line_number":68,"context_line":"    pagination.ALIAS,"},{"line_number":69,"context_line":"    \u0027qos-fip\u0027,"},{"line_number":70,"context_line":"    qos_gateway_ip.ALIAS,"},{"line_number":71,"context_line":"    sorting.ALIAS,"},{"line_number":72,"context_line":"    project_id.ALIAS,"},{"line_number":73,"context_line":"    dns.ALIAS,"}],"source_content_type":"text/x-python","patch_set":13,"id":"53c1caa8_fd126195","line":70,"updated":"2021-01-08 09:46:21.000000000","message":"please also update list in the docs. It\u0027s in doc/source/admin/ovn/features.rst","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"9564d0b0c9c3ca692ba800abdecd9441f55850c2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    fip_port_details.ALIAS,"},{"line_number":68,"context_line":"    pagination.ALIAS,"},{"line_number":69,"context_line":"    \u0027qos-fip\u0027,"},{"line_number":70,"context_line":"    qos_gateway_ip.ALIAS,"},{"line_number":71,"context_line":"    sorting.ALIAS,"},{"line_number":72,"context_line":"    project_id.ALIAS,"},{"line_number":73,"context_line":"    dns.ALIAS,"}],"source_content_type":"text/x-python","patch_set":13,"id":"65e06d58_e898e274","line":70,"in_reply_to":"53c1caa8_fd126195","updated":"2021-01-12 05:36:03.000000000","message":"Done","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/extensions/qos.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8318b4b960060abb43074e961887c1e0ed91d0ad","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.objects.qos import rule as qos_rule"},{"line_number":20,"context_line":"from neutron_lib import constants"},{"line_number":21,"context_line":"from neutron_lib import context as n_context"},{"line_number":22,"context_line":"from neutron_lib.api.definitions import l3"},{"line_number":23,"context_line":"from neutron_lib.plugins import constants as plugins_const"},{"line_number":24,"context_line":"from neutron_lib.plugins import directory"},{"line_number":25,"context_line":"from neutron_lib.services.qos import constants as qos_consts"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_ad5215dd","line":22,"updated":"2020-08-31 12:14:33.000000000","message":"pep8: H306: imports not in alphabetical order (neutron_lib.context, neutron_lib.api.definitions.l3)","commit_id":"e9f78c3a374aba0ef1ebe5f1e4d1f6d4f44e2192"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"a342675eb3d929cc55124f4a9d2458663420bf93","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        :param delete: (bool) defines if this rule if going to be a partial"},{"line_number":135,"context_line":"                       one (without any bandwidth or DSCP information) to be"},{"line_number":136,"context_line":"                       used only as deletion rule."},{"line_number":137,"context_line":"        :param is_gw_port: (bool) Define if a port is a router gateway port."},{"line_number":138,"context_line":"        :return: (dict) OVN QoS rule register to be used with QoSAddCommand"},{"line_number":139,"context_line":"                 and QoSDelCommand."},{"line_number":140,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_ad387ed2","line":137,"range":{"start_line":137,"start_character":34,"end_line":137,"end_character":40},"updated":"2020-11-17 13:45:46.000000000","message":"super nit: s/defines just because it is used in the previous sentence but you can ignore this as well :)","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"5626df2412e84c77c8b0c89beab5f48097f62fde","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        :param delete: (bool) defines if this rule if going to be a partial"},{"line_number":135,"context_line":"                       one (without any bandwidth or DSCP information) to be"},{"line_number":136,"context_line":"                       used only as deletion rule."},{"line_number":137,"context_line":"        :param is_gw_port: (bool) Define if a port is a router gateway port."},{"line_number":138,"context_line":"        :return: (dict) OVN QoS rule register to be used with QoSAddCommand"},{"line_number":139,"context_line":"                 and QoSDelCommand."},{"line_number":140,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_272be282","line":137,"range":{"start_line":137,"start_character":34,"end_line":137,"end_character":40},"in_reply_to":"1f621f24_ad387ed2","updated":"2020-11-18 03:02:19.000000000","message":"Done","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bce3ce943f5e7162af1d008ed0523355f9a1c4f0","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        self.delete_floatingip(txn, floatingip)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_router(self, txn, router):"},{"line_number":312,"context_line":"        router_id \u003d router.get(\u0027id\u0027)"},{"line_number":313,"context_line":"        gw_port_id \u003d router.get(\u0027gw_port_id\u0027)"},{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"47154c49_ac14c379","line":312,"updated":"2020-11-30 10:08:09.000000000","message":"Router has always id, right? Why is there a get() ?","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        self.delete_floatingip(txn, floatingip)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_router(self, txn, router):"},{"line_number":312,"context_line":"        router_id \u003d router.get(\u0027id\u0027)"},{"line_number":313,"context_line":"        gw_port_id \u003d router.get(\u0027gw_port_id\u0027)"},{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9938b602_7ad7807a","line":312,"in_reply_to":"47154c49_ac14c379","updated":"2020-11-30 12:56:58.000000000","message":"+1","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.delete_floatingip(txn, floatingip)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_router(self, txn, router):"},{"line_number":312,"context_line":"        router_id \u003d router.get(\u0027id\u0027)"},{"line_number":313,"context_line":"        gw_port_id \u003d router.get(\u0027gw_port_id\u0027)"},{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"73ed4e80_37d6d0e2","line":312,"in_reply_to":"9938b602_7ad7807a","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bce3ce943f5e7162af1d008ed0523355f9a1c4f0","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"},{"line_number":316,"context_line":"                         if gateway_info else None)"},{"line_number":317,"context_line":"        fixed_ips \u003d gateway_info.get(\u0027external_fixed_ips\u0027)"},{"line_number":318,"context_line":"        if gateway_info[\u0027network_id\u0027]:"},{"line_number":319,"context_line":"            lswitch_name \u003d utils.ovn_name(gateway_info[\u0027network_id\u0027])"},{"line_number":320,"context_line":"            txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":321,"context_line":"                lswitch_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7dc78deb_bc73541c","line":318,"range":{"start_line":317,"start_character":0,"end_line":318,"end_character":38},"updated":"2020-11-30 10:08:09.000000000","message":"Based on L314, the gateway_info can be None and this two lines will raise an AttributeError and produce a traceback in the logs. We should handle such error.","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"},{"line_number":316,"context_line":"                         if gateway_info else None)"},{"line_number":317,"context_line":"        fixed_ips \u003d gateway_info.get(\u0027external_fixed_ips\u0027)"},{"line_number":318,"context_line":"        if gateway_info[\u0027network_id\u0027]:"},{"line_number":319,"context_line":"            lswitch_name \u003d utils.ovn_name(gateway_info[\u0027network_id\u0027])"},{"line_number":320,"context_line":"            txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":321,"context_line":"                lswitch_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"aac18881_d04db24d","line":318,"range":{"start_line":317,"start_character":0,"end_line":318,"end_character":38},"in_reply_to":"7dc78deb_bc73541c","updated":"2020-11-30 12:56:58.000000000","message":"+1","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"},{"line_number":316,"context_line":"                         if gateway_info else None)"},{"line_number":317,"context_line":"        fixed_ips \u003d gateway_info.get(\u0027external_fixed_ips\u0027)"},{"line_number":318,"context_line":"        if gateway_info[\u0027network_id\u0027]:"},{"line_number":319,"context_line":"            lswitch_name \u003d utils.ovn_name(gateway_info[\u0027network_id\u0027])"},{"line_number":320,"context_line":"            txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":321,"context_line":"                lswitch_name,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bea5ee98_ce36d488","line":318,"range":{"start_line":317,"start_character":0,"end_line":318,"end_character":38},"in_reply_to":"aac18881_d04db24d","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bce3ce943f5e7162af1d008ed0523355f9a1c4f0","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        self.delete_floatingip(txn, floatingip)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_router(self, txn, router):"},{"line_number":312,"context_line":"        router_id \u003d router.get(\u0027id\u0027)"},{"line_number":313,"context_line":"        gw_port_id \u003d router.get(\u0027gw_port_id\u0027)"},{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"},{"line_number":316,"context_line":"                         if gateway_info else None)"},{"line_number":317,"context_line":"        fixed_ips \u003d gateway_info.get(\u0027external_fixed_ips\u0027)"},{"line_number":318,"context_line":"        if gateway_info[\u0027network_id\u0027]:"},{"line_number":319,"context_line":"            lswitch_name \u003d utils.ovn_name(gateway_info[\u0027network_id\u0027])"},{"line_number":320,"context_line":"            txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":321,"context_line":"                lswitch_name,"},{"line_number":322,"context_line":"                {ovn_const.OVN_GW_PORT_EXT_ID_KEY: gw_port_id}))"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if not (router_id and gw_port_id and qos_policy_id):"},{"line_number":325,"context_line":"            return"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":328,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"83e848e5_37ed8352","line":325,"range":{"start_line":312,"start_character":0,"end_line":325,"end_character":18},"updated":"2020-11-30 10:08:09.000000000","message":"Can it happen that gw_port_id is not None while qos_policy_id is? If not, then this whole code can be restructured to more idiomatic Python using try-except block. e.g.\n\n gw_info \u003d router.get(l3.EXTERNAL_GW_INFO, {})\n try:\n     router_id \u003d router[\u0027id\u0027]\n     gw_port_id \u003d router[\u0027gw_port_id\u0027]\n     qos_policy_id \u003d gw_info[\u0027qos_policy_id\u0027]\n except KeyError:\n     return","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.delete_floatingip(txn, floatingip)"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def update_router(self, txn, router):"},{"line_number":312,"context_line":"        router_id \u003d router.get(\u0027id\u0027)"},{"line_number":313,"context_line":"        gw_port_id \u003d router.get(\u0027gw_port_id\u0027)"},{"line_number":314,"context_line":"        gateway_info \u003d router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":315,"context_line":"        qos_policy_id \u003d (gateway_info.get(\u0027qos_policy_id\u0027)"},{"line_number":316,"context_line":"                         if gateway_info else None)"},{"line_number":317,"context_line":"        fixed_ips \u003d gateway_info.get(\u0027external_fixed_ips\u0027)"},{"line_number":318,"context_line":"        if gateway_info[\u0027network_id\u0027]:"},{"line_number":319,"context_line":"            lswitch_name \u003d utils.ovn_name(gateway_info[\u0027network_id\u0027])"},{"line_number":320,"context_line":"            txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":321,"context_line":"                lswitch_name,"},{"line_number":322,"context_line":"                {ovn_const.OVN_GW_PORT_EXT_ID_KEY: gw_port_id}))"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if not (router_id and gw_port_id and qos_policy_id):"},{"line_number":325,"context_line":"            return"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":328,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"4ec99e4a_96b0d383","line":325,"range":{"start_line":312,"start_character":0,"end_line":325,"end_character":18},"in_reply_to":"83e848e5_37ed8352","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bce3ce943f5e7162af1d008ed0523355f9a1c4f0","unresolved":true,"context_lines":[{"line_number":327,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":328,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"},{"line_number":329,"context_line":"        for direction, rules in qos_rules.items():"},{"line_number":330,"context_line":"            for fixed_ip in fixed_ips:"},{"line_number":331,"context_line":"                ovn_rule \u003d self._ovn_qos_rule("},{"line_number":332,"context_line":"                    direction, rules, gw_port_id,"},{"line_number":333,"context_line":"                    gateway_info[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"f0c51708_5a5aaa3e","line":330,"updated":"2020-11-30 10:08:09.000000000","message":"This raises an error if L317 returns None","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":328,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"},{"line_number":329,"context_line":"        for direction, rules in qos_rules.items():"},{"line_number":330,"context_line":"            for fixed_ip in fixed_ips:"},{"line_number":331,"context_line":"                ovn_rule \u003d self._ovn_qos_rule("},{"line_number":332,"context_line":"                    direction, rules, gw_port_id,"},{"line_number":333,"context_line":"                    gateway_info[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"345f9ad1_30be929e","line":330,"in_reply_to":"f0c51708_5a5aaa3e","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"17568e59cbc4896579b03489f26d06f7bb8f2b33","unresolved":true,"context_lines":[{"line_number":109,"context_line":"        return match"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _ovn_qos_rule(self, rules_direction, rules, port_id, network_id,"},{"line_number":112,"context_line":"                      fip_id\u003dNone, ip_address\u003dNone, router_id\u003dNone,"},{"line_number":113,"context_line":"                      delete\u003dFalse, is_gw_port\u003dFalse):"},{"line_number":114,"context_line":"        \"\"\"Generate an OVN QoS register based on several Neutron QoS rules"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"0379440f_b31fc24c","line":112,"range":{"start_line":112,"start_character":52,"end_line":112,"end_character":67},"updated":"2021-01-05 11:15:53.000000000","message":"Firstly, it is not recommended to add new parameter to the middle of the parameter list, that may cause some refactor work for all related call of this.\n\nHow about use this new router_id to indicate that this is for getting gateway IPs rule? Because floating IP does not need this param.","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":true,"context_lines":[{"line_number":109,"context_line":"        return match"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _ovn_qos_rule(self, rules_direction, rules, port_id, network_id,"},{"line_number":112,"context_line":"                      fip_id\u003dNone, ip_address\u003dNone, router_id\u003dNone,"},{"line_number":113,"context_line":"                      delete\u003dFalse, is_gw_port\u003dFalse):"},{"line_number":114,"context_line":"        \"\"\"Generate an OVN QoS register based on several Neutron QoS rules"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"09081e06_ed47d030","line":112,"range":{"start_line":112,"start_character":52,"end_line":112,"end_character":67},"in_reply_to":"0379440f_b31fc24c","updated":"2021-01-06 05:38:41.000000000","message":"Done,the new parameter \u0027router_id\u0027 has been moved to the end of the method. It is only used to limit the bandwidth of the router external gateway. I mainly consider using ‘is_gw_port’ for better readability and scalability, because the router may not have a gateway port, if you insist on using \u0027router_id\u0027, I can modify it:)","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"17568e59cbc4896579b03489f26d06f7bb8f2b33","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":157,"context_line":"                ovn_const.OVN_FIP_EXT_ID_KEY: fip_id}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if is_gw_port:"},{"line_number":160,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":161,"context_line":"                ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id,"},{"line_number":162,"context_line":"                ovn_const.OVN_NETWORK_ID_EXT_ID_KEY: network_id}"}],"source_content_type":"text/x-python","patch_set":11,"id":"948a45f1_1d3d45f1","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":22},"updated":"2021-01-05 11:15:53.000000000","message":"How about use the new ``router_id`` for this conditon here?","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":157,"context_line":"                ovn_const.OVN_FIP_EXT_ID_KEY: fip_id}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if is_gw_port:"},{"line_number":160,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":161,"context_line":"                ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id,"},{"line_number":162,"context_line":"                ovn_const.OVN_NETWORK_ID_EXT_ID_KEY: network_id}"}],"source_content_type":"text/x-python","patch_set":11,"id":"14516992_e1cd5560","line":159,"range":{"start_line":159,"start_character":8,"end_line":159,"end_character":22},"in_reply_to":"948a45f1_1d3d45f1","updated":"2021-01-06 05:38:41.000000000","message":"Same as above","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":157,"context_line":"                ovn_const.OVN_FIP_EXT_ID_KEY: fip_id}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if is_gw_port:"},{"line_number":160,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":161,"context_line":"                ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id,"},{"line_number":162,"context_line":"                ovn_const.OVN_NETWORK_ID_EXT_ID_KEY: network_id}"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"eed51b45_d413b535","line":160,"updated":"2021-01-08 09:46:21.000000000","message":"shouldn\u0027t You check here if router_id is not None? Or is that ok if is_gw_port\u003dTrue and router_id\u003dNone?","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"f90823491958cc2246b210b847ac076a746b1989","unresolved":true,"context_lines":[{"line_number":157,"context_line":"                ovn_const.OVN_FIP_EXT_ID_KEY: fip_id}"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if is_gw_port:"},{"line_number":160,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":161,"context_line":"                ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id,"},{"line_number":162,"context_line":"                ovn_const.OVN_NETWORK_ID_EXT_ID_KEY: network_id}"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"a4be9213_4d849bcd","line":160,"in_reply_to":"eed51b45_d413b535","updated":"2021-01-12 03:30:30.000000000","message":"If \u0027router_id\u0027 is None, \u0027update_router\u0027 will not enter the \u0027_ovn_qos_rule\u0027 method.","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":318,"context_line":"        router_id \u003d new_router[\u0027id\u0027]"},{"line_number":319,"context_line":"        router_name \u003d utils.ovn_name(router_id)"},{"line_number":320,"context_line":"        ovn_router \u003d self._driver._nb_idl.get_lrouter(router_name)"},{"line_number":321,"context_line":"        gateway_new \u003d new_router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":322,"context_line":"        gateway_old \u003d utils.get_lrouter_ext_gw_static_route(ovn_router)"},{"line_number":323,"context_line":"        if gateway_old and not gateway_new:"},{"line_number":324,"context_line":"            if router_object:"},{"line_number":325,"context_line":"                gw_info \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":326,"context_line":"                gw_info.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"}],"source_content_type":"text/x-python","patch_set":13,"id":"c0bd2435_7757e8a6","line":327,"range":{"start_line":321,"start_character":8,"end_line":327,"end_character":42},"updated":"2021-01-08 09:46:21.000000000","message":"I don\u0027t understand all of that. What is \"new_router\" and \"router_object\"? It seems for me that both are the same type of objects. What is the difference between gateway_new and gw_info? Maybe You should use some better names of the vars here?","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"f90823491958cc2246b210b847ac076a746b1989","unresolved":true,"context_lines":[{"line_number":318,"context_line":"        router_id \u003d new_router[\u0027id\u0027]"},{"line_number":319,"context_line":"        router_name \u003d utils.ovn_name(router_id)"},{"line_number":320,"context_line":"        ovn_router \u003d self._driver._nb_idl.get_lrouter(router_name)"},{"line_number":321,"context_line":"        gateway_new \u003d new_router.get(l3.EXTERNAL_GW_INFO)"},{"line_number":322,"context_line":"        gateway_old \u003d utils.get_lrouter_ext_gw_static_route(ovn_router)"},{"line_number":323,"context_line":"        if gateway_old and not gateway_new:"},{"line_number":324,"context_line":"            if router_object:"},{"line_number":325,"context_line":"                gw_info \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":326,"context_line":"                gw_info.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"}],"source_content_type":"text/x-python","patch_set":13,"id":"53896ffc_c004fbb2","line":327,"range":{"start_line":321,"start_character":8,"end_line":327,"end_character":42},"in_reply_to":"c0bd2435_7757e8a6","updated":"2021-01-12 03:30:30.000000000","message":"\u0027new_router\u0027 is the new router dict, \u0027router_object\u0027 is the old router dict.\n\u0027gateway_new\u0027 is the new router gateway, \u0027gw_info\u0027 is the old router gateway.\nchange \u0027gw_info\u0027 to \u0027gw_object\u0027.\n[1]https://opendev.org/openstack/neutron/src/branch/master/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#L1155-L1235","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                gw_info \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":326,"context_line":"                gw_info.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"4f1d1c18_a1f7c961","line":328,"range":{"start_line":328,"start_character":19,"end_line":328,"end_character":29},"updated":"2021-01-08 09:46:21.000000000","message":"It seems for me that this isn\u0027t \"new\" anymore. Am I correct?","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"f90823491958cc2246b210b847ac076a746b1989","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                gw_info \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":326,"context_line":"                gw_info.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"f52b94ca_ffc7ab9b","line":328,"range":{"start_line":328,"start_character":19,"end_line":328,"end_character":29},"in_reply_to":"4f1d1c18_a1f7c961","updated":"2021-01-12 03:30:30.000000000","message":"yes,it should be \u0027router_object\u0027.","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":333,"context_line":"        router, router_object \u003d self._check_gateway_removed("}],"source_content_type":"text/x-python","patch_set":13,"id":"bb7b4d6f_939103c0","line":330,"updated":"2021-01-08 09:46:21.000000000","message":"and in this case You simply return what You get as parameters. Why is that needed?","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"f90823491958cc2246b210b847ac076a746b1989","unresolved":true,"context_lines":[{"line_number":327,"context_line":"                new_router \u003d router_object"},{"line_number":328,"context_line":"            return new_router, None"},{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":333,"context_line":"        router, router_object \u003d self._check_gateway_removed("}],"source_content_type":"text/x-python","patch_set":13,"id":"5c88fe0c_33cf4f77","line":330,"in_reply_to":"bb7b4d6f_939103c0","updated":"2021-01-12 03:30:30.000000000","message":"In the following cases, \u0027new_router\u0027 and \u0027router_object\u0027 should be returned.\n*** gateway_new and gateway_old\n*** gateway_new and not gateway_old","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":333,"context_line":"        router, router_object \u003d self._check_gateway_removed("},{"line_number":334,"context_line":"            router, router_object)"},{"line_number":335,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"fba38c68_3a50609c","line":332,"range":{"start_line":332,"start_character":33,"end_line":332,"end_character":55},"updated":"2021-01-08 09:46:21.000000000","message":"what is the difference between router and router_object? Based on L332 and L346 it seems for me that types of those objects are the same.","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"f90823491958cc2246b210b847ac076a746b1989","unresolved":true,"context_lines":[{"line_number":329,"context_line":"        else:"},{"line_number":330,"context_line":"            return new_router, router_object"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":333,"context_line":"        router, router_object \u003d self._check_gateway_removed("},{"line_number":334,"context_line":"            router, router_object)"},{"line_number":335,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"201e3fa1_05acbb62","line":332,"range":{"start_line":332,"start_character":33,"end_line":332,"end_character":55},"in_reply_to":"fba38c68_3a50609c","updated":"2021-01-12 03:30:30.000000000","message":"\u0027new_router\u0027 is the new router dict, \u0027router_object\u0027 is the old router dict.see above.","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f043ad0ff61ea482f11becf7963b7f02432a4b5f","unresolved":true,"context_lines":[{"line_number":340,"context_line":"            gw_port_id \u003d router[\u0027gw_port_id\u0027]"},{"line_number":341,"context_line":"            network_id \u003d gw_info[\u0027network_id\u0027]"},{"line_number":342,"context_line":"        except KeyError:"},{"line_number":343,"context_line":"            return"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        if router_object:"},{"line_number":346,"context_line":"            gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"ec5ad23d_3e58484a","line":343,"updated":"2021-01-08 09:46:21.000000000","message":"Isn\u0027t some debug log needed in such case?","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"9564d0b0c9c3ca692ba800abdecd9441f55850c2","unresolved":false,"context_lines":[{"line_number":340,"context_line":"            gw_port_id \u003d router[\u0027gw_port_id\u0027]"},{"line_number":341,"context_line":"            network_id \u003d gw_info[\u0027network_id\u0027]"},{"line_number":342,"context_line":"        except KeyError:"},{"line_number":343,"context_line":"            return"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        if router_object:"},{"line_number":346,"context_line":"            gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"6d596113_3bdbf8da","line":343,"in_reply_to":"ec5ad23d_3e58484a","updated":"2021-01-12 05:36:03.000000000","message":"Done","commit_id":"be38da52fd395b781400bb95f0670d7cf64de546"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"21c8024f015af767726147043a8dfa5314b5c954","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _ovn_qos_rule(self, rules_direction, rules, port_id, network_id,"},{"line_number":112,"context_line":"                      fip_id\u003dNone, ip_address\u003dNone, delete\u003dFalse,"},{"line_number":113,"context_line":"                      router_id\u003dNone, is_gw_port\u003dFalse):"},{"line_number":114,"context_line":"        \"\"\"Generate an OVN QoS register based on several Neutron QoS rules"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        A OVN QoS register can contain \"bandwidth\" and \"action\" parameters."}],"source_content_type":"text/x-python","patch_set":15,"id":"6aa1b41b_2e1863f9","line":113,"range":{"start_line":113,"start_character":22,"end_line":113,"end_character":54},"updated":"2021-01-12 08:38:34.000000000","message":"OK, again for these params, how about use one param ``gw_port_rid \u003d None`` to merge these two? This is a basical rule: use less params for functon.","commit_id":"412e7487516003e890c8a24078fb474f36d941b1"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"6bde69473c799c2a4b26e5bc1ab5bd88789ad876","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def _ovn_qos_rule(self, rules_direction, rules, port_id, network_id,"},{"line_number":112,"context_line":"                      fip_id\u003dNone, ip_address\u003dNone, delete\u003dFalse,"},{"line_number":113,"context_line":"                      router_id\u003dNone, is_gw_port\u003dFalse):"},{"line_number":114,"context_line":"        \"\"\"Generate an OVN QoS register based on several Neutron QoS rules"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        A OVN QoS register can contain \"bandwidth\" and \"action\" parameters."}],"source_content_type":"text/x-python","patch_set":15,"id":"46bfcf40_6a4de8a4","line":113,"range":{"start_line":113,"start_character":22,"end_line":113,"end_character":54},"in_reply_to":"6aa1b41b_2e1863f9","updated":"2021-01-13 07:21:40.000000000","message":"Done, use \u0027router_id\u0027 instead as you suggested before.","commit_id":"412e7487516003e890c8a24078fb474f36d941b1"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"0bd2e1278506677b55dc4d724f006d8069382df2","unresolved":true,"context_lines":[{"line_number":160,"context_line":"                ovn_const.OVN_FIP_EXT_ID_KEY: fip_id}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        if router_id:"},{"line_number":163,"context_line":"            ovn_qos_rule[\u0027external_ids\u0027] \u003d {"},{"line_number":164,"context_line":"                ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id,"},{"line_number":165,"context_line":"                ovn_const.OVN_NETWORK_ID_EXT_ID_KEY: network_id}"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"274dafed_3759563c","line":163,"range":{"start_line":163,"start_character":12,"end_line":163,"end_character":24},"updated":"2021-07-15 07:04:31.000000000","message":"Maybe one external_id is missing here:\novn_const.OVN_GW_PORT_EXT_ID_KEY: port_id","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":325,"context_line":"    def create_router(self, txn, router):"},{"line_number":326,"context_line":"        self.update_router(txn, router)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def _check_gateway_removed(self, new_router):"},{"line_number":329,"context_line":"        router_id \u003d new_router[\u0027id\u0027]"},{"line_number":330,"context_line":"        router_name \u003d utils.ovn_name(router_id)"},{"line_number":331,"context_line":"        ovn_router \u003d self._driver._nb_idl.get_lrouter(router_name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"22fbce92_3e58011e","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":30},"updated":"2021-03-23 11:02:26.000000000","message":"This check is redundant.\n1) When the router is created, you know this retrieving EXTERNAL_GW_INFO\n2) When the router is updated, ovn_client method performs this check. You can pass this value to OVNClientQosExtension.update_router","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":33178,"name":"Shawn.Lu","email":"lucheng0127@outlook.com","username":"Shawn.Lu"},"change_message_id":"f1282c6e5ff63028b1e239356e8d1319b785aa96","unresolved":false,"context_lines":[{"line_number":325,"context_line":"    def create_router(self, txn, router):"},{"line_number":326,"context_line":"        self.update_router(txn, router)"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def _check_gateway_removed(self, new_router):"},{"line_number":329,"context_line":"        router_id \u003d new_router[\u0027id\u0027]"},{"line_number":330,"context_line":"        router_name \u003d utils.ovn_name(router_id)"},{"line_number":331,"context_line":"        ovn_router \u003d self._driver._nb_idl.get_lrouter(router_name)"}],"source_content_type":"text/x-python","patch_set":19,"id":"0200662a_5a6c886f","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":30},"in_reply_to":"22fbce92_3e58011e","updated":"2021-06-21 07:31:48.000000000","message":"Done","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":340,"context_line":"        if self._check_gateway_removed(router):"},{"line_number":341,"context_line":"            if router_object:"},{"line_number":342,"context_line":"                gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":343,"context_line":"                gw_object.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":344,"context_line":"                router \u003d router_object"}],"source_content_type":"text/x-python","patch_set":19,"id":"4c377212_a3251b0d","line":341,"range":{"start_line":341,"start_character":15,"end_line":341,"end_character":28},"updated":"2021-03-23 11:02:26.000000000","message":"As commented in [1], router_object will be removed. As in [2], there will be a patch to remove this object from the method call.\n\nIf you need something from this variable, refactor the ovn_client method (or methods) to store this information in the OVN router object.\n\n[1]https://github.com/openstack/neutron/blob/22108bd20976efab777a8d487227bb2afa638ce2/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#L1162-L1165\n[2]https://review.opendev.org/c/openstack/neutron/+/767186/18/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":33178,"name":"Shawn.Lu","email":"lucheng0127@outlook.com","username":"Shawn.Lu"},"change_message_id":"ce829038841c9f887ec5a5928f6485cc67b9ba04","unresolved":true,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":340,"context_line":"        if self._check_gateway_removed(router):"},{"line_number":341,"context_line":"            if router_object:"},{"line_number":342,"context_line":"                gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":343,"context_line":"                gw_object.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":344,"context_line":"                router \u003d router_object"}],"source_content_type":"text/x-python","patch_set":19,"id":"127995b7_aa6edb59","line":341,"range":{"start_line":341,"start_character":15,"end_line":341,"end_character":28},"in_reply_to":"32ef8675_deebfdd4","updated":"2021-06-21 11:45:38.000000000","message":"If we try to get old router data from ovn-nb, like [1] there are lots of works need to do.\nmaybe we can approve this patch first, then try to remove router_object in the future, after all this patch have implemented router gateway qos.\n[1] https://review.opendev.org/c/openstack/neutron/+/767186/","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":33178,"name":"Shawn.Lu","email":"lucheng0127@outlook.com","username":"Shawn.Lu"},"change_message_id":"f1282c6e5ff63028b1e239356e8d1319b785aa96","unresolved":true,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":340,"context_line":"        if self._check_gateway_removed(router):"},{"line_number":341,"context_line":"            if router_object:"},{"line_number":342,"context_line":"                gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":343,"context_line":"                gw_object.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":344,"context_line":"                router \u003d router_object"}],"source_content_type":"text/x-python","patch_set":19,"id":"5b85a178_79b9820a","line":341,"range":{"start_line":341,"start_character":15,"end_line":341,"end_character":28},"in_reply_to":"4c377212_a3251b0d","updated":"2021-06-21 07:31:48.000000000","message":"Maybe we can use db_rev.get_revision_row in ovn_client to remove router_object from update_router\ncan I continue work with this patch?","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":33178,"name":"Shawn.Lu","email":"lucheng0127@outlook.com","username":"Shawn.Lu"},"change_message_id":"3915306360c908697374ce0bfd2d96dfcd85e603","unresolved":true,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def update_router(self, txn, router, router_object\u003dNone):"},{"line_number":340,"context_line":"        if self._check_gateway_removed(router):"},{"line_number":341,"context_line":"            if router_object:"},{"line_number":342,"context_line":"                gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":343,"context_line":"                gw_object.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":344,"context_line":"                router \u003d router_object"}],"source_content_type":"text/x-python","patch_set":19,"id":"32ef8675_deebfdd4","line":341,"range":{"start_line":341,"start_character":15,"end_line":341,"end_character":28},"in_reply_to":"5b85a178_79b9820a","updated":"2021-06-21 08:12:40.000000000","message":"We can use model_query in ovn_client to get router_object","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":341,"context_line":"            if router_object:"},{"line_number":342,"context_line":"                gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":343,"context_line":"                gw_object.pop(\u0027qos_policy_id\u0027, None)"},{"line_number":344,"context_line":"                router \u003d router_object"},{"line_number":345,"context_line":"                router_object \u003d None"},{"line_number":346,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":347,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5e42c7ce_7983f813","line":344,"updated":"2021-03-23 11:02:26.000000000","message":"When can this happen? \"router\" is the router object dictionary and must have those values.","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":355,"context_line":"                      \"or network_id.\", router)"},{"line_number":356,"context_line":"            return"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if router_object:"},{"line_number":359,"context_line":"            gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":360,"context_line":"            old_qos_policy_id \u003d gw_object.get(\u0027qos_policy_id\u0027)"},{"line_number":361,"context_line":"            if qos_policy_id \u003d\u003d old_qos_policy_id:"}],"source_content_type":"text/x-python","patch_set":19,"id":"ef4790a6_8251d824","line":358,"range":{"start_line":358,"start_character":11,"end_line":358,"end_character":24},"updated":"2021-03-23 11:02:26.000000000","message":"same comment as before: store this info in the router OVN object.","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":33178,"name":"Shawn.Lu","email":"lucheng0127@outlook.com","username":"Shawn.Lu"},"change_message_id":"f1282c6e5ff63028b1e239356e8d1319b785aa96","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                      \"or network_id.\", router)"},{"line_number":356,"context_line":"            return"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        if router_object:"},{"line_number":359,"context_line":"            gw_object \u003d router_object.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":360,"context_line":"            old_qos_policy_id \u003d gw_object.get(\u0027qos_policy_id\u0027)"},{"line_number":361,"context_line":"            if qos_policy_id \u003d\u003d old_qos_policy_id:"}],"source_content_type":"text/x-python","patch_set":19,"id":"e360bb9a_744686e3","line":358,"range":{"start_line":358,"start_character":11,"end_line":358,"end_character":24},"in_reply_to":"ef4790a6_8251d824","updated":"2021-06-21 07:31:48.000000000","message":"Done","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6db31e6ee41245c4029a7ac6ea8fb237a8c839fb","unresolved":true,"context_lines":[{"line_number":392,"context_line":"            lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":393,"context_line":"            rule_column \u003d {\u0027switch\u0027: lswitch_name,"},{"line_number":394,"context_line":"                           \u0027direction\u0027: direction,"},{"line_number":395,"context_line":"                           \u0027priority\u0027: priority,"},{"line_number":396,"context_line":"                           \u0027match\u0027: match}"},{"line_number":397,"context_line":"            txn.add(self._driver._nb_idl.qos_del(**rule_column))"},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"d218c99f_4595a0c8","line":395,"updated":"2021-03-23 11:02:26.000000000","message":"Why do we have \"_ovn_qos_rule\" for? This method should build a valid OVN QoS rule passing the correct parameters.","commit_id":"51fb17d62060d24238aeaf9d5a1c55d49605dba4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def update_router(self, txn, router):"},{"line_number":328,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":329,"context_line":"        if \u0027qos_policy_id\u0027 not in gw_info:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027, \u0027\u0027)"},{"line_number":332,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"}],"source_content_type":"text/x-python","patch_set":22,"id":"b06b854b_1af39a77","line":329,"range":{"start_line":329,"start_character":7,"end_line":329,"end_character":42},"updated":"2021-07-28 13:12:00.000000000","message":"If there is not qos_policy_id in the GW, that means you need to remove any existing one (see also comment in \"delete_router\").\n\nIn case of removing the qos policy for the GW, you still need to execute L343","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def update_router(self, txn, router):"},{"line_number":328,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":329,"context_line":"        if \u0027qos_policy_id\u0027 not in gw_info:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027, \u0027\u0027)"},{"line_number":332,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"}],"source_content_type":"text/x-python","patch_set":22,"id":"be5d29ff_9b4be20a","line":329,"range":{"start_line":329,"start_character":7,"end_line":329,"end_character":42},"in_reply_to":"b06b854b_1af39a77","updated":"2021-07-29 03:12:57.000000000","message":"Done","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":328,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":329,"context_line":"        if \u0027qos_policy_id\u0027 not in gw_info:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027, \u0027\u0027)"},{"line_number":332,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"},{"line_number":333,"context_line":"        try:"},{"line_number":334,"context_line":"            router_id \u003d router[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"311fcdac_61987f2b","line":331,"range":{"start_line":331,"start_character":24,"end_line":331,"end_character":56},"updated":"2021-07-28 13:12:00.000000000","message":"qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027)\n\nThe default value will be None","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":329,"context_line":"        if \u0027qos_policy_id\u0027 not in gw_info:"},{"line_number":330,"context_line":"            return"},{"line_number":331,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027, \u0027\u0027)"},{"line_number":332,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"},{"line_number":333,"context_line":"        try:"},{"line_number":334,"context_line":"            router_id \u003d router[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"a507c6de_3ab44020","line":331,"range":{"start_line":331,"start_character":24,"end_line":331,"end_character":56},"in_reply_to":"311fcdac_61987f2b","updated":"2021-07-29 03:12:57.000000000","message":"Done","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":359,"context_line":"                if ovn_rule:"},{"line_number":360,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def delete_router(self, txn, router_id):"},{"line_number":363,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":364,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":365,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":366,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":367,"context_line":"        for rule in qos_rules:"},{"line_number":368,"context_line":"            direction \u003d rule.get(\u0027direction\u0027)"},{"line_number":369,"context_line":"            priority \u003d rule.get(\u0027priority\u0027)"},{"line_number":370,"context_line":"            match \u003d rule.get(\u0027match\u0027)"},{"line_number":371,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":372,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":373,"context_line":"            lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":374,"context_line":"            rule_column \u003d {\u0027switch\u0027: lswitch_name,"},{"line_number":375,"context_line":"                           \u0027direction\u0027: direction,"},{"line_number":376,"context_line":"                           \u0027priority\u0027: priority,"},{"line_number":377,"context_line":"                           \u0027match\u0027: match}"},{"line_number":378,"context_line":"            txn.add(self._driver._nb_idl.qos_del(**rule_column))"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def update_policy(self, context, policy):"},{"line_number":381,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":22,"id":"31bec94f_7503d769","line":378,"range":{"start_line":362,"start_character":0,"end_line":378,"end_character":64},"updated":"2021-07-28 13:12:00.000000000","message":"This method could be done with \"update_router\" if you remove L329-L330.","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                if ovn_rule:"},{"line_number":360,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def delete_router(self, txn, router_id):"},{"line_number":363,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":364,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":365,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":366,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":367,"context_line":"        for rule in qos_rules:"},{"line_number":368,"context_line":"            direction \u003d rule.get(\u0027direction\u0027)"},{"line_number":369,"context_line":"            priority \u003d rule.get(\u0027priority\u0027)"},{"line_number":370,"context_line":"            match \u003d rule.get(\u0027match\u0027)"},{"line_number":371,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":372,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":373,"context_line":"            lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":374,"context_line":"            rule_column \u003d {\u0027switch\u0027: lswitch_name,"},{"line_number":375,"context_line":"                           \u0027direction\u0027: direction,"},{"line_number":376,"context_line":"                           \u0027priority\u0027: priority,"},{"line_number":377,"context_line":"                           \u0027match\u0027: match}"},{"line_number":378,"context_line":"            txn.add(self._driver._nb_idl.qos_del(**rule_column))"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def update_policy(self, context, policy):"},{"line_number":381,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":22,"id":"b6e6ceac_b1b95794","line":378,"range":{"start_line":362,"start_character":0,"end_line":378,"end_character":64},"in_reply_to":"31bec94f_7503d769","updated":"2021-07-29 03:12:57.000000000","message":"Done","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"1eed85c6ba25d14d118044ecdcf4973b34c2adff","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                if ovn_rule:"},{"line_number":360,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def delete_router(self, txn, router_id):"},{"line_number":363,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":364,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":365,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":366,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":367,"context_line":"        for rule in qos_rules:"},{"line_number":368,"context_line":"            direction \u003d rule.get(\u0027direction\u0027)"},{"line_number":369,"context_line":"            priority \u003d rule.get(\u0027priority\u0027)"},{"line_number":370,"context_line":"            match \u003d rule.get(\u0027match\u0027)"},{"line_number":371,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":372,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":373,"context_line":"            lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":374,"context_line":"            rule_column \u003d {\u0027switch\u0027: lswitch_name,"},{"line_number":375,"context_line":"                           \u0027direction\u0027: direction,"},{"line_number":376,"context_line":"                           \u0027priority\u0027: priority,"},{"line_number":377,"context_line":"                           \u0027match\u0027: match}"},{"line_number":378,"context_line":"            txn.add(self._driver._nb_idl.qos_del(**rule_column))"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def update_policy(self, context, policy):"},{"line_number":381,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":22,"id":"3ccb1925_7757bebf","line":378,"range":{"start_line":362,"start_character":0,"end_line":378,"end_character":64},"in_reply_to":"5f053a17_be480844","updated":"2021-07-29 12:27:39.000000000","message":"Maybe it\u0027s a little complicated here. Because we can only retrieve network_id from external_ids of QoS.","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f30886016e961fe86e96cd211306abc85b50baa5","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                if ovn_rule:"},{"line_number":360,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def delete_router(self, txn, router_id):"},{"line_number":363,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":364,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":365,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":366,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":367,"context_line":"        for rule in qos_rules:"},{"line_number":368,"context_line":"            direction \u003d rule.get(\u0027direction\u0027)"},{"line_number":369,"context_line":"            priority \u003d rule.get(\u0027priority\u0027)"},{"line_number":370,"context_line":"            match \u003d rule.get(\u0027match\u0027)"},{"line_number":371,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":372,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":373,"context_line":"            lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":374,"context_line":"            rule_column \u003d {\u0027switch\u0027: lswitch_name,"},{"line_number":375,"context_line":"                           \u0027direction\u0027: direction,"},{"line_number":376,"context_line":"                           \u0027priority\u0027: priority,"},{"line_number":377,"context_line":"                           \u0027match\u0027: match}"},{"line_number":378,"context_line":"            txn.add(self._driver._nb_idl.qos_del(**rule_column))"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"    def update_policy(self, context, policy):"},{"line_number":381,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f053a17_be480844","line":378,"range":{"start_line":362,"start_character":0,"end_line":378,"end_character":64},"in_reply_to":"b6e6ceac_b1b95794","updated":"2021-07-29 11:34:23.000000000","message":"What I was saying is to remove completely this method.\n\ndef delete_router(self, txn, router_id):\n    self.update_router(...)\n\nOf course, that implies the changes commented in update_router.","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        self.update_router(txn, router)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def delete_router(self, txn, router):"},{"line_number":328,"context_line":"        self.update_router(txn, router, delete\u003dTrue)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def update_router(self, txn, router, delete\u003dFalse):"},{"line_number":331,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":24,"id":"5bb3230f_37e5a1a9","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":52},"updated":"2021-09-28 08:22:48.000000000","message":"Calling update in a delete_router function looks strange to me.\nSo, this line can be changed to:\n\"\"\"\n        router_id \u003d router.get(\u0027id\u0027, None)\n        if router_id:\n            self._delete_router(txn, router_id)\n\"\"\"","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        self.update_router(txn, router)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"    def delete_router(self, txn, router):"},{"line_number":328,"context_line":"        self.update_router(txn, router, delete\u003dTrue)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def update_router(self, txn, router, delete\u003dFalse):"},{"line_number":331,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"}],"source_content_type":"text/x-python","patch_set":24,"id":"a42b5d5f_47e29a20","line":328,"range":{"start_line":328,"start_character":8,"end_line":328,"end_character":52},"in_reply_to":"5bb3230f_37e5a1a9","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":327,"context_line":"    def delete_router(self, txn, router):"},{"line_number":328,"context_line":"        self.update_router(txn, router, delete\u003dTrue)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def update_router(self, txn, router, delete\u003dFalse):"},{"line_number":331,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":332,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027)"},{"line_number":333,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"}],"source_content_type":"text/x-python","patch_set":24,"id":"19b951fe_009cd8e8","line":330,"range":{"start_line":330,"start_character":40,"end_line":330,"end_character":53},"updated":"2021-09-28 08:22:48.000000000","message":"So this is not necessary.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    def delete_router(self, txn, router):"},{"line_number":328,"context_line":"        self.update_router(txn, router, delete\u003dTrue)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def update_router(self, txn, router, delete\u003dFalse):"},{"line_number":331,"context_line":"        gw_info \u003d router.get(l3.EXTERNAL_GW_INFO) or {}"},{"line_number":332,"context_line":"        qos_policy_id \u003d gw_info.get(\u0027qos_policy_id\u0027)"},{"line_number":333,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"}],"source_content_type":"text/x-python","patch_set":24,"id":"a0e1c924_1a4ba36f","line":330,"range":{"start_line":330,"start_character":40,"end_line":330,"end_character":53},"in_reply_to":"19b951fe_009cd8e8","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":333,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"},{"line_number":334,"context_line":"        try:"},{"line_number":335,"context_line":"            router_id \u003d router[\u0027id\u0027]"},{"line_number":336,"context_line":"            gw_port_id \u003d router[\u0027gw_port_id\u0027]"},{"line_number":337,"context_line":"            network_id \u003d gw_info[\u0027network_id\u0027]"},{"line_number":338,"context_line":"        except KeyError:"},{"line_number":339,"context_line":"            LOG.debug(\"Router %s doesn\u0027t have router_id, gw_port_id \""}],"source_content_type":"text/x-python","patch_set":24,"id":"f6a66bb7_a1a166be","line":336,"range":{"start_line":336,"start_character":25,"end_line":336,"end_character":45},"updated":"2021-09-28 08:22:48.000000000","message":"Use router.get(\"key\", None) to avoid using try-catch sections.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        fixed_ips \u003d gw_info.get(\u0027external_fixed_ips\u0027, [])"},{"line_number":334,"context_line":"        try:"},{"line_number":335,"context_line":"            router_id \u003d router[\u0027id\u0027]"},{"line_number":336,"context_line":"            gw_port_id \u003d router[\u0027gw_port_id\u0027]"},{"line_number":337,"context_line":"            network_id \u003d gw_info[\u0027network_id\u0027]"},{"line_number":338,"context_line":"        except KeyError:"},{"line_number":339,"context_line":"            LOG.debug(\"Router %s doesn\u0027t have router_id, gw_port_id \""}],"source_content_type":"text/x-python","patch_set":24,"id":"409daa5c_b7fff3a8","line":336,"range":{"start_line":336,"start_character":25,"end_line":336,"end_character":45},"in_reply_to":"f6a66bb7_a1a166be","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            LOG.debug(\"Router %s doesn\u0027t have router_id, gw_port_id \""},{"line_number":340,"context_line":"                      \"or network_id.\", router)"},{"line_number":341,"context_line":"            return"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        if delete:"},{"line_number":344,"context_line":"            self._delete_router(txn, router_id)"},{"line_number":345,"context_line":"            return"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":348,"context_line":"        txn.add(self._driver._nb_idl.qos_del_ext_ids("}],"source_content_type":"text/x-python","patch_set":24,"id":"220a0e8b_b05b75a2","line":345,"range":{"start_line":342,"start_character":0,"end_line":345,"end_character":18},"updated":"2021-09-28 08:22:48.000000000","message":"This can be removed with the change of line 328 and 330.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            LOG.debug(\"Router %s doesn\u0027t have router_id, gw_port_id \""},{"line_number":340,"context_line":"                      \"or network_id.\", router)"},{"line_number":341,"context_line":"            return"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        if delete:"},{"line_number":344,"context_line":"            self._delete_router(txn, router_id)"},{"line_number":345,"context_line":"            return"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":348,"context_line":"        txn.add(self._driver._nb_idl.qos_del_ext_ids("}],"source_content_type":"text/x-python","patch_set":24,"id":"07ea384c_90215d23","line":345,"range":{"start_line":342,"start_character":0,"end_line":345,"end_character":18},"in_reply_to":"220a0e8b_b05b75a2","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":349,"context_line":"                lswitch_name,"},{"line_number":350,"context_line":"                {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id}))"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        if not (gw_port_id and qos_policy_id):"},{"line_number":353,"context_line":"            return"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":356,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"23a43c37_9a5b2392","line":353,"range":{"start_line":352,"start_character":0,"end_line":353,"end_character":18},"updated":"2021-09-28 08:22:48.000000000","message":"These checks can be moved to lines before that line 348 txn.add() action to avoid calling it with no real use.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                lswitch_name,"},{"line_number":350,"context_line":"                {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id}))"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        if not (gw_port_id and qos_policy_id):"},{"line_number":353,"context_line":"            return"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":356,"context_line":"        qos_rules \u003d self._qos_rules(admin_context, qos_policy_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1814b62b_d813a1e9","line":353,"range":{"start_line":352,"start_character":0,"end_line":353,"end_character":18},"in_reply_to":"23a43c37_9a5b2392","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":363,"context_line":"                    router_id\u003drouter_id)"},{"line_number":364,"context_line":"                if ovn_rule:"},{"line_number":365,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def _delete_router(self, txn, router_id):"},{"line_number":368,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":369,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":370,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":371,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":372,"context_line":"        for rule in qos_rules:"},{"line_number":373,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":374,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":375,"context_line":"            if network_id is not None:"},{"line_number":376,"context_line":"                lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":377,"context_line":"                txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":378,"context_line":"                    lswitch_name,"},{"line_number":379,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id}))"},{"line_number":380,"context_line":"                break"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def update_policy(self, context, policy):"},{"line_number":383,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":24,"id":"21e1bdc9_4bba0422","line":380,"range":{"start_line":366,"start_character":0,"end_line":380,"end_character":21},"updated":"2021-09-28 08:22:48.000000000","message":"Since this function is called only once and the body is not too long, these lines can be directly move to function delete_router.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                    router_id\u003drouter_id)"},{"line_number":364,"context_line":"                if ovn_rule:"},{"line_number":365,"context_line":"                    txn.add(self._driver._nb_idl.qos_add(**ovn_rule))"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"    def _delete_router(self, txn, router_id):"},{"line_number":368,"context_line":"        qos_rules \u003d self._driver._nb_idl.db_find("},{"line_number":369,"context_line":"            \u0027QoS\u0027, (\u0027external_ids\u0027, \u0027\u003d\u0027,"},{"line_number":370,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id})"},{"line_number":371,"context_line":"                                                ).execute(check_error\u003dTrue)"},{"line_number":372,"context_line":"        for rule in qos_rules:"},{"line_number":373,"context_line":"            ext_ids \u003d rule.get(\u0027external_ids\u0027, {})"},{"line_number":374,"context_line":"            network_id \u003d ext_ids.get(ovn_const.OVN_NETWORK_ID_EXT_ID_KEY)"},{"line_number":375,"context_line":"            if network_id is not None:"},{"line_number":376,"context_line":"                lswitch_name \u003d utils.ovn_name(network_id)"},{"line_number":377,"context_line":"                txn.add(self._driver._nb_idl.qos_del_ext_ids("},{"line_number":378,"context_line":"                    lswitch_name,"},{"line_number":379,"context_line":"                    {ovn_const.OVN_ROUTER_ID_EXT_ID_KEY: router_id}))"},{"line_number":380,"context_line":"                break"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def update_policy(self, context, policy):"},{"line_number":383,"context_line":"        updated_port_ids \u003d set([])"}],"source_content_type":"text/x-python","patch_set":24,"id":"886decad_9127581a","line":380,"range":{"start_line":366,"start_character":0,"end_line":380,"end_character":21},"in_reply_to":"21e1bdc9_4bba0422","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"64b0f4999da6afdc53801cfb8cf22808f993d6fc","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2019 Red Hat, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_7b01016a","line":1,"updated":"2020-11-17 11:17:55.000000000","message":"pep8: E902 IndentationError: unindent does not match any outer indentation level","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"a342675eb3d929cc55124f4a9d2458663420bf93","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"                        self._delete_router_ext_gw("},{"line_number":1184,"context_line":"                            router_object, networks, txn)"},{"line_number":1185,"context_line":"                        deleted_gw_port_id \u003d router_object[\u0027gw_port_id\u0027]"},{"line_number":1186,"context_line":"                        self._qos_driver.update_router(txn, router_object)"},{"line_number":1187,"context_line":"                elif gateway_new and gateway_old:"},{"line_number":1188,"context_line":"                    # Check if external gateway has changed, if yes, delete"},{"line_number":1189,"context_line":"                    # the old gateway and add the new gateway"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_157ffeaa","line":1186,"range":{"start_line":1186,"start_character":60,"end_line":1186,"end_character":73},"updated":"2020-11-17 13:45:46.000000000","message":"From the comment in L1152-L1155, \u0027router_object\u0027 may not be present, do we need to address that case in an else clause or the \u0027delete_lrouter_ext_gw\u0027 will update the router in the qos driver?","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"5626df2412e84c77c8b0c89beab5f48097f62fde","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"                        self._delete_router_ext_gw("},{"line_number":1184,"context_line":"                            router_object, networks, txn)"},{"line_number":1185,"context_line":"                        deleted_gw_port_id \u003d router_object[\u0027gw_port_id\u0027]"},{"line_number":1186,"context_line":"                        self._qos_driver.update_router(txn, router_object)"},{"line_number":1187,"context_line":"                elif gateway_new and gateway_old:"},{"line_number":1188,"context_line":"                    # Check if external gateway has changed, if yes, delete"},{"line_number":1189,"context_line":"                    # the old gateway and add the new gateway"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_47825e54","line":1186,"range":{"start_line":1186,"start_character":60,"end_line":1186,"end_character":73},"in_reply_to":"1f621f24_157ffeaa","updated":"2020-11-18 03:02:19.000000000","message":"I previously submitted several similar patches to solve the dependency of the original object, and they have not been reviewed:(. The \u0027router_object\u0027 has a large dependency here, and the \u0027lswitch_name\u0027 cannot be obtained in the\u0027delete_lrouter_ext_gw\u0027 method. I want to solve the dependency through a special patch, Do you think this is ok?","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":1123,"context_line":"            ovn_const.OVN_ROUTER_AZ_HINTS_EXT_ID_KEY:"},{"line_number":1124,"context_line":"                \u0027,\u0027.join(utils.get_az_hints(router))}"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def create_router(self, context, router, add_external_gateway\u003dTrue):"},{"line_number":1127,"context_line":"        \"\"\"Create a logical router.\"\"\""},{"line_number":1128,"context_line":"        external_ids \u003d self._gen_router_ext_ids(router)"},{"line_number":1129,"context_line":"        enabled \u003d router.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9776dfc6_f3f99e61","line":1126,"range":{"start_line":1126,"start_character":8,"end_line":1126,"end_character":21},"updated":"2020-11-30 12:56:58.000000000","message":"Why don\u0027t we call the QoS driver during the router creation?","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"            ovn_const.OVN_ROUTER_AZ_HINTS_EXT_ID_KEY:"},{"line_number":1124,"context_line":"                \u0027,\u0027.join(utils.get_az_hints(router))}"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    def create_router(self, context, router, add_external_gateway\u003dTrue):"},{"line_number":1127,"context_line":"        \"\"\"Create a logical router.\"\"\""},{"line_number":1128,"context_line":"        external_ids \u003d self._gen_router_ext_ids(router)"},{"line_number":1129,"context_line":"        enabled \u003d router.get(\u0027admin_state_up\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"e0beabdd_f7394bd9","line":1126,"range":{"start_line":1126,"start_character":8,"end_line":1126,"end_character":21},"in_reply_to":"9776dfc6_f3f99e61","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":1205,"context_line":"                                self.update_nat_rules("},{"line_number":1206,"context_line":"                                    new_router, networks,"},{"line_number":1207,"context_line":"                                    enable_snat\u003dnew_snat_state, txn\u003dtxn)"},{"line_number":1208,"context_line":"                    old_qos_policy_id \u003d None"},{"line_number":1209,"context_line":"                    new_qos_policy_id \u003d gateway_new.get(\u0027qos_policy_id\u0027)"},{"line_number":1210,"context_line":"                    if router_object:"},{"line_number":1211,"context_line":"                        gateway_object \u003d router_object.get(l3.EXTERNAL_GW_INFO)"},{"line_number":1212,"context_line":"                        if gateway_object:"},{"line_number":1213,"context_line":"                            old_qos_policy_id \u003d gateway_object.get("},{"line_number":1214,"context_line":"                                \u0027qos_policy_id\u0027)"},{"line_number":1215,"context_line":"                    if new_qos_policy_id !\u003d old_qos_policy_id:"},{"line_number":1216,"context_line":"                        self._qos_driver.update_router(txn, new_router)"},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"                update \u003d {\u0027external_ids\u0027: self._gen_router_ext_ids(new_router)}"},{"line_number":1219,"context_line":"                update[\u0027enabled\u0027] \u003d new_router.get(\u0027admin_state_up\u0027) or False"},{"line_number":1220,"context_line":"                txn.add(self._nb_idl.update_lrouter(router_name, **update))"}],"source_content_type":"text/x-python","patch_set":7,"id":"51df78ed_4bd02135","line":1217,"range":{"start_line":1208,"start_character":20,"end_line":1217,"end_character":0},"updated":"2020-11-30 12:56:58.000000000","message":"That must be done inside the qos driver. The OVN client should be responsible to call the QoS driver when needed but doesn\u0027t need to know anything about QoS (policies, when they apply, variable names, etc). We should include this logic inside the QoS driver.","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":1205,"context_line":"                                self.update_nat_rules("},{"line_number":1206,"context_line":"                                    new_router, networks,"},{"line_number":1207,"context_line":"                                    enable_snat\u003dnew_snat_state, txn\u003dtxn)"},{"line_number":1208,"context_line":"                    old_qos_policy_id \u003d None"},{"line_number":1209,"context_line":"                    new_qos_policy_id \u003d gateway_new.get(\u0027qos_policy_id\u0027)"},{"line_number":1210,"context_line":"                    if router_object:"},{"line_number":1211,"context_line":"                        gateway_object \u003d router_object.get(l3.EXTERNAL_GW_INFO)"},{"line_number":1212,"context_line":"                        if gateway_object:"},{"line_number":1213,"context_line":"                            old_qos_policy_id \u003d gateway_object.get("},{"line_number":1214,"context_line":"                                \u0027qos_policy_id\u0027)"},{"line_number":1215,"context_line":"                    if new_qos_policy_id !\u003d old_qos_policy_id:"},{"line_number":1216,"context_line":"                        self._qos_driver.update_router(txn, new_router)"},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"                update \u003d {\u0027external_ids\u0027: self._gen_router_ext_ids(new_router)}"},{"line_number":1219,"context_line":"                update[\u0027enabled\u0027] \u003d new_router.get(\u0027admin_state_up\u0027) or False"},{"line_number":1220,"context_line":"                txn.add(self._nb_idl.update_lrouter(router_name, **update))"}],"source_content_type":"text/x-python","patch_set":7,"id":"a092a603_875c1892","line":1217,"range":{"start_line":1208,"start_character":20,"end_line":1217,"end_character":0},"in_reply_to":"51df78ed_4bd02135","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":1250,"context_line":"        lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":1251,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1252,"context_line":"            txn.add(self._nb_idl.delete_lrouter(lrouter_name))"},{"line_number":1253,"context_line":"        db_rev.delete_revision(context, router_id, ovn_const.TYPE_ROUTERS)"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"    def get_candidates_for_scheduling(self, physnet, cms\u003dNone,"},{"line_number":1256,"context_line":"                                      chassis_physnets\u003dNone,"}],"source_content_type":"text/x-python","patch_set":7,"id":"a347af72_2fec1cb2","line":1253,"updated":"2020-11-30 12:56:58.000000000","message":"We should delete the qos queues and policies before deleting the router. Actually, we cannot leave orphan child resources in the OVS database.","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"        lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":1251,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1252,"context_line":"            txn.add(self._nb_idl.delete_lrouter(lrouter_name))"},{"line_number":1253,"context_line":"        db_rev.delete_revision(context, router_id, ovn_const.TYPE_ROUTERS)"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"    def get_candidates_for_scheduling(self, physnet, cms\u003dNone,"},{"line_number":1256,"context_line":"                                      chassis_physnets\u003dNone,"}],"source_content_type":"text/x-python","patch_set":7,"id":"b08f2097_080cb064","line":1253,"in_reply_to":"a347af72_2fec1cb2","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c556c9720b1b99713e656fca4a7d399e88efc137","unresolved":true,"context_lines":[{"line_number":1184,"context_line":"                        self._delete_router_ext_gw("},{"line_number":1185,"context_line":"                            router_object, networks, txn)"},{"line_number":1186,"context_line":"                        deleted_gw_port_id \u003d router_object[\u0027gw_port_id\u0027]"},{"line_number":1187,"context_line":"                        self._qos_driver.update_router(txn, router_object)"},{"line_number":1188,"context_line":"                elif gateway_new and gateway_old:"},{"line_number":1189,"context_line":"                    # Check if external gateway has changed, if yes, delete"},{"line_number":1190,"context_line":"                    # the old gateway and add the new gateway"}],"source_content_type":"text/x-python","patch_set":9,"id":"72666cce_cb00e8fc","line":1187,"updated":"2020-12-24 12:16:10.000000000","message":"How the old QoS rules that apply to the old GW are going to be deleted? The router object contains the original router with the old GW port. This will apply again the QoS rules.","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"                        self._delete_router_ext_gw("},{"line_number":1185,"context_line":"                            router_object, networks, txn)"},{"line_number":1186,"context_line":"                        deleted_gw_port_id \u003d router_object[\u0027gw_port_id\u0027]"},{"line_number":1187,"context_line":"                        self._qos_driver.update_router(txn, router_object)"},{"line_number":1188,"context_line":"                elif gateway_new and gateway_old:"},{"line_number":1189,"context_line":"                    # Check if external gateway has changed, if yes, delete"},{"line_number":1190,"context_line":"                    # the old gateway and add the new gateway"}],"source_content_type":"text/x-python","patch_set":9,"id":"c0da4c5f_eeed9bae","line":1187,"in_reply_to":"72666cce_cb00e8fc","updated":"2021-01-06 05:38:41.000000000","message":"Done","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c556c9720b1b99713e656fca4a7d399e88efc137","unresolved":true,"context_lines":[{"line_number":1208,"context_line":"                                    enable_snat\u003dnew_snat_state, txn\u003dtxn)"},{"line_number":1209,"context_line":"                    if router_object:"},{"line_number":1210,"context_line":"                        self._qos_driver.update_router(txn, new_router,"},{"line_number":1211,"context_line":"                                                       router_object)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"                update \u003d {\u0027external_ids\u0027: self._gen_router_ext_ids(new_router)}"},{"line_number":1214,"context_line":"                update[\u0027enabled\u0027] \u003d new_router.get(\u0027admin_state_up\u0027) or False"}],"source_content_type":"text/x-python","patch_set":9,"id":"2bfc0729_f56d2cdb","line":1211,"updated":"2020-12-24 12:16:10.000000000","message":"I really would prefer to implement this logic inside the QoS extension.\n\nThis method should call _qos_driver.update_router() only once and the QoS extension should be responsible to decide if:\n- The GW has been added\n- The GW has been deleted\n- The GW has been updated","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"                                    enable_snat\u003dnew_snat_state, txn\u003dtxn)"},{"line_number":1209,"context_line":"                    if router_object:"},{"line_number":1210,"context_line":"                        self._qos_driver.update_router(txn, new_router,"},{"line_number":1211,"context_line":"                                                       router_object)"},{"line_number":1212,"context_line":""},{"line_number":1213,"context_line":"                update \u003d {\u0027external_ids\u0027: self._gen_router_ext_ids(new_router)}"},{"line_number":1214,"context_line":"                update[\u0027enabled\u0027] \u003d new_router.get(\u0027admin_state_up\u0027) or False"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ad77e15_fa7c74a7","line":1211,"in_reply_to":"2bfc0729_f56d2cdb","updated":"2021-01-06 05:38:41.000000000","message":"Done","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c556c9720b1b99713e656fca4a7d399e88efc137","unresolved":true,"context_lines":[{"line_number":1245,"context_line":"        lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":1246,"context_line":"        ovn_router \u003d self._nb_idl.get_lrouter(lrouter_name)"},{"line_number":1247,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1248,"context_line":"            if ovn_router:"},{"line_number":1249,"context_line":"                gw_port_id \u003d ovn_router.external_ids.get("},{"line_number":1250,"context_line":"                    ovn_const.OVN_GW_PORT_EXT_ID_KEY)"},{"line_number":1251,"context_line":"                lrp_name \u003d utils.ovn_lrouter_port_name(gw_port_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"70623d9c_6efe90f9","line":1248,"range":{"start_line":1248,"start_character":12,"end_line":1248,"end_character":26},"updated":"2020-12-24 12:16:10.000000000","message":"If the OVN router is not present, that means we\u0027ll leave leftovers in the QoS table. If \"router_id\" is the only parameter we know that is going to be passed, we should use it to mark the OVN QoS rule registers, in the external_ids dictionary.\n\nWhen a router is deleted, we only need to find those rules (with external_ids:router_id\u003d\u003drouter_id) and delete them.","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":false,"context_lines":[{"line_number":1245,"context_line":"        lrouter_name \u003d utils.ovn_name(router_id)"},{"line_number":1246,"context_line":"        ovn_router \u003d self._nb_idl.get_lrouter(lrouter_name)"},{"line_number":1247,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1248,"context_line":"            if ovn_router:"},{"line_number":1249,"context_line":"                gw_port_id \u003d ovn_router.external_ids.get("},{"line_number":1250,"context_line":"                    ovn_const.OVN_GW_PORT_EXT_ID_KEY)"},{"line_number":1251,"context_line":"                lrp_name \u003d utils.ovn_lrouter_port_name(gw_port_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"b22eb3ad_7d9211d7","line":1248,"range":{"start_line":1248,"start_character":12,"end_line":1248,"end_character":26},"in_reply_to":"70623d9c_6efe90f9","updated":"2021-01-06 05:38:41.000000000","message":"Done","commit_id":"db773423eae72bc2973db81f1ed6cdef39cb4795"}],"neutron/services/ovn_l3/plugin.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"40ceccb3db6d5b80980e961c5778ddcc3e000ad6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def disable_qos_fip_or_gwip_extension_by_extension_drivers(aliases):"},{"line_number":99,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":100,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":101,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"},{"line_number":102,"context_line":"        if not qos_service_plugin and qos_fip_in_aliases:"},{"line_number":103,"context_line":"            aliases.remove(qos_fip_api.FIP_QOS_ALIAS)"},{"line_number":104,"context_line":"        if not qos_service_plugin and qos_gwip_in_aliases:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_e8910455","line":101,"updated":"2020-10-11 15:03:56.000000000","message":"pep8: F821 undefined name \u0027qos_gateway_ip_api\u0027","commit_id":"70e3bef0aa14b323ac141618cf874f6c1c6e0b36"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"40ceccb3db6d5b80980e961c5778ddcc3e000ad6","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        if not qos_service_plugin and qos_fip_in_aliases:"},{"line_number":103,"context_line":"            aliases.remove(qos_fip_api.FIP_QOS_ALIAS)"},{"line_number":104,"context_line":"        if not qos_service_plugin and qos_gwip_in_aliases:"},{"line_number":105,"context_line":"            aliases.remove(qos_gateway_ip_api.ALIAS)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    @property"},{"line_number":108,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_c88ec030","line":105,"updated":"2020-10-11 15:03:56.000000000","message":"pep8: F821 undefined name \u0027qos_gateway_ip_api\u0027","commit_id":"70e3bef0aa14b323ac141618cf874f6c1c6e0b36"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"a342675eb3d929cc55124f4a9d2458663420bf93","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def disable_qos_fip_or_gwip_extension_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_4d01ea04","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":62},"updated":"2020-11-17 13:45:46.000000000","message":"add leading underscore to the name of the method? not used outside this class right?","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"5626df2412e84c77c8b0c89beab5f48097f62fde","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def disable_qos_fip_or_gwip_extension_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f621f24_8720f69d","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":62},"in_reply_to":"1f621f24_4d01ea04","updated":"2020-11-18 03:02:19.000000000","message":"Done","commit_id":"0ca87c4ded4bf693664f2b0319f832b82029a643"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1e2a6eef550d1c6942b4fe17dafddd4ee3e7eff6","unresolved":true,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def _disable_qos_fip_or_gwip_extension_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":7,"id":"4e925623_4c678f5a","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":63},"updated":"2020-11-30 12:56:58.000000000","message":"nit: _disable_qos_extensions_by_extension_drivers\n\nThe context could be read inside the method.","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"a186aae2e33e3c8d8f6449449a3f13c3040a9478","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def _disable_qos_fip_or_gwip_extension_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":7,"id":"7104d588_c1283879","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":63},"in_reply_to":"4e925623_4c678f5a","updated":"2020-12-04 01:31:42.000000000","message":"Done","commit_id":"6d101cde1b04a60587b2985a53d0cbf1a7f1b2d9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"17568e59cbc4896579b03489f26d06f7bb8f2b33","unresolved":true,"context_lines":[{"line_number":97,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @staticmethod"},{"line_number":100,"context_line":"    def _disable_qos_extensions_by_extension_drivers(aliases):"},{"line_number":101,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":102,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":103,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":11,"id":"6c7627a6_614e8f31","line":100,"range":{"start_line":100,"start_character":8,"end_line":100,"end_character":9},"updated":"2021-01-05 11:15:53.000000000","message":"nit nit: this will be inconsistent to line 110.","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":29157,"name":"zhanghao","email":"hao.zhang.am.i@gmail.com","username":"zhanghao2"},"change_message_id":"108ee75964849eea7593f3722d94a17a5ae21248","unresolved":true,"context_lines":[{"line_number":97,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @staticmethod"},{"line_number":100,"context_line":"    def _disable_qos_extensions_by_extension_drivers(aliases):"},{"line_number":101,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":102,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":103,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":11,"id":"23d9769c_95c64b43","line":100,"range":{"start_line":100,"start_character":8,"end_line":100,"end_character":9},"in_reply_to":"6c7627a6_614e8f31","updated":"2021-01-06 05:38:41.000000000","message":"this is suggested by Daniel","commit_id":"8ea34c68d9910e45afd6f0fca608f6652a105ed3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def _disable_qos_extensions_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":22,"id":"50ee772c_ab2d6399","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":52},"updated":"2021-07-28 13:12:00.000000000","message":"+1 for updating this","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            events.PRECOMMIT_CREATE)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def _disable_qos_extensions_by_extension_drivers(aliases):"},{"line_number":100,"context_line":"        qos_service_plugin \u003d directory.get_plugin(plugin_constants.QOS)"},{"line_number":101,"context_line":"        qos_fip_in_aliases \u003d qos_fip_api.FIP_QOS_ALIAS in aliases"},{"line_number":102,"context_line":"        qos_gwip_in_aliases \u003d qos_gateway_ip_api.ALIAS in aliases"}],"source_content_type":"text/x-python","patch_set":22,"id":"ad6e25b6_301388a0","line":99,"range":{"start_line":99,"start_character":8,"end_line":99,"end_character":52},"in_reply_to":"50ee772c_ab2d6399","updated":"2021-07-29 03:12:57.000000000","message":"Done","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"}],"releasenotes/notes/ovn-router-gateway-qos-1cae7fb6fd43a73c.yaml":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e79b971a323fb8018004aa27bac8a0e5349c75e5","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port"},{"line_number":6,"context_line":"    and implement it through meter."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"a0815b9e_d98b678b","line":6,"range":{"start_line":6,"start_character":8,"end_line":6,"end_character":34},"updated":"2021-07-28 13:12:00.000000000","message":"Sorry but I\u0027m missing this part in the patch. Where/when do you set the OVN meter rules?","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"1eed85c6ba25d14d118044ecdcf4973b34c2adff","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port"},{"line_number":6,"context_line":"    and implement it through meter."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"2d8bfb45_e56d40f9","line":6,"range":{"start_line":6,"start_character":8,"end_line":6,"end_character":34},"in_reply_to":"01d18846_6831f723","updated":"2021-07-29 12:27:39.000000000","message":"It is implement like port-qos. There may be ambiguity here, I will modify it like:\n    Added support for router gateway IP QoS in OVN backend. The OVN\n    driver can retrieve QoS rules applied to the router gateway port.\n\nIs it ok?","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f30886016e961fe86e96cd211306abc85b50baa5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port"},{"line_number":6,"context_line":"    and implement it through meter."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"01d18846_6831f723","line":6,"range":{"start_line":6,"start_character":8,"end_line":6,"end_character":34},"in_reply_to":"72d8c720_46141032","updated":"2021-07-29 11:34:23.000000000","message":"but where is it done?","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":28056,"name":"Liushy","email":"liuxie_11@163.com","username":"liuxie_11"},"change_message_id":"95ae4f82660d43937f61b4aea984ba8049f76de3","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port"},{"line_number":6,"context_line":"    and implement it through meter."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"72d8c720_46141032","line":6,"range":{"start_line":6,"start_character":8,"end_line":6,"end_character":34},"in_reply_to":"a0815b9e_d98b678b","updated":"2021-07-29 03:12:57.000000000","message":"The QoS rules will be implement through meter action like:\ncookie\u003d0x8ccbc49b, duration\u003d1081011.392s, table\u003d19, n_packets\u003d0, n_bytes\u003d0, idle_age\u003d65535, priority\u003d2002,ip,reg14\u003d0x3,metadata\u003d0x1,nw_src\u003d172.70.0.23 actions\u003dmeter:5,resubmit(,20)","commit_id":"5559144a51c64d1bcd7dce24007f4c593f35267d"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"30b3be52a594439b0d6c72f0cb249b8d748973c2","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"03b8dfb0_b86d3c4e","line":5,"range":{"start_line":5,"start_character":49,"end_line":5,"end_character":69},"updated":"2021-09-28 08:22:48.000000000","message":"Gateway port and gateway IP is not same thing. Gateway port with QoS rule applied will limit all IPs traffic, while gateway IP with QoS is only one specific IP address. So, please make sure this statement is clear to users.","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"},{"author":{"_account_id":28781,"name":"Zhai Mengdong","email":"429322003@qq.com","username":"mengdong"},"change_message_id":"2faf6fa62d15404242450f681ab540c81d411f65","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for router gateway IP QoS in OVN backend. The OVN"},{"line_number":5,"context_line":"    driver can retrieve QoS rules applied to the router gateway port."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5a0d7f0b_292efdd5","line":5,"range":{"start_line":5,"start_character":49,"end_line":5,"end_character":69},"in_reply_to":"03b8dfb0_b86d3c4e","updated":"2021-09-29 06:33:26.000000000","message":"Done","commit_id":"f4e8779c774e47267d734283a378d85b5dff2419"}]}
