)]}'
{"neutron/db/migration/alembic_migrations/versions/xena/expand/1bb3393de75d_add_qos_pps_rule.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":46,"context_line":"                                       name\u003d\"directions\"),"},{"line_number":47,"context_line":"                  nullable\u003dFalse,"},{"line_number":48,"context_line":"                  server_default\u003dconstants.EGRESS_DIRECTION),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027qos_policy_id\u0027], [\u0027qos_policies.id\u0027],"},{"line_number":51,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027)"},{"line_number":52,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"0174e521_c10e08a2","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":37},"updated":"2021-06-15 11:04:07.000000000","message":"That could be replaced with \"primary_key\u003dTrue\" in the column definition.\n\nActually, if a column is primary_key, nullable\u003dFalse. A primary_key is always index.\n\n        sa.Column(\u0027id\u0027, sa.String(36), primary_key\u003dTrue),","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cc8152846dbbe5e2d42b238658aa26e048ae1ac","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                       name\u003d\"directions\"),"},{"line_number":47,"context_line":"                  nullable\u003dFalse,"},{"line_number":48,"context_line":"                  server_default\u003dconstants.EGRESS_DIRECTION),"},{"line_number":49,"context_line":"        sa.PrimaryKeyConstraint(\u0027id\u0027),"},{"line_number":50,"context_line":"        sa.ForeignKeyConstraint([\u0027qos_policy_id\u0027], [\u0027qos_policies.id\u0027],"},{"line_number":51,"context_line":"                                ondelete\u003d\u0027CASCADE\u0027)"},{"line_number":52,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"72e640e7_f80cbfd2","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":37},"in_reply_to":"0174e521_c10e08a2","updated":"2021-06-16 02:46:27.000000000","message":"Done","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ac598ca6_2608362d","line":53,"updated":"2021-06-15 11:04:07.000000000","message":"same as with minBW or maxBW, there should be a constraint for (policy, direction):\n\nsa.UniqueConstraint(\n            \u0027qos_policy_id\u0027, \u0027direction\u0027,\n            name\u003d\u0027qos_packet_rate_limit_rules0qos_policy_id0direction\u0027)","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cc8152846dbbe5e2d42b238658aa26e048ae1ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d6b21dfa_9cd7b025","line":53,"in_reply_to":"ac598ca6_2608362d","updated":"2021-06-16 02:46:27.000000000","message":"Done","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f103ccaadbbb2c7fb362e3f6d88ab46a2e585f05","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        sa.Column(\u0027max_burst_kpps\u0027, sa.Integer()),"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # To overcome postgreSQL errors on table create"},{"line_number":55,"context_line":"    op.add_column(pps_rule_table_name,"},{"line_number":56,"context_line":"                  sa.Column(\"direction\", direction_enum,"},{"line_number":57,"context_line":"                            server_default\u003dconstants.EGRESS_DIRECTION,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1d1ecea1_7b3dadc9","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":2},"updated":"2021-07-20 11:26:50.000000000","message":"This is easier: the sql problem you are hitting is that the enum name is repeated. This could be solved adding another name. For example, \"qos_packet_rate_limit_rules_directions\".\n\nI would recommend to go back to an easier table definition, changing the enum name.\n\nThis version works: https://paste.opendev.org/show/807590/","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e3bf31b3216eca571eb39c8c2d371d04d647624d","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        sa.Column(\u0027max_burst_kpps\u0027, sa.Integer()),"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    # To overcome postgreSQL errors on table create"},{"line_number":55,"context_line":"    op.add_column(pps_rule_table_name,"},{"line_number":56,"context_line":"                  sa.Column(\"direction\", direction_enum,"},{"line_number":57,"context_line":"                            server_default\u003dconstants.EGRESS_DIRECTION,"}],"source_content_type":"text/x-python","patch_set":12,"id":"8a25a3ce_2c127605","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":2},"in_reply_to":"1d1ecea1_7b3dadc9","updated":"2021-07-21 03:09:01.000000000","message":"Done, let\u0027s try that.","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"}],"neutron/db/qos/models.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":199,"context_line":"    qos_policy_id \u003d sa.Column(sa.String(36),"},{"line_number":200,"context_line":"                              sa.ForeignKey(\u0027qos_policies.id\u0027,"},{"line_number":201,"context_line":"                                            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":202,"context_line":"                              nullable\u003dFalse)"},{"line_number":203,"context_line":"    max_kpps \u003d sa.Column(sa.Integer)"},{"line_number":204,"context_line":"    max_burst_kpps \u003d sa.Column(sa.Integer)"},{"line_number":205,"context_line":"    revises_on_change \u003d (\u0027qos_policy\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dd5a2ae7_12e9e8e7","line":202,"updated":"2021-06-15 11:04:07.000000000","message":"and index\u003dTrue","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cc8152846dbbe5e2d42b238658aa26e048ae1ac","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    qos_policy_id \u003d sa.Column(sa.String(36),"},{"line_number":200,"context_line":"                              sa.ForeignKey(\u0027qos_policies.id\u0027,"},{"line_number":201,"context_line":"                                            ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":202,"context_line":"                              nullable\u003dFalse)"},{"line_number":203,"context_line":"    max_kpps \u003d sa.Column(sa.Integer)"},{"line_number":204,"context_line":"    max_burst_kpps \u003d sa.Column(sa.Integer)"},{"line_number":205,"context_line":"    revises_on_change \u003d (\u0027qos_policy\u0027,)"}],"source_content_type":"text/x-python","patch_set":2,"id":"328dbe17_b271c1e0","line":202,"in_reply_to":"dd5a2ae7_12e9e8e7","updated":"2021-06-16 02:46:27.000000000","message":"Done","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"}],"neutron/extensions/qos.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":87,"context_line":"    rule_objects \u003d {\u0027bandwidth_limit\u0027: rule_object.QosBandwidthLimitRule,"},{"line_number":88,"context_line":"                    \u0027dscp_marking\u0027: rule_object.QosDscpMarkingRule,"},{"line_number":89,"context_line":"                    \u0027minimum_bandwidth\u0027: rule_object.QosMinimumBandwidthRule,"},{"line_number":90,"context_line":"                    \u0027packet_rate_limit\u0027: rule_object.QosPacketRateLimitRule}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Patterns used to call method proxies for all policy-rule-specific"},{"line_number":93,"context_line":"    # method calls (see __getattr__ docstring, below)."}],"source_content_type":"text/x-python","patch_set":2,"id":"6d3a662e_67df36b8","line":90,"updated":"2021-06-15 11:04:07.000000000","message":"because we are going to add new rules, the end bracket can be defined in the next line, to keep the git history restricted to one single line (as we do in many other places). Something like\n\n    rule_objects \u003d {\u0027bandwidth_limit\u0027: rule_object.QosBandwidthLimitRule,\n                    \u0027dscp_marking\u0027: rule_object.QosDscpMarkingRule,\n                    \u0027minimum_bandwidth\u0027: rule_object.QosMinimumBandwidthRule,\n                    \u0027packet_rate_limit\u0027: rule_object.QosPacketRateLimitRule,\n                    }","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cc8152846dbbe5e2d42b238658aa26e048ae1ac","unresolved":true,"context_lines":[{"line_number":87,"context_line":"    rule_objects \u003d {\u0027bandwidth_limit\u0027: rule_object.QosBandwidthLimitRule,"},{"line_number":88,"context_line":"                    \u0027dscp_marking\u0027: rule_object.QosDscpMarkingRule,"},{"line_number":89,"context_line":"                    \u0027minimum_bandwidth\u0027: rule_object.QosMinimumBandwidthRule,"},{"line_number":90,"context_line":"                    \u0027packet_rate_limit\u0027: rule_object.QosPacketRateLimitRule}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    # Patterns used to call method proxies for all policy-rule-specific"},{"line_number":93,"context_line":"    # method calls (see __getattr__ docstring, below)."}],"source_content_type":"text/x-python","patch_set":2,"id":"2ac54f34_b4329d12","line":90,"in_reply_to":"6d3a662e_67df36b8","updated":"2021-06-16 02:46:27.000000000","message":"It looks a little ugly, but done. 😊","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a56edb956ab7a0c6327e3bcc704466444b5e91c9","unresolved":true,"context_lines":[{"line_number":88,"context_line":"        \u0027bandwidth_limit\u0027: rule_object.QosBandwidthLimitRule,"},{"line_number":89,"context_line":"        \u0027dscp_marking\u0027: rule_object.QosDscpMarkingRule,"},{"line_number":90,"context_line":"        \u0027minimum_bandwidth\u0027: rule_object.QosMinimumBandwidthRule,"},{"line_number":91,"context_line":"        \u0027packet_rate_limit\u0027: rule_object.QosPacketRateLimitRule,"},{"line_number":92,"context_line":"    }"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    # Patterns used to call method proxies for all policy-rule-specific"}],"source_content_type":"text/x-python","patch_set":4,"id":"6a6ac080_c8a8c713","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":64},"updated":"2021-06-16 02:49:01.000000000","message":"Refactor to such style to avoid pep8 E124 error:\n\n./neutron/extensions/qos.py:91:20: E124 closing bracket does not match visual indentation\n                   }\n                   ^\n./neutron/services/qos/qos_plugin.py:78:35: E124 closing bracket does not match visual indentation\n                                  ]","commit_id":"6b463fb12cb50dc1b3c0c0685f23d6909e3062df"}],"neutron/extensions/qos_pps_rule.py":[{"author":{"_account_id":33145,"name":"Kevin Li","email":"liwenhai3@huawei.com","username":"liwenhai"},"change_message_id":"a953294d6132d26dfc53ed793aadee353e1c8979","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa4cc864_c99506c8","line":55,"updated":"2021-07-22 06:42:09.000000000","message":"return [extensions.ResourceExtension(\n                COLLECTION_NAME,\n                controller,\n                parent,\n                attr_map\u003dparams)]","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1d040ad78c36c5e8a4e7771459111f2ddd45725a","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"c1e29eff_f386160d","line":55,"in_reply_to":"437c2e55_92618385","updated":"2021-07-28 11:35:13.000000000","message":"I\u0027m ok with this, I prefer being nitpicking during the first PS.","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":33145,"name":"Kevin Li","email":"liwenhai3@huawei.com","username":"liwenhai"},"change_message_id":"cd8b8710f7a8bd4a357f814453f76ad80ee3c383","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"437c2e55_92618385","line":55,"in_reply_to":"ac3fb428_e794f4a7","updated":"2021-07-23 02:07:00.000000000","message":"I agree it is a valid style. Adding comments cause it seems a code smell. exts is not neccessary","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7b98ca2b13da0d1b457d433a09f54a0d363a0581","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"38fc517d_6c1d52dc","line":55,"in_reply_to":"bbd3836e_f501f618","updated":"2021-07-29 03:35:27.000000000","message":"There are some existing codes which are in similar style as well:\nhttps://github.com/openstack/neutron/blob/master/neutron/extensions/portbindings_extended.py#L67-L77\nhttps://github.com/openstack/neutron/blob/master/neutron/extensions/address_group.py#L47\nhttps://github.com/openstack/neutron/blob/master/neutron/extensions/address_scope.py#L44\n\nSee code search for more examples:\nhttps://codesearch.openstack.org/?q\u003dextensions%5C.ResourceExtension%5C(\u0026i\u003dnope\u0026files\u003d\u0026excludeFiles\u003d\u0026repos\u003d\n\nSo, it should be fine...\n\nAnd yes, as I mentioned before -1 is somtimes serious, it needs to be given carefully based on real important problems. So let\u0027s do not waste bandwidth of upstream reviewers.","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":33145,"name":"Kevin Li","email":"liwenhai3@huawei.com","username":"liwenhai"},"change_message_id":"0e990a371af906d08e25da0fc62831906f64fdb9","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bbd3836e_f501f618","line":55,"in_reply_to":"c1e29eff_f386160d","updated":"2021-07-29 01:42:16.000000000","message":"The reason I pick this one is that I suggest all get_resources() runs with same format. For example, neutron\\extensions\\network_ip_availability.py\n\nI will remove -1 since it is not a significant failure as described in https://docs.openstack.org/project-team-guide/review-the-openstack-way.html","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3ccb8ae6b1373678cb79aab637fdb10c5c262438","unresolved":true,"context_lines":[{"line_number":52,"context_line":"            allow_sorting\u003dTrue)"},{"line_number":53,"context_line":"        exts \u003d ["},{"line_number":54,"context_line":"            extensions.ResourceExtension("},{"line_number":55,"context_line":"                COLLECTION_NAME,"},{"line_number":56,"context_line":"                controller,"},{"line_number":57,"context_line":"                parent,"},{"line_number":58,"context_line":"                attr_map\u003dparams)"}],"source_content_type":"text/x-python","patch_set":15,"id":"ac3fb428_e794f4a7","line":55,"in_reply_to":"fa4cc864_c99506c8","updated":"2021-07-23 01:11:25.000000000","message":"It is a valid style.","commit_id":"8e30639452312019de17f3e1e8364f579752944e"}],"neutron/objects/qos/policy.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":380,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":381,"context_line":"        if _target_version \u003c (1, 9):"},{"line_number":382,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":383,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"45db3fb3_ccf850c7","line":381,"range":{"start_line":381,"start_character":31,"end_line":381,"end_character":34},"updated":"2021-06-15 11:04:07.000000000","message":"ok, that makes sense because GW IP QoS was introduced 3 years ago.\n\n[1]https://review.opendev.org/c/openstack/neutron/+/424468","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f103ccaadbbb2c7fb362e3f6d88ab46a2e585f05","unresolved":true,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":380,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":381,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":382,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":383,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"b931ca67_65ba57f2","line":381,"range":{"start_line":381,"start_character":33,"end_line":381,"end_character":34},"updated":"2021-07-20 11:26:50.000000000","message":"This should be 9.\n\nIn my comment in PS2, what I was saying is that is ok to drop the check for 1.8 because that was introduced 3 years ago. But we must check for 1.9 version here.","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"46ebd9c88b08ecbfc868eac8eee4a4d53a14e586","unresolved":true,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":380,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":381,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":382,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":383,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"be409b26_afdc5af2","line":381,"range":{"start_line":381,"start_character":33,"end_line":381,"end_character":34},"in_reply_to":"328de172_d98255b9","updated":"2021-07-20 13:21:44.000000000","message":"Sorry, I wasn\u0027t clear enough here. This patch is adding a new rule. That was done before. You should implement something like:\nhttps://review.opendev.org/c/openstack/neutron/+/344145/29/neutron/objects/qos/policy.py\nhttps://review.opendev.org/c/openstack/neutron/+/344145/29/neutron/tests/unit/objects/qos/test_policy.py\n\n\n\n    def obj_make_compatible(self, primitive, target_version):\n        def filter_rules(obj_names, rules):\n            return filter(lambda rule:\n                          (rule[\u0027versioned_object.name\u0027] in obj_names), rules)\n        _target_version \u003d versionutils.convert_version_to_tuple(target_version)\n\n        if _target_version \u003c (1, 8):\n            raise exception.IncompatibleObjectVersion(\n                objver\u003dtarget_version, objname\u003dself.__class__.__name__)\n\n        names \u003d [rule_obj_impl.QosBandwidthLimitRule.obj_name(),\n                 rule_obj_impl.QosDscpMarkingRule.obj_name(),\n                 rule_obj_impl.QosMinimumBandwidthRule.obj_name(),\n                ]\n\n        if _target_version \u003e\u003d (1, 9):\n            names.append(rule_obj_impl.QosPacketRateLimitRule.obj_name())\n        if \u0027rules\u0027 in primitive and names:\n            primitive[\u0027rules\u0027] \u003d filter_rules(names, primitive[\u0027rules\u0027])","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"64af38727d672a54419161649f0104cc0e49653c","unresolved":true,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":380,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":381,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":382,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":383,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"328de172_d98255b9","line":381,"range":{"start_line":381,"start_character":33,"end_line":381,"end_character":34},"in_reply_to":"b931ca67_65ba57f2","updated":"2021-07-20 11:52:19.000000000","message":"Met errors on this line:\n\nutron.api.v2.resource   File \"/usr/local/lib/python3.6/site-packages/neutron_lib/db/api.py\", line 179, in wrapped\nutron.api.v2.resource     return f(*dup_args, **dup_kwargs)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/api/v2/base.py\", line 601, in _delete\nutron.api.v2.resource     obj_deleter(request.context, id, **kwargs)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/extensions/qos.py\", line 186, in \u003clambda\u003e\nutron.api.v2.resource     method_name, rule_cls, *args, **kwargs)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/extensions/qos.py\", line 182, in _make_call\nutron.api.v2.resource     context, rule_cls, *args_list, **params\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/services/qos/qos_plugin.py\", line 695, in delete_policy_rule\nutron.api.v2.resource     self.driver_manager.call(qos_consts.UPDATE_POLICY, context, policy)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/services/qos/drivers/manager.py\", line 125, in call\nutron.api.v2.resource     self.push_api.push(context, [policy_obj], rpc_events.UPDATED)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/api/rpc/handlers/resources_rpc.py\", line 245, in push\nutron.api.v2.resource     self._push(context, resource_type, type_resources, event_type)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/api/rpc/handlers/resources_rpc.py\", line 257, in _push\nutron.api.v2.resource     for resource in resource_list]\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/api/rpc/handlers/resources_rpc.py\", line 257, in \u003clistcomp\u003e\nutron.api.v2.resource     for resource in resource_list]\nutron.api.v2.resource   File \"/usr/local/lib/python3.6/site-packages/oslo_versionedobjects/base.py\", line 564, in obj_to_pri\u003e\nutron.api.v2.resource     version_manifest)\nutron.api.v2.resource   File \"/usr/local/lib/python3.6/site-packages/oslo_versionedobjects/base.py\", line 536, in obj_make_c\u003e\nutron.api.v2.resource     return self.obj_make_compatible(primitive, target_version)\nutron.api.v2.resource   File \"/opt/stack/neutron/neutron/objects/qos/policy.py\", line 383, in obj_make_compatible\nutron.api.v2.resource     objver\u003dtarget_version, objname\u003dself.__class__.__name__)\nutron.api.v2.resource oslo_versionedobjects.exception.IncompatibleObjectVersion: Version %(objver)s of %(objname)s is not su\u003e\nutron.api.v2.resource","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e3bf31b3216eca571eb39c8c2d371d04d647624d","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":380,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":381,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":382,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":383,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"32609ec7_c44d944a","line":381,"range":{"start_line":381,"start_character":33,"end_line":381,"end_character":34},"in_reply_to":"be409b26_afdc5af2","updated":"2021-07-21 03:09:01.000000000","message":"Done","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":33145,"name":"Kevin Li","email":"liwenhai3@huawei.com","username":"liwenhai"},"change_message_id":"a953294d6132d26dfc53ed793aadee353e1c8979","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            return [rule for rule in rules if"},{"line_number":382,"context_line":"                    rule[\u0027versioned_object.name\u0027] in obj_names]"},{"line_number":383,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":384,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":385,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":386,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":387,"context_line":"        names \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"b233b5f1_482c52b9","line":384,"updated":"2021-07-22 06:42:09.000000000","message":"if _target_version \u003c (1, 9):\n\nshould current version 1.9?","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1d040ad78c36c5e8a4e7771459111f2ddd45725a","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            return [rule for rule in rules if"},{"line_number":382,"context_line":"                    rule[\u0027versioned_object.name\u0027] in obj_names]"},{"line_number":383,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":384,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":385,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":386,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":387,"context_line":"        names \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"ad243311_1dc4bd5f","line":384,"in_reply_to":"38f529de_76588a79","updated":"2021-07-28 11:35:13.000000000","message":"I was before this patch, this is not changing.","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":33145,"name":"Kevin Li","email":"liwenhai3@huawei.com","username":"liwenhai"},"change_message_id":"cd8b8710f7a8bd4a357f814453f76ad80ee3c383","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            return [rule for rule in rules if"},{"line_number":382,"context_line":"                    rule[\u0027versioned_object.name\u0027] in obj_names]"},{"line_number":383,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":384,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":385,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":386,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":387,"context_line":"        names \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"38f529de_76588a79","line":384,"in_reply_to":"4fc46b45_a0cec1e2","updated":"2021-07-23 02:07:00.000000000","message":"so after adding 1.9, qos policy with 1.8 is still considered as compatible?","commit_id":"8e30639452312019de17f3e1e8364f579752944e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3ccb8ae6b1373678cb79aab637fdb10c5c262438","unresolved":true,"context_lines":[{"line_number":381,"context_line":"            return [rule for rule in rules if"},{"line_number":382,"context_line":"                    rule[\u0027versioned_object.name\u0027] in obj_names]"},{"line_number":383,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":384,"context_line":"        if _target_version \u003c (1, 8):"},{"line_number":385,"context_line":"            raise exception.IncompatibleObjectVersion("},{"line_number":386,"context_line":"                objver\u003dtarget_version, objname\u003dself.__class__.__name__)"},{"line_number":387,"context_line":"        names \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"4fc46b45_a0cec1e2","line":384,"in_reply_to":"b233b5f1_482c52b9","updated":"2021-07-23 01:11:25.000000000","message":"This verison 1.8 means any calls for qos policy with version less than 1.8 will directly return incompatible.\nLine 392 did the work for \u003e\u003d 1.9 changes.","commit_id":"8e30639452312019de17f3e1e8364f579752944e"}],"neutron/services/qos/constants.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"# TODO(liuyulong): Because of the development sequence, the rule must"},{"line_number":18,"context_line":"# be implemented in Nuetron first. Then the following can be moved"},{"line_number":19,"context_line":"# to neutron-lib after neutron has the new rule."},{"line_number":20,"context_line":"# Add qos rule packet rate limit"},{"line_number":21,"context_line":"RULE_TYPE_PACKET_RATE_LIMIT \u003d \u0027packet_rate_limit\u0027"},{"line_number":22,"context_line":"VALID_RULE_TYPES \u003d qos_consts.VALID_RULE_TYPES + [RULE_TYPE_PACKET_RATE_LIMIT]"}],"source_content_type":"text/x-python","patch_set":2,"id":"76d44baf_b876efa9","line":19,"updated":"2021-06-15 11:04:07.000000000","message":"+1","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"}],"neutron/services/qos/qos_plugin.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"427ae725af4c06de86ff4c7abf4dc5409b0ff29f","unresolved":true,"context_lines":[{"line_number":74,"context_line":"                                   qos_bw_minimum_ingress.ALIAS,"},{"line_number":75,"context_line":"                                   qos_rules_alias.ALIAS,"},{"line_number":76,"context_line":"                                   qos_port_network_policy.ALIAS,"},{"line_number":77,"context_line":"                                   qos_pps_rule.ALIAS]"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    __native_pagination_support \u003d True"},{"line_number":80,"context_line":"    __native_sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a27390c_6ec6ebfc","line":77,"updated":"2021-06-15 11:04:07.000000000","message":"same here:\n       ...\n       qos_port_network_policy.ALIAS,\n       qos_pps_rule.ALIAS,\n       ]","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cc8152846dbbe5e2d42b238658aa26e048ae1ac","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                                   qos_bw_minimum_ingress.ALIAS,"},{"line_number":75,"context_line":"                                   qos_rules_alias.ALIAS,"},{"line_number":76,"context_line":"                                   qos_port_network_policy.ALIAS,"},{"line_number":77,"context_line":"                                   qos_pps_rule.ALIAS]"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    __native_pagination_support \u003d True"},{"line_number":80,"context_line":"    __native_sorting_support \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"02367c3f_dacf2edc","line":77,"in_reply_to":"7a27390c_6ec6ebfc","updated":"2021-06-16 02:46:27.000000000","message":"Done","commit_id":"42279bf664f894ed05fdb80d4bea8f1af76dea8e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a56edb956ab7a0c6327e3bcc704466444b5e91c9","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        qos_bw_minimum_ingress.ALIAS,"},{"line_number":76,"context_line":"        qos_rules_alias.ALIAS,"},{"line_number":77,"context_line":"        qos_port_network_policy.ALIAS,"},{"line_number":78,"context_line":"        qos_pps_rule.ALIAS,"},{"line_number":79,"context_line":"    ]"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    __native_pagination_support \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"fd89df5f_eef879cd","line":78,"range":{"start_line":78,"start_character":0,"end_line":78,"end_character":27},"updated":"2021-06-16 02:49:01.000000000","message":"Refactor to such style to avoid pep8 E124 error:\n\n./neutron/extensions/qos.py:91:20: E124 closing bracket does not match visual indentation\n                   }\n                   ^\n./neutron/services/qos/qos_plugin.py:78:35: E124 closing bracket does not match visual indentation\n                                  ]","commit_id":"6b463fb12cb50dc1b3c0c0685f23d6909e3062df"}],"neutron/tests/unit/objects/qos/test_policy.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f103ccaadbbb2c7fb362e3f6d88ab46a2e585f05","unresolved":true,"context_lines":[{"line_number":451,"context_line":"        obj.detach_port(self._port[\u0027id\u0027])"},{"line_number":452,"context_line":"        obj.delete()"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"    def test_object_version_degradation_less_than_1_8(self):"},{"line_number":455,"context_line":"        policy_obj \u003d self._create_test_policy()"},{"line_number":456,"context_line":"        self.assertRaises(exception.IncompatibleObjectVersion,"},{"line_number":457,"context_line":"                          policy_obj.obj_to_primitive, \u00271.7\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"2fb3606c_983bca8c","line":454,"range":{"start_line":454,"start_character":8,"end_line":454,"end_character":53},"updated":"2021-07-20 11:26:50.000000000","message":"That should change to 1.9","commit_id":"3e7b04df755f3e623de73b4d5586a07e22d63c59"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"438ca08978f7cfe3ac7318d7769e37dcbf97ada1","unresolved":true,"context_lines":[{"line_number":454,"context_line":"    def test_object_version_degradation_less_than_1_8(self):"},{"line_number":455,"context_line":"        policy_obj \u003d self._create_test_policy()"},{"line_number":456,"context_line":"        self.assertRaises(exception.IncompatibleObjectVersion,"},{"line_number":457,"context_line":"                          policy_obj.obj_to_primitive, \u00271.7\u0027)"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    @mock.patch.object(policy.QosPolicy, \u0027unset_default\u0027)"},{"line_number":460,"context_line":"    def test_filter_by_shared(self, *mocks):"},{"line_number":461,"context_line":"        project_id \u003d uuidutils.generate_uuid()"},{"line_number":462,"context_line":"        policy_obj \u003d policy.QosPolicy("}],"source_content_type":"text/x-python","patch_set":14,"id":"ab9329ca_36c1cc73","line":459,"range":{"start_line":457,"start_character":61,"end_line":459,"end_character":1},"updated":"2021-07-21 09:20:06.000000000","message":"A test like [1] test_object_version_degradation_1_2_to_1_1 is missing here\n\n\n[1]https://review.opendev.org/c/openstack/neutron/+/344145/29/neutron/tests/unit/objects/qos/test_policy.py","commit_id":"4152ec8889de76b7e52f1b11490898c9bd132108"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"f4677f2db7cf53cd0a1a5e6364e1b7b0ea6ca092","unresolved":false,"context_lines":[{"line_number":454,"context_line":"    def test_object_version_degradation_less_than_1_8(self):"},{"line_number":455,"context_line":"        policy_obj \u003d self._create_test_policy()"},{"line_number":456,"context_line":"        self.assertRaises(exception.IncompatibleObjectVersion,"},{"line_number":457,"context_line":"                          policy_obj.obj_to_primitive, \u00271.7\u0027)"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    @mock.patch.object(policy.QosPolicy, \u0027unset_default\u0027)"},{"line_number":460,"context_line":"    def test_filter_by_shared(self, *mocks):"},{"line_number":461,"context_line":"        project_id \u003d uuidutils.generate_uuid()"},{"line_number":462,"context_line":"        policy_obj \u003d policy.QosPolicy("}],"source_content_type":"text/x-python","patch_set":14,"id":"3a6b9a58_38581acc","line":459,"range":{"start_line":457,"start_character":61,"end_line":459,"end_character":1},"in_reply_to":"6322930c_2309baee","updated":"2021-07-22 06:15:31.000000000","message":"Done","commit_id":"4152ec8889de76b7e52f1b11490898c9bd132108"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"73bf50633b608dec6fd3072fd20ab9a878ded483","unresolved":true,"context_lines":[{"line_number":454,"context_line":"    def test_object_version_degradation_less_than_1_8(self):"},{"line_number":455,"context_line":"        policy_obj \u003d self._create_test_policy()"},{"line_number":456,"context_line":"        self.assertRaises(exception.IncompatibleObjectVersion,"},{"line_number":457,"context_line":"                          policy_obj.obj_to_primitive, \u00271.7\u0027)"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    @mock.patch.object(policy.QosPolicy, \u0027unset_default\u0027)"},{"line_number":460,"context_line":"    def test_filter_by_shared(self, *mocks):"},{"line_number":461,"context_line":"        project_id \u003d uuidutils.generate_uuid()"},{"line_number":462,"context_line":"        policy_obj \u003d policy.QosPolicy("}],"source_content_type":"text/x-python","patch_set":14,"id":"6322930c_2309baee","line":459,"range":{"start_line":457,"start_character":61,"end_line":459,"end_character":1},"in_reply_to":"ab9329ca_36c1cc73","updated":"2021-07-21 20:00:49.000000000","message":"I agree with Rodolfo. Please add proper test here","commit_id":"4152ec8889de76b7e52f1b11490898c9bd132108"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1d040ad78c36c5e8a4e7771459111f2ddd45725a","unresolved":true,"context_lines":[{"line_number":479,"context_line":"        self.assertIn(rule_objs[0], policy_obj_v1_8.rules)"},{"line_number":480,"context_line":"        self.assertIn(rule_objs[1], policy_obj_v1_8.rules)"},{"line_number":481,"context_line":"        self.assertIn(rule_objs[2], policy_obj_v1_8.rules)"},{"line_number":482,"context_line":"        self.assertNotIn(rule_objs[3], policy_obj_v1_8.rules)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    @mock.patch.object(policy.QosPolicy, \u0027unset_default\u0027)"},{"line_number":485,"context_line":"    def test_filter_by_shared(self, *mocks):"}],"source_content_type":"text/x-python","patch_set":15,"id":"c59077bc_4db36004","line":482,"range":{"start_line":482,"start_character":8,"end_line":482,"end_character":61},"updated":"2021-07-28 11:35:13.000000000","message":"+1 !","commit_id":"8e30639452312019de17f3e1e8364f579752944e"}]}
