)]}'
{"doc/source/admin/config-qos-min-bw.rst":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"59a31339b1821dd0962d6a93b99ca406473e43aa","unresolved":false,"context_lines":[{"line_number":66,"context_line":"  If the VM was booted with port without QoS policy and ``minimum_bandwidth``"},{"line_number":67,"context_line":"  rules the update will still be rejected, but if the VM was booted with a"},{"line_number":68,"context_line":"  port with QoS policy and ``minimum_bandwidth`` rules the update is possible"},{"line_number":69,"context_line":"  and the allocations are changed in placement as well."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* The first data-plane-only Guaranteed Minimum Bandwidth implementation"},{"line_number":72,"context_line":"  (for SR-IOV egress traffic) was released in the Newton"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f560f44_21e95fe2","line":69,"updated":"2020-09-09 15:49:25.000000000","message":"nit: if needed, in a follow-up patch: document the case when the port QoS is removed (we can\u0027t then update it again)","commit_id":"d466cba590cad6151302df8a7e04b6cfd6c1350a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"14f3525c52b054b00b3f2fe906b5e22797459d99","unresolved":false,"context_lines":[{"line_number":66,"context_line":"  If the VM was booted with port without QoS policy and ``minimum_bandwidth``"},{"line_number":67,"context_line":"  rules the update will still be rejected, but if the VM was booted with a"},{"line_number":68,"context_line":"  port with QoS policy and ``minimum_bandwidth`` rules the update is possible"},{"line_number":69,"context_line":"  and the allocations are changed in placement as well."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"* The first data-plane-only Guaranteed Minimum Bandwidth implementation"},{"line_number":72,"context_line":"  (for SR-IOV egress traffic) was released in the Newton"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f560f44_fb4f028f","line":69,"in_reply_to":"9f560f44_21e95fe2","updated":"2020-09-10 08:27:33.000000000","message":"I added a sentence to cover that","commit_id":"d466cba590cad6151302df8a7e04b6cfd6c1350a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0a335c62ca343ad8a3740edcb719b6e94997b066","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  effect. That is ports of the QoS policy are not yet used by Nova. Requests"},{"line_number":62,"context_line":"  to change guarantees of in-use policies are rejected."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* Changing the QoS policy of the port with new ``minimum_bandwidth`` rules"},{"line_number":65,"context_line":"  changes placement ``allocations`` from Victoria release."},{"line_number":66,"context_line":"  If the VM was booted with port without QoS policy and ``minimum_bandwidth``"},{"line_number":67,"context_line":"  rules the port update succeeds but placement allocations will not change."},{"line_number":68,"context_line":"  The same is true if the port has no ``binding:profile``, thus no placement"},{"line_number":69,"context_line":"  allocation record exists for it.But if the VM was booted with a port with"},{"line_number":70,"context_line":"  QoS policy and ``minimum_bandwidth`` rules the update is possible and the"},{"line_number":71,"context_line":"  allocations are changed in placement as well. ``Note``: as it is possible"},{"line_number":72,"context_line":"  to update a port to remove the QoS policy, updating it back to have QoS"},{"line_number":73,"context_line":"  policy with ``minimum_bandwidth`` rule is not possible."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* The first data-plane-only Guaranteed Minimum Bandwidth implementation"},{"line_number":76,"context_line":"  (for SR-IOV egress traffic) was released in the Newton"}],"source_content_type":"text/x-rst","patch_set":18,"id":"9f560f44_399c8b5a","line":73,"range":{"start_line":64,"start_character":1,"end_line":73,"end_character":57},"updated":"2020-09-15 18:19:48.000000000","message":"so this is a incomplete implematnion fo a new feature.\nwe are pass the feature freeze deadline at this point and it depend on change to neutron-lib so i think this should be defered until wallaby when the other cases can be supported.\n\ni also would have expecte this to be tracked by a spec not a bug.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"eb64471ad9e508fb0946f59bbf22440975df7304","unresolved":false,"context_lines":[{"line_number":61,"context_line":"  effect. That is ports of the QoS policy are not yet used by Nova. Requests"},{"line_number":62,"context_line":"  to change guarantees of in-use policies are rejected."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* Changing the QoS policy of the port with new ``minimum_bandwidth`` rules"},{"line_number":65,"context_line":"  changes placement ``allocations`` from Victoria release."},{"line_number":66,"context_line":"  If the VM was booted with port without QoS policy and ``minimum_bandwidth``"},{"line_number":67,"context_line":"  rules the port update succeeds but placement allocations will not change."},{"line_number":68,"context_line":"  The same is true if the port has no ``binding:profile``, thus no placement"},{"line_number":69,"context_line":"  allocation record exists for it.But if the VM was booted with a port with"},{"line_number":70,"context_line":"  QoS policy and ``minimum_bandwidth`` rules the update is possible and the"},{"line_number":71,"context_line":"  allocations are changed in placement as well. ``Note``: as it is possible"},{"line_number":72,"context_line":"  to update a port to remove the QoS policy, updating it back to have QoS"},{"line_number":73,"context_line":"  policy with ``minimum_bandwidth`` rule is not possible."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* The first data-plane-only Guaranteed Minimum Bandwidth implementation"},{"line_number":76,"context_line":"  (for SR-IOV egress traffic) was released in the Newton"}],"source_content_type":"text/x-rst","patch_set":18,"id":"9f560f44_814555b7","line":73,"range":{"start_line":64,"start_character":1,"end_line":73,"end_character":57},"in_reply_to":"9f560f44_399c8b5a","updated":"2020-09-16 09:00:45.000000000","message":"This covers the the problem described in the bug (https://bugs.launchpad.net/neutron/+bug/1882804 ) and\nthere is a spec for it as well: \nhttps://blueprints.launchpad.net/neutron/+spec/replace-qos-of-bound-port\n\nThe neutron-lib patch you refer (https://review.opendev.org/750349 ) is to fix the use case when the new QoS policy has 0 min_kbps.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":73,"context_line":".. note::"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"  As it is possible to update a port to remove the QoS policy, updating it"},{"line_number":76,"context_line":"  back to have QoS policy with ``minimum_bandwidth`` rule is not possible."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":".. note::"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"9f560f44_25a7e70b","line":76,"updated":"2020-09-21 12:56:02.000000000","message":"so, am I understanding correct that something like:\n\n1. create port with min bw QoS rule,\n2. update port to not have QoS policy with min bw anymore\n3. update port with new (or the same QoS policy) with min bw \u003c-- that will fail\n\nIs that correct?","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":73,"context_line":".. note::"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"  As it is possible to update a port to remove the QoS policy, updating it"},{"line_number":76,"context_line":"  back to have QoS policy with ``minimum_bandwidth`` rule is not possible."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":".. note::"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"9f560f44_803341f6","line":76,"in_reply_to":"9f560f44_25a7e70b","updated":"2020-09-21 14:43:31.000000000","message":"I updated it, the note was misleading after the last changes.\nSo only placement allocation \"re-creation\" will not happen.","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"}],"neutron/services/qos/qos_plugin.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"455029001bb0e2760fb7e58753ed74edd944236f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"from neutron_lib.placement import client as pl_client"},{"line_number":38,"context_line":"from neutron_lib.placement import constants as pl_constants"},{"line_number":39,"context_line":"from neutron_lib.placement import utils as pl_utils"},{"line_number":40,"context_line":"from neutron_lib.plugins import utils as p_utils"},{"line_number":41,"context_line":"from neutron_lib.services.qos import constants as qos_consts"},{"line_number":42,"context_line":"from oslo_config import cfg"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_12158249","line":40,"updated":"2020-08-24 22:20:45.000000000","message":"pep8: F401 \u0027neutron_lib.plugins.utils as p_utils\u0027 imported but unused","commit_id":"f3bfffc0cbfd551baa3b6b0d48eb5523bbe9a1ee"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"455029001bb0e2760fb7e58753ed74edd944236f","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        self.validate_policy_for_port(context, policy, port)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def _validate_port_before_update_callback(self, resource, event, trigger,"},{"line_number":192,"context_line":"                                              **kwargs ):"},{"line_number":193,"context_line":"        if not kwargs[\u0027original_port\u0027].get(\u0027id\u0027):"},{"line_number":194,"context_line":"            return"},{"line_number":195,"context_line":"        context \u003d kwargs[\u0027context\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_720f9e36","line":192,"updated":"2020-08-24 22:20:45.000000000","message":"pep8: E202 whitespace before \u0027)\u0027","commit_id":"f3bfffc0cbfd551baa3b6b0d48eb5523bbe9a1ee"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c4af29f9ac3a0c3b4cd2548c1ebd68bbf0d225a","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                _placement_client.update_qos_minbw_allocation("},{"line_number":243,"context_line":"                    consumer_uuid\u003ddevice_id, minbw_alloc_diff\u003dalloc_diff,"},{"line_number":244,"context_line":"                    rp_uuid\u003drp_uuid)"},{"line_number":245,"context_line":"            except ks_exc.Conflict as e:"},{"line_number":246,"context_line":"                LOG.error(\u0027There is no available inventory to update %s\u0027,"},{"line_number":247,"context_line":"                          e.response.json())"},{"line_number":248,"context_line":"            except pl_exc.PlacementAllocationGenerationConflict as e:"},{"line_number":249,"context_line":"                LOG.error(e)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _validate_update_port_callback(self, resource, event, trigger,"},{"line_number":252,"context_line":"                                       payload\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_5e5c214a","line":249,"range":{"start_line":245,"start_character":1,"end_line":249,"end_character":28},"updated":"2020-08-25 09:38:54.000000000","message":"I think we have to make sure that we don\u0027t record the updated qos values in the neutron db in this case.","commit_id":"f3bfffc0cbfd551baa3b6b0d48eb5523bbe9a1ee"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c4af29f9ac3a0c3b4cd2548c1ebd68bbf0d225a","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                          e.response.json())"},{"line_number":248,"context_line":"            except pl_exc.PlacementAllocationGenerationConflict as e:"},{"line_number":249,"context_line":"                LOG.error(e)"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    def _validate_update_port_callback(self, resource, event, trigger,"},{"line_number":252,"context_line":"                                       payload\u003dNone):"},{"line_number":253,"context_line":"        context \u003d payload.context"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_49b46df2","line":250,"updated":"2020-08-25 09:38:54.000000000","message":"Also if the db update fails on the neutron side after the placement update succeeded then the placement update needs to be reverted or there will be discrepancy between the neutron qos value and the placement resource allocation.","commit_id":"f3bfffc0cbfd551baa3b6b0d48eb5523bbe9a1ee"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1fffaa6e15a622dbd9c571d8a39aa50ebe0f27d2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron_lib.db import api as db_api"},{"line_number":33,"context_line":"from neutron_lib.db import resource_extend"},{"line_number":34,"context_line":"from neutron_lib import exceptions as lib_exc"},{"line_number":35,"context_line":"from neutron_lib.exceptions import placement as pl_exc"},{"line_number":36,"context_line":"from neutron_lib.exceptions import qos as qos_exc"},{"line_number":37,"context_line":"from neutron_lib.placement import client as pl_client"},{"line_number":38,"context_line":"from neutron_lib.placement import constants as pl_constants"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_a7d4b1ea","line":35,"updated":"2020-09-03 16:17:59.000000000","message":"pep8: F401 \u0027neutron_lib.exceptions.placement as pl_exc\u0027 imported but unused","commit_id":"2c90966da09028f8eff8360a58e53947b4b66e60"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"0bc67efffff933851204f4384d42518f6b8d2d42","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            return"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":204,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":205,"context_line":"        policy \u003d None"},{"line_number":206,"context_line":"        if policy_id:"},{"line_number":207,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_13b49f81","line":204,"range":{"start_line":204,"start_character":35,"end_line":204,"end_character":53},"updated":"2020-09-07 04:09:51.000000000","message":"should it be checked for None as well?","commit_id":"e61ca721cb018e9851c1cc615f72cb6ce98f7d55"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"530171601dbf8d0c053458d9ff8ac9306cd1bc52","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            return"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":204,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":205,"context_line":"        policy \u003d None"},{"line_number":206,"context_line":"        if policy_id:"},{"line_number":207,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_f55aabef","line":204,"range":{"start_line":204,"start_character":35,"end_line":204,"end_character":53},"in_reply_to":"9f560f44_13b49f81","updated":"2020-09-07 13:10:06.000000000","message":"valid question.\nNow if original_policy_id is None that is the case when no previous bw allocation happened, no allocation field in binding:profile, and l237. handles that with raising exception.\nAs I see if o_policy_id is none, exception can be raised as well.","commit_id":"e61ca721cb018e9851c1cc615f72cb6ce98f7d55"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"6fb787d71b63ebcc6f58e43eef78d57d6cc9fbcc","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        else:"},{"line_number":231,"context_line":"            desired_rules \u003d [{\u0027direction\u0027: \u0027egress\u0027, \u0027min_kbps\u0027: 0},"},{"line_number":232,"context_line":"                             {\u0027direction\u0027: \u0027ingress\u0027, \u0027min_kbps\u0027: 0}]"},{"line_number":233,"context_line":"        for o_rule in original_rules:"},{"line_number":234,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":235,"context_line":"                o_dir \u003d o_rule.get(\u0027direction\u0027)"},{"line_number":236,"context_line":"                for d_rule in desired_rules:"},{"line_number":237,"context_line":"                    if (isinstance(d_rule,"},{"line_number":238,"context_line":"                                   rule_object.QosMinimumBandwidthRule) or"},{"line_number":239,"context_line":"                            isinstance(d_rule, dict)):"},{"line_number":240,"context_line":"                        d_dir \u003d d_rule.get(\u0027direction\u0027)"},{"line_number":241,"context_line":"                        if (o_dir \u003d\u003d d_dir and"},{"line_number":242,"context_line":"                                o_rule.min_kbps !\u003d d_rule.get(\u0027min_kbps\u0027)):"},{"line_number":243,"context_line":"                            update_allocation \u003d True"},{"line_number":244,"context_line":"                            d_mkbps \u003d d_rule.get(\u0027min_kbps\u0027)"},{"line_number":245,"context_line":"                            diff \u003d d_mkbps - o_rule.min_kbps"},{"line_number":246,"context_line":"                            if d_dir \u003d\u003d \u0027egress\u0027:"},{"line_number":247,"context_line":"                                drctn \u003d pl_constants.CLASS_NET_BW_EGRESS_KBPS"},{"line_number":248,"context_line":"                                alloc_diff[drctn] \u003d diff"},{"line_number":249,"context_line":"                            else:"},{"line_number":250,"context_line":"                                drctn \u003d pl_constants.CLASS_NET_BW_INGRESS_KBPS"},{"line_number":251,"context_line":"                                alloc_diff[drctn] \u003d diff"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        if update_allocation:"},{"line_number":254,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_4ab0288c","line":251,"range":{"start_line":233,"start_character":8,"end_line":251,"end_character":56},"updated":"2020-09-04 16:18:45.000000000","message":"perhaps cut this to pieces, to avoid nasty nested thing and terrible indentation","commit_id":"e61ca721cb018e9851c1cc615f72cb6ce98f7d55"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"0bc67efffff933851204f4384d42518f6b8d2d42","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        else:"},{"line_number":231,"context_line":"            desired_rules \u003d [{\u0027direction\u0027: \u0027egress\u0027, \u0027min_kbps\u0027: 0},"},{"line_number":232,"context_line":"                             {\u0027direction\u0027: \u0027ingress\u0027, \u0027min_kbps\u0027: 0}]"},{"line_number":233,"context_line":"        for o_rule in original_rules:"},{"line_number":234,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":235,"context_line":"                o_dir \u003d o_rule.get(\u0027direction\u0027)"},{"line_number":236,"context_line":"                for d_rule in desired_rules:"},{"line_number":237,"context_line":"                    if (isinstance(d_rule,"},{"line_number":238,"context_line":"                                   rule_object.QosMinimumBandwidthRule) or"},{"line_number":239,"context_line":"                            isinstance(d_rule, dict)):"},{"line_number":240,"context_line":"                        d_dir \u003d d_rule.get(\u0027direction\u0027)"},{"line_number":241,"context_line":"                        if (o_dir \u003d\u003d d_dir and"},{"line_number":242,"context_line":"                                o_rule.min_kbps !\u003d d_rule.get(\u0027min_kbps\u0027)):"},{"line_number":243,"context_line":"                            update_allocation \u003d True"},{"line_number":244,"context_line":"                            d_mkbps \u003d d_rule.get(\u0027min_kbps\u0027)"},{"line_number":245,"context_line":"                            diff \u003d d_mkbps - o_rule.min_kbps"},{"line_number":246,"context_line":"                            if d_dir \u003d\u003d \u0027egress\u0027:"},{"line_number":247,"context_line":"                                drctn \u003d pl_constants.CLASS_NET_BW_EGRESS_KBPS"},{"line_number":248,"context_line":"                                alloc_diff[drctn] \u003d diff"},{"line_number":249,"context_line":"                            else:"},{"line_number":250,"context_line":"                                drctn \u003d pl_constants.CLASS_NET_BW_INGRESS_KBPS"},{"line_number":251,"context_line":"                                alloc_diff[drctn] \u003d diff"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        if update_allocation:"},{"line_number":254,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_73a4fb4b","line":251,"range":{"start_line":233,"start_character":8,"end_line":251,"end_character":56},"in_reply_to":"9f560f44_4ab0288c","updated":"2020-09-07 04:09:51.000000000","message":"+1","commit_id":"e61ca721cb018e9851c1cc615f72cb6ce98f7d55"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"abd1629bc8ba4c46a4d268b56c16a7d4e94afe81","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _check_port_for_placement_allocation_change(self, resource, event,"},{"line_number":191,"context_line":"                                                    trigger, **kwargs):"},{"line_number":192,"context_line":"        if not kwargs[\u0027original_port\u0027].get(\u0027id\u0027):"},{"line_number":193,"context_line":"            return"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        context \u003d kwargs[\u0027context\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_9ca4374d","line":192,"updated":"2020-09-07 15:47:26.000000000","message":"Why this check? Shouldn\u0027t original_port always have an ID?","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a214949af2109d564ad9e0d971d360bcc3051f8a","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _check_port_for_placement_allocation_change(self, resource, event,"},{"line_number":191,"context_line":"                                                    trigger, **kwargs):"},{"line_number":192,"context_line":"        if not kwargs[\u0027original_port\u0027].get(\u0027id\u0027):"},{"line_number":193,"context_line":"            return"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        context \u003d kwargs[\u0027context\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_bba4984c","line":192,"in_reply_to":"9f560f44_9ca4374d","updated":"2020-09-08 10:51:16.000000000","message":"thanks, that was most possibly some leftover from earlier experience.","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"abd1629bc8ba4c46a4d268b56c16a7d4e94afe81","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            return"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":204,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":205,"context_line":"        policy \u003d None"},{"line_number":206,"context_line":"        if policy_id:"},{"line_number":207,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_9c79d7c6","line":204,"range":{"start_line":204,"start_character":35,"end_line":204,"end_character":53},"updated":"2020-09-07 15:47:26.000000000","message":"And if \"original_policy_id\" is None?","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a214949af2109d564ad9e0d971d360bcc3051f8a","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            return"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":204,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":205,"context_line":"        policy \u003d None"},{"line_number":206,"context_line":"        if policy_id:"},{"line_number":207,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_7b0a0026","line":204,"range":{"start_line":204,"start_character":35,"end_line":204,"end_character":53},"in_reply_to":"9f560f44_9c79d7c6","updated":"2020-09-08 10:51:16.000000000","message":"As gibi wrote (see https://review.opendev.org/#/c/743695/4/tempest/scenario/test_minbw_allocation_placement.py@277 ) that is a hard thing as there is no RP associated to the port.\nI added the raise NotImplementedError for that, I left a similar check @l240 to raise the same if there is no allocation key in binding:profile, though that is overlap with this condition for original qos_policy_id,.","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"abd1629bc8ba4c46a4d268b56c16a7d4e94afe81","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                              orig_port)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _prepare_allocation_needs(self, original_rule, desired_rule):"},{"line_number":217,"context_line":"        if (isinstance(desired_rule, rule_object.QosMinimumBandwidthRule) or"},{"line_number":218,"context_line":"                isinstance(desired_rule, dict)):"},{"line_number":219,"context_line":"            o_dir \u003d original_rule.get(\u0027direction\u0027)"},{"line_number":220,"context_line":"            o_minkbps \u003d original_rule.min_kbps"},{"line_number":221,"context_line":"            d_minkbps \u003d desired_rule.get(\u0027min_kbps\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_5f38d1d1","line":218,"range":{"start_line":217,"start_character":11,"end_line":218,"end_character":46},"updated":"2020-09-07 15:47:26.000000000","message":"We use \"isinstance(desired_rule,  rule_object.QosMinimumBandwidthRule)\" to determine the type of rule.\n\n1) When \"desired_rule\" could be a dict?\n\n2) If \"desired_rule\" is a dict, how can you know the type?","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a214949af2109d564ad9e0d971d360bcc3051f8a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                              orig_port)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def _prepare_allocation_needs(self, original_rule, desired_rule):"},{"line_number":217,"context_line":"        if (isinstance(desired_rule, rule_object.QosMinimumBandwidthRule) or"},{"line_number":218,"context_line":"                isinstance(desired_rule, dict)):"},{"line_number":219,"context_line":"            o_dir \u003d original_rule.get(\u0027direction\u0027)"},{"line_number":220,"context_line":"            o_minkbps \u003d original_rule.min_kbps"},{"line_number":221,"context_line":"            d_minkbps \u003d desired_rule.get(\u0027min_kbps\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_d6184377","line":218,"range":{"start_line":217,"start_character":11,"end_line":218,"end_character":46},"in_reply_to":"9f560f44_5f38d1d1","updated":"2020-09-08 10:51:16.000000000","message":"That is the case when there is no new qos_policy, so we update the port and remove the qos_policy, see @l249","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"abd1629bc8ba4c46a4d268b56c16a7d4e94afe81","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            d_dir \u003d desired_rule.get(\u0027direction\u0027)"},{"line_number":223,"context_line":"            if o_dir \u003d\u003d d_dir and o_minkbps !\u003d d_minkbps:"},{"line_number":224,"context_line":"                diff \u003d d_minkbps - o_minkbps"},{"line_number":225,"context_line":"                if d_dir \u003d\u003d \u0027egress\u0027:"},{"line_number":226,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_EGRESS_KBPS"},{"line_number":227,"context_line":"                else:"},{"line_number":228,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_INGRESS_KBPS"},{"line_number":229,"context_line":"                return {drctn: diff}"},{"line_number":230,"context_line":"        return {}"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_1f58192f","line":228,"range":{"start_line":225,"start_character":16,"end_line":228,"end_character":66},"updated":"2020-09-07 15:47:26.000000000","message":"This and [1] should be a constant dictionary in n-lib/placement/constants.py\n\n\n\n[1]https://github.com/openstack/neutron/blob/b78a953d7f14a337662cdbae9328498ba0c9168c/neutron/services/qos/qos_plugin.py#L110-L115","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"086f97414a84aa078392ff5ae494ab676227d300","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            d_dir \u003d desired_rule.get(\u0027direction\u0027)"},{"line_number":223,"context_line":"            if o_dir \u003d\u003d d_dir and o_minkbps !\u003d d_minkbps:"},{"line_number":224,"context_line":"                diff \u003d d_minkbps - o_minkbps"},{"line_number":225,"context_line":"                if d_dir \u003d\u003d \u0027egress\u0027:"},{"line_number":226,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_EGRESS_KBPS"},{"line_number":227,"context_line":"                else:"},{"line_number":228,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_INGRESS_KBPS"},{"line_number":229,"context_line":"                return {drctn: diff}"},{"line_number":230,"context_line":"        return {}"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_bf464d4f","line":228,"range":{"start_line":225,"start_character":16,"end_line":228,"end_character":66},"in_reply_to":"9f560f44_1f58192f","updated":"2020-09-07 15:47:48.000000000","message":"^^^ This is a nit","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a214949af2109d564ad9e0d971d360bcc3051f8a","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            d_dir \u003d desired_rule.get(\u0027direction\u0027)"},{"line_number":223,"context_line":"            if o_dir \u003d\u003d d_dir and o_minkbps !\u003d d_minkbps:"},{"line_number":224,"context_line":"                diff \u003d d_minkbps - o_minkbps"},{"line_number":225,"context_line":"                if d_dir \u003d\u003d \u0027egress\u0027:"},{"line_number":226,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_EGRESS_KBPS"},{"line_number":227,"context_line":"                else:"},{"line_number":228,"context_line":"                    drctn \u003d pl_constants.CLASS_NET_BW_INGRESS_KBPS"},{"line_number":229,"context_line":"                return {drctn: diff}"},{"line_number":230,"context_line":"        return {}"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_db034c0f","line":228,"range":{"start_line":225,"start_character":16,"end_line":228,"end_character":66},"in_reply_to":"9f560f44_bf464d4f","updated":"2020-09-08 10:51:16.000000000","message":"I added  a todo for it","commit_id":"1034dfc86b58b8493551f03c528ec677d2bc5498"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"11712a120008a4510c92736da00f55bd3d3f8e55","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        context \u003d kwargs[\u0027context\u0027]"},{"line_number":193,"context_line":"        orig_port \u003d kwargs[\u0027original_port\u0027]"},{"line_number":194,"context_line":"        original_policy_id \u003d orig_port.get(qos_consts.QOS_POLICY_ID)"},{"line_number":195,"context_line":"        if not original_policy_id:"},{"line_number":196,"context_line":"            raise NotImplementedError(_("},{"line_number":197,"context_line":"                \u0027Cannot update QoS of bound port without QoS policy with \u0027"},{"line_number":198,"context_line":"                \u0027minimum bandwidth rule\u0027))"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        policy_id \u003d kwargs[\u0027port\u0027].get(qos_consts.QOS_POLICY_ID)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f560f44_955fcee3","line":198,"range":{"start_line":195,"start_character":0,"end_line":198,"end_character":42},"updated":"2020-09-09 07:54:23.000000000","message":"This is a too early check, the safe way for catching this case seems to be to check the binding:profile field of the port in l240","commit_id":"dfea84911e1d7cc1e0adbb610d0fd95db166f04d"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8df7baaa6d1240bb50060b7229ffeaab596d94d8","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                                     orig_port):"},{"line_number":233,"context_line":"        alloc_diff \u003d {}"},{"line_number":234,"context_line":"        rp_uuid \u003d orig_port[\u0027binding:profile\u0027].get(\u0027allocation\u0027)"},{"line_number":235,"context_line":"        if not rp_uuid:"},{"line_number":236,"context_line":"            raise NotImplementedError(_("},{"line_number":237,"context_line":"                \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":238,"context_line":"                \u0027use QoS policy with minimum bandwidth rule\u0027))"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        device_id \u003d orig_port[\u0027device_id\u0027]"},{"line_number":241,"context_line":"        original_rules \u003d original_policy.rules"}],"source_content_type":"text/x-python","patch_set":9,"id":"9f560f44_eacbc16e","line":238,"range":{"start_line":235,"start_character":0,"end_line":238,"end_character":62},"updated":"2020-09-09 14:25:36.000000000","message":"move this check to where we can be sure that the rules are minbw rules","commit_id":"24aec0eeb4982804166fbf6c2009f330b45ceb29"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"59a31339b1821dd0962d6a93b99ca406473e43aa","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            if not rp_uuid:"},{"line_number":249,"context_line":"                raise NotImplementedError(_("},{"line_number":250,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":251,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"},{"line_number":252,"context_line":"            try:"},{"line_number":253,"context_line":"                self._placement_client.update_qos_minbw_allocation("},{"line_number":254,"context_line":"                    consumer_uuid\u003ddevice_id, minbw_alloc_diff\u003dalloc_diff,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_e1464721","line":251,"updated":"2020-09-09 15:49:25.000000000","message":"as commented in [1], if the port qos is deleted, we won\u0027t be able to update it again\n\n[1]https://review.opendev.org/#/c/743695/4/tempest/scenario/test_minbw_allocation_placement.py@277","commit_id":"d466cba590cad6151302df8a7e04b6cfd6c1350a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d163ab2247ac5317b65f3c4074914cc958100394","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            if not rp_uuid:"},{"line_number":249,"context_line":"                raise NotImplementedError(_("},{"line_number":250,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":251,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"},{"line_number":252,"context_line":"            try:"},{"line_number":253,"context_line":"                self._placement_client.update_qos_minbw_allocation("},{"line_number":254,"context_line":"                    consumer_uuid\u003ddevice_id, minbw_alloc_diff\u003dalloc_diff,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f560f44_bbff4a00","line":251,"in_reply_to":"9f560f44_e1464721","updated":"2020-09-10 08:28:37.000000000","message":"thanks for highlighting this, I added a line to the doc","commit_id":"d466cba590cad6151302df8a7e04b6cfd6c1350a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b031da08fc84587678707fed44c7b365a551e535","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if policy_id \u003d\u003d original_policy_id:"},{"line_number":198,"context_line":"            return"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_e9c101e6","line":201,"range":{"start_line":200,"start_character":8,"end_line":201,"end_character":54},"updated":"2020-09-10 05:05:47.000000000","message":"won\u0027t this raise NotFound right away if original_policy_id is None?","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"14f3525c52b054b00b3f2fe906b5e22797459d99","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        if policy_id \u003d\u003d original_policy_id:"},{"line_number":198,"context_line":"            return"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_1b8bd61e","line":201,"range":{"start_line":200,"start_character":8,"end_line":201,"end_character":54},"in_reply_to":"9f560f44_e9c101e6","updated":"2020-09-10 08:27:33.000000000","message":"that would be my first idea as well but here:\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/objects/qos/policy.py#L156-L157\n it returns None","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b031da08fc84587678707fed44c7b365a551e535","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for bound ports"},{"line_number":207,"context_line":"        if (nl_constants.DEVICE_OWNER_COMPUTE_PREFIX in"},{"line_number":208,"context_line":"                orig_port[\u0027device_owner\u0027]):"},{"line_number":209,"context_line":"            self._change_placement_allocation(original_policy, policy,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_299f7902","line":206,"range":{"start_line":206,"start_character":27,"end_line":206,"end_character":32},"updated":"2020-09-10 05:05:47.000000000","message":"nit: compute","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"14f3525c52b054b00b3f2fe906b5e22797459d99","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for bound ports"},{"line_number":207,"context_line":"        if (nl_constants.DEVICE_OWNER_COMPUTE_PREFIX in"},{"line_number":208,"context_line":"                orig_port[\u0027device_owner\u0027]):"},{"line_number":209,"context_line":"            self._change_placement_allocation(original_policy, policy,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_5b438e6c","line":206,"range":{"start_line":206,"start_character":27,"end_line":206,"end_character":32},"in_reply_to":"9f560f44_299f7902","updated":"2020-09-10 08:27:33.000000000","message":"thanks, done","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b031da08fc84587678707fed44c7b365a551e535","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        any_rules_minbw \u003d any("},{"line_number":245,"context_line":"            [isinstance(r, rule_object.QosMinimumBandwidthRule)"},{"line_number":246,"context_line":"             for r in desired_rules])"},{"line_number":247,"context_line":"        if not original_rules and any_rules_minbw:"},{"line_number":248,"context_line":"            raise NotImplementedError(_("},{"line_number":249,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":250,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_e4876860","line":247,"range":{"start_line":247,"start_character":11,"end_line":247,"end_character":29},"updated":"2020-09-10 05:05:47.000000000","message":"I\u0027m b bit confused about the difference between \u0027not rp_uuid\u0027 and \u0027not original_rules\u0027. If there is no difference then please use same here and at #257; if there is - then maybe error message should differ as well.","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"14f3525c52b054b00b3f2fe906b5e22797459d99","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        any_rules_minbw \u003d any("},{"line_number":245,"context_line":"            [isinstance(r, rule_object.QosMinimumBandwidthRule)"},{"line_number":246,"context_line":"             for r in desired_rules])"},{"line_number":247,"context_line":"        if not original_rules and any_rules_minbw:"},{"line_number":248,"context_line":"            raise NotImplementedError(_("},{"line_number":249,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":250,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_3b14da4c","line":247,"range":{"start_line":247,"start_character":11,"end_line":247,"end_character":29},"in_reply_to":"9f560f44_e4876860","updated":"2020-09-10 08:27:33.000000000","message":"you are right, I checked again, and the condition which is simpler is not needed, but this one can cover that as well, to keep \"old\" QoS use cases with bandwidth_limit and DSCP work, and deny update of port without QoS policy to a QoS policy with min_bw, as placement and nova scheduling is needed for that.","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"64efbad5c07553969d67fa6cf0a1da1ada730c50","unresolved":false,"context_lines":[{"line_number":241,"context_line":"            desired_rules \u003d [{\u0027direction\u0027: \u0027egress\u0027, \u0027min_kbps\u0027: 0},"},{"line_number":242,"context_line":"                             {\u0027direction\u0027: \u0027ingress\u0027, \u0027min_kbps\u0027: 0}]"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        any_rules_minbw \u003d any("},{"line_number":245,"context_line":"            [isinstance(r, rule_object.QosMinimumBandwidthRule)"},{"line_number":246,"context_line":"             for r in desired_rules])"},{"line_number":247,"context_line":"        if not original_rules and any_rules_minbw:"},{"line_number":248,"context_line":"            raise NotImplementedError(_("},{"line_number":249,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":250,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"},{"line_number":251,"context_line":"        for o_rule in original_rules:"},{"line_number":252,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":253,"context_line":"                for d_rule in desired_rules:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9f560f44_0f839dcc","line":250,"range":{"start_line":244,"start_character":8,"end_line":250,"end_character":66},"updated":"2020-09-09 20:38:38.000000000","message":"I think I found finally the solution to cover all cases and not allowing update if there are min_bw rules, and not touching policies with other rule types.","commit_id":"e9e7986e6a1445f5e8663dc154af2b923814d1bf"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a9c62a8b9ed52badf8dc98c33a91670ba9eb0c53","unresolved":false,"context_lines":[{"line_number":245,"context_line":"            [isinstance(r, rule_object.QosMinimumBandwidthRule)"},{"line_number":246,"context_line":"             for r in desired_rules])"},{"line_number":247,"context_line":"        if not original_rules and any_rules_minbw:"},{"line_number":248,"context_line":"            raise NotImplementedError(_("},{"line_number":249,"context_line":"                    \u0027Cannot update QoS of bound port without QoS policy to \u0027"},{"line_number":250,"context_line":"                    \u0027use QoS policy with minimum bandwidth rule\u0027))"},{"line_number":251,"context_line":"        for o_rule in original_rules:"},{"line_number":252,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":253,"context_line":"                for d_rule in desired_rules:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9f560f44_e0957433","line":250,"range":{"start_line":248,"start_character":12,"end_line":250,"end_character":66},"updated":"2020-09-11 12:44:28.000000000","message":"based on discusson with ralonsoh to keep legacy operations work change this raise to warning log to keep port update work in case there was no original QoS or allocation for the port.\n\nsee: http://eavesdrop.openstack.org/irclogs/%23openstack-neutron/%23openstack-neutron.2020-09-11.log.html#t2020-09-11T10:40:17","commit_id":"0ead589ad97d4f9cb5d7eb51110f5836eae2f652"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0a335c62ca343ad8a3740edcb719b6e94997b066","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                return {drctn: diff}"},{"line_number":228,"context_line":"        return {}"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _change_placement_allocation(self, original_policy, desired_policy,"},{"line_number":231,"context_line":"                                     orig_port):"},{"line_number":232,"context_line":"        alloc_diff \u003d {}"},{"line_number":233,"context_line":"        original_rules \u003d []"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_b9f1bb6d","line":230,"range":{"start_line":230,"start_character":8,"end_line":230,"end_character":36},"updated":"2020-09-15 18:19:48.000000000","message":"you will need to send a network-changed external event to nova at some point too.\n\nbasically to force the netwrok info cache to be updated.\n\nis this done somewhere already.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"eb64471ad9e508fb0946f59bbf22440975df7304","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                return {drctn: diff}"},{"line_number":228,"context_line":"        return {}"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def _change_placement_allocation(self, original_policy, desired_policy,"},{"line_number":231,"context_line":"                                     orig_port):"},{"line_number":232,"context_line":"        alloc_diff \u003d {}"},{"line_number":233,"context_line":"        original_rules \u003d []"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_c58bd865","line":230,"range":{"start_line":230,"start_character":8,"end_line":230,"end_character":36},"in_reply_to":"9f560f44_b9f1bb6d","updated":"2020-09-16 09:00:45.000000000","message":"Could you explain why that is needed?\nI agree that this will not cover all possible use cases in nova and neutron, but adds a useful feature that helps users of scheduling based on QoS minimum bandwidth values.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"43a248e1a2450d61be35c24715f6404b9091dd0e","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for compute bound ports"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_c80c7bee","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":21},"updated":"2020-09-17 05:10:11.000000000","message":"why need check here and no need for check when getting original_policy?","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fd6791c0e3b30b72bd6611f017309cf617ad7bde","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for compute bound ports"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_eb8054c2","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":21},"in_reply_to":"9f560f44_14104a4f","updated":"2020-09-17 09:58:46.000000000","message":"thanks for clarification Lajos. Anyway my comment was just a nit: if get_object() at next line just returns None in case policy_id is None - then probably no need to check at #203.","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"31e8b4db5b9996b084f2ebda4d4f1a5428435c2d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for compute bound ports"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_14104a4f","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":21},"in_reply_to":"9f560f44_c80c7bee","updated":"2020-09-17 08:44:45.000000000","message":"This is to keep other QoS related use cases working.\nThe original_policy\u003dNone is failing later (~l247) as there we have enough information to raise exception only in case minimum_bandwidth policy is in the update. So this way other port updates with QoS policy that is not min_bw (bandwidth_limit or dscp) will work.\n\nI tried to exit early but run into issues where I broke other QoS policy cases, but luckily we have quite good test coverage for those, so I hope I saved all those scenarios.","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a90db4faba413d7cfc87b5e2c1640321f68ad77b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        original_policy \u003d policy_object.QosPolicy.get_object("},{"line_number":201,"context_line":"            context.elevated(), id\u003doriginal_policy_id)"},{"line_number":202,"context_line":"        policy \u003d None"},{"line_number":203,"context_line":"        if policy_id:"},{"line_number":204,"context_line":"            policy \u003d policy_object.QosPolicy.get_object("},{"line_number":205,"context_line":"                context.elevated(), id\u003dpolicy_id)"},{"line_number":206,"context_line":"        # Do this only for compute bound ports"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_1c76ac40","line":203,"range":{"start_line":203,"start_character":8,"end_line":203,"end_character":21},"in_reply_to":"9f560f44_eb8054c2","updated":"2020-09-17 11:39:34.000000000","message":"you are right, that can be removed","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"43a248e1a2450d61be35c24715f6404b9091dd0e","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":251,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        for o_rule in original_rules:"},{"line_number":254,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":255,"context_line":"                for d_rule in desired_rules:"},{"line_number":256,"context_line":"                    alloc_diff.update("}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_68a1efa8","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":37},"updated":"2020-09-17 05:10:11.000000000","message":"what about the case when original policy has only egress (or only ingress) bw rule and desired policy has both? Will ingress (or egress) rules of desired policy be handled?","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"31e8b4db5b9996b084f2ebda4d4f1a5428435c2d","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":251,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        for o_rule in original_rules:"},{"line_number":254,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":255,"context_line":"                for d_rule in desired_rules:"},{"line_number":256,"context_line":"                    alloc_diff.update("}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_b9d197cf","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":37},"in_reply_to":"9f560f44_68a1efa8","updated":"2020-09-17 08:44:45.000000000","message":"The case when new allocation record is need to be created not supported (see discussion on tempest test: https://review.opendev.org/#/c/743695/4/tempest/scenario/test_minbw_allocation_placement.py@277 )","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fd6791c0e3b30b72bd6611f017309cf617ad7bde","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":251,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        for o_rule in original_rules:"},{"line_number":254,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":255,"context_line":"                for d_rule in desired_rules:"},{"line_number":256,"context_line":"                    alloc_diff.update("}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_eb59748e","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":37},"in_reply_to":"9f560f44_b9d197cf","updated":"2020-09-17 09:58:46.000000000","message":"So just for undestanding: in the case that I described above if new policy has additional rule for other direction - it will be ignored?","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a90db4faba413d7cfc87b5e2c1640321f68ad77b","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":251,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        for o_rule in original_rules:"},{"line_number":254,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"},{"line_number":255,"context_line":"                for d_rule in desired_rules:"},{"line_number":256,"context_line":"                    alloc_diff.update("}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_7ebec064","line":253,"range":{"start_line":253,"start_character":8,"end_line":253,"end_character":37},"in_reply_to":"9f560f44_eb59748e","updated":"2020-09-17 11:39:34.000000000","message":"It will used to set policy on dataplane (ovs, sriov...) but not towards placement and nova.","commit_id":"8ea44cededd93d90a1c37f146f7c0967df8ba206"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":51,"context_line":"from neutron.objects.qos import rule_type as rule_type_object"},{"line_number":52,"context_line":"from neutron.services.qos.drivers import manager"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"from oslo_log import log as logging"},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_65df1f66","line":54,"updated":"2020-09-21 12:56:02.000000000","message":"why this import is here and not in L41?","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":51,"context_line":"from neutron.objects.qos import rule_type as rule_type_object"},{"line_number":52,"context_line":"from neutron.services.qos.drivers import manager"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"from oslo_log import log as logging"},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_fb9c6c0f","line":54,"in_reply_to":"9f560f44_65df1f66","updated":"2020-09-21 14:43:31.000000000","message":"Done","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            context.elevated(), id\u003dpolicy_id)"},{"line_number":204,"context_line":"        # Do this only for compute bound ports"},{"line_number":205,"context_line":"        if (nl_constants.DEVICE_OWNER_COMPUTE_PREFIX in"},{"line_number":206,"context_line":"                orig_port[\u0027device_owner\u0027]):"},{"line_number":207,"context_line":"            self._change_placement_allocation(original_policy, policy,"},{"line_number":208,"context_line":"                                              orig_port)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_a56017a6","line":206,"updated":"2020-09-21 12:56:02.000000000","message":"You can do that check in opposite way above L200 and You will save 2 db calls if port isn\u0027t compute port.","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            context.elevated(), id\u003dpolicy_id)"},{"line_number":204,"context_line":"        # Do this only for compute bound ports"},{"line_number":205,"context_line":"        if (nl_constants.DEVICE_OWNER_COMPUTE_PREFIX in"},{"line_number":206,"context_line":"                orig_port[\u0027device_owner\u0027]):"},{"line_number":207,"context_line":"            self._change_placement_allocation(original_policy, policy,"},{"line_number":208,"context_line":"                                              orig_port)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_1b8160a1","line":206,"in_reply_to":"9f560f44_a56017a6","updated":"2020-09-21 14:43:31.000000000","message":"you are right, that\u0027s less operation.","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                isinstance(desired_rule, dict)):"},{"line_number":213,"context_line":"            o_dir \u003d original_rule.get(\u0027direction\u0027)"},{"line_number":214,"context_line":"            o_minkbps \u003d original_rule.min_kbps"},{"line_number":215,"context_line":"            d_minkbps \u003d desired_rule.get(\u0027min_kbps\u0027)"},{"line_number":216,"context_line":"            d_dir \u003d desired_rule.get(\u0027direction\u0027)"},{"line_number":217,"context_line":"            if o_dir \u003d\u003d d_dir and o_minkbps !\u003d d_minkbps:"},{"line_number":218,"context_line":"                diff \u003d d_minkbps - o_minkbps"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_c52b8b30","line":215,"updated":"2020-09-21 12:56:02.000000000","message":"maybe dummy question but why You are using get() here and in L213 but original_rule.min_kbps in L214? Can\u0027t we be more consistent?","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                isinstance(desired_rule, dict)):"},{"line_number":213,"context_line":"            o_dir \u003d original_rule.get(\u0027direction\u0027)"},{"line_number":214,"context_line":"            o_minkbps \u003d original_rule.min_kbps"},{"line_number":215,"context_line":"            d_minkbps \u003d desired_rule.get(\u0027min_kbps\u0027)"},{"line_number":216,"context_line":"            d_dir \u003d desired_rule.get(\u0027direction\u0027)"},{"line_number":217,"context_line":"            if o_dir \u003d\u003d d_dir and o_minkbps !\u003d d_minkbps:"},{"line_number":218,"context_line":"                diff \u003d d_minkbps - o_minkbps"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_5ba4784b","line":215,"in_reply_to":"9f560f44_c52b8b30","updated":"2020-09-21 14:43:31.000000000","message":"Done","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            LOG.warning(\"There was no QoS policy with minimum_bandwidth rule \""},{"line_number":247,"context_line":"                        \"attached to the port %s, there is no allocation \""},{"line_number":248,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":249,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":250,"context_line":"            return"},{"line_number":251,"context_line":"        for o_rule in original_rules:"},{"line_number":252,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_a562d73b","line":249,"updated":"2020-09-21 12:56:02.000000000","message":"Shouldn\u0027t we fail in such case?","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            LOG.warning(\"There was no QoS policy with minimum_bandwidth rule \""},{"line_number":247,"context_line":"                        \"attached to the port %s, there is no allocation \""},{"line_number":248,"context_line":"                        \"record in placement for it, only the dataplane \""},{"line_number":249,"context_line":"                        \"enforcement will happen!\", orig_port[\u0027id\u0027])"},{"line_number":250,"context_line":"            return"},{"line_number":251,"context_line":"        for o_rule in original_rules:"},{"line_number":252,"context_line":"            if isinstance(o_rule, rule_object.QosMinimumBandwidthRule):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_7b2cdcab","line":249,"in_reply_to":"9f560f44_a562d73b","updated":"2020-09-21 14:43:31.000000000","message":"Yeah the documentation note was not updated, based on last discussion with ralonsoh ( http://eavesdrop.openstack.org/irclogs/%23openstack-neutron/%23openstack-neutron.2020-09-11.log.html#t2020-09-11T10:40:17 ) he asked to keep port update work in this cases, as QoS enforcement can happen in these cases on dataplane, and placement will be left untouched.","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"30deb84f728c144bb54a5ce0ed4a480267a17651","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        if desired_policy:"},{"line_number":238,"context_line":"            desired_rules \u003d desired_policy.get(\u0027rules\u0027)"},{"line_number":239,"context_line":"        else:"},{"line_number":240,"context_line":"            desired_rules \u003d [{\u0027direction\u0027: \u0027egress\u0027, \u0027min_kbps\u0027: 0},"},{"line_number":241,"context_line":"                             {\u0027direction\u0027: \u0027ingress\u0027, \u0027min_kbps\u0027: 0}]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        any_rules_minbw \u003d any("}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_d5e7a745","line":240,"updated":"2020-09-22 07:40:44.000000000","message":"actually, to avoid this weird check in L212-213, you can actually create a QosMinimumBandwidthRule object:\n\ndesired_rules \u003d [\n  rule.QosMinimumBandwidthRule(min_kbps\u003d0,direction\u003d\u0027egress\u0027),\n  rule.QosMinimumBandwidthRule(min_kbps\u003d0,direction\u003d\u0027ingress\u0027)]","commit_id":"add9ee01c9c896534d3aeaf178e0fa23f496b813"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"ad469036682b0e38796fc3f401d2367a1049e50b","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        if desired_policy:"},{"line_number":238,"context_line":"            desired_rules \u003d desired_policy.get(\u0027rules\u0027)"},{"line_number":239,"context_line":"        else:"},{"line_number":240,"context_line":"            desired_rules \u003d [{\u0027direction\u0027: \u0027egress\u0027, \u0027min_kbps\u0027: 0},"},{"line_number":241,"context_line":"                             {\u0027direction\u0027: \u0027ingress\u0027, \u0027min_kbps\u0027: 0}]"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        any_rules_minbw \u003d any("}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_f5aaab81","line":240,"in_reply_to":"9f560f44_d5e7a745","updated":"2020-09-22 08:04:23.000000000","message":"That was in my mind, but was not sure if that would mean actual db operation like create","commit_id":"add9ee01c9c896534d3aeaf178e0fa23f496b813"}],"neutron/tests/unit/services/qos/test_qos_plugin.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0a335c62ca343ad8a3740edcb719b6e94997b066","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"                     \u0027device_id\u0027: \u0027uu:id\u0027}"},{"line_number":1352,"context_line":"        return orig_port"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    def test_change_placement_allocation_increase(self):"},{"line_number":1355,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1356,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1357,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1358,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1359,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1360,"context_line":"            self.qos_plugin._change_placement_allocation(qos1, qos2, port)"},{"line_number":1361,"context_line":"        mock_update_qos_alloc.assert_called_once_with("},{"line_number":1362,"context_line":"            consumer_uuid\u003d\u0027uu:id\u0027,"},{"line_number":1363,"context_line":"            minbw_alloc_diff\u003d{\u0027NET_BW_IGR_KILOBIT_PER_SEC\u0027: 1000},"},{"line_number":1364,"context_line":"            rp_uuid\u003d\u0027rp:uu:id\u0027)"},{"line_number":1365,"context_line":""},{"line_number":1366,"context_line":"    def test_test_change_placement_allocation_decrease(self):"},{"line_number":1367,"context_line":"        qos1 \u003d self._make_qos_policy()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_b9c89b21","line":1364,"range":{"start_line":1354,"start_character":0,"end_line":1364,"end_character":31},"updated":"2020-09-15 18:19:48.000000000","message":"you need a test to handel the case there is not enough bandwith avaiable to increase it.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"eb64471ad9e508fb0946f59bbf22440975df7304","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"                     \u0027device_id\u0027: \u0027uu:id\u0027}"},{"line_number":1352,"context_line":"        return orig_port"},{"line_number":1353,"context_line":""},{"line_number":1354,"context_line":"    def test_change_placement_allocation_increase(self):"},{"line_number":1355,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1356,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1357,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1358,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1359,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1360,"context_line":"            self.qos_plugin._change_placement_allocation(qos1, qos2, port)"},{"line_number":1361,"context_line":"        mock_update_qos_alloc.assert_called_once_with("},{"line_number":1362,"context_line":"            consumer_uuid\u003d\u0027uu:id\u0027,"},{"line_number":1363,"context_line":"            minbw_alloc_diff\u003d{\u0027NET_BW_IGR_KILOBIT_PER_SEC\u0027: 1000},"},{"line_number":1364,"context_line":"            rp_uuid\u003d\u0027rp:uu:id\u0027)"},{"line_number":1365,"context_line":""},{"line_number":1366,"context_line":"    def test_test_change_placement_allocation_decrease(self):"},{"line_number":1367,"context_line":"        qos1 \u003d self._make_qos_policy()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_254a945a","line":1364,"range":{"start_line":1354,"start_character":0,"end_line":1364,"end_character":31},"in_reply_to":"9f560f44_b9c89b21","updated":"2020-09-16 09:00:45.000000000","message":"That is covered by the test in L1463 (test_change_placement_allocation_update_conflict )","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0a335c62ca343ad8a3740edcb719b6e94997b066","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"            self.qos_plugin._change_placement_allocation(qos1, qos2, port)"},{"line_number":1461,"context_line":"        mock_update_qos_alloc.assert_not_called()"},{"line_number":1462,"context_line":""},{"line_number":1463,"context_line":"    def test_change_placement_allocation_update_conflict(self):"},{"line_number":1464,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1465,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1466,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1467,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1468,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1469,"context_line":"            mock_update_qos_alloc.side_effect \u003d ks_exc.Conflict("},{"line_number":1470,"context_line":"                response\u003d{\u0027errors\u0027: [{\u0027code\u0027: \u0027placement.concurrent_update\u0027}]}"},{"line_number":1471,"context_line":"            )"},{"line_number":1472,"context_line":"            self.assertRaises("},{"line_number":1473,"context_line":"                qos_exc.QosPlacementAllocationConflict,"},{"line_number":1474,"context_line":"                self.qos_plugin._change_placement_allocation,"},{"line_number":1475,"context_line":"                qos1, qos2, port)"},{"line_number":1476,"context_line":""},{"line_number":1477,"context_line":"    def test_change_placement_allocation_update_generation_conflict(self):"},{"line_number":1478,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1479,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1480,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1481,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1482,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1483,"context_line":"            mock_update_qos_alloc.side_effect \u003d ("},{"line_number":1484,"context_line":"                pl_exc.PlacementAllocationGenerationConflict("},{"line_number":1485,"context_line":"                    consumer\u003d\u0027rp:uu:id\u0027))"},{"line_number":1486,"context_line":"            self.assertRaises("},{"line_number":1487,"context_line":"                pl_exc.PlacementAllocationGenerationConflict,"},{"line_number":1488,"context_line":"                self.qos_plugin._change_placement_allocation,"},{"line_number":1489,"context_line":"                qos1, qos2, port)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_59733fe9","line":1489,"range":{"start_line":1463,"start_character":1,"end_line":1489,"end_character":33},"updated":"2020-09-15 18:19:48.000000000","message":"so in both of these cases you shoudl retry the palcment update up to a limit.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"eb64471ad9e508fb0946f59bbf22440975df7304","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"            self.qos_plugin._change_placement_allocation(qos1, qos2, port)"},{"line_number":1461,"context_line":"        mock_update_qos_alloc.assert_not_called()"},{"line_number":1462,"context_line":""},{"line_number":1463,"context_line":"    def test_change_placement_allocation_update_conflict(self):"},{"line_number":1464,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1465,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1466,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1467,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1468,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1469,"context_line":"            mock_update_qos_alloc.side_effect \u003d ks_exc.Conflict("},{"line_number":1470,"context_line":"                response\u003d{\u0027errors\u0027: [{\u0027code\u0027: \u0027placement.concurrent_update\u0027}]}"},{"line_number":1471,"context_line":"            )"},{"line_number":1472,"context_line":"            self.assertRaises("},{"line_number":1473,"context_line":"                qos_exc.QosPlacementAllocationConflict,"},{"line_number":1474,"context_line":"                self.qos_plugin._change_placement_allocation,"},{"line_number":1475,"context_line":"                qos1, qos2, port)"},{"line_number":1476,"context_line":""},{"line_number":1477,"context_line":"    def test_change_placement_allocation_update_generation_conflict(self):"},{"line_number":1478,"context_line":"        qos1 \u003d self._make_qos_policy()"},{"line_number":1479,"context_line":"        qos2 \u003d self._make_qos_policy()"},{"line_number":1480,"context_line":"        port \u003d self._test_change_placement_allocation(qos1, qos2)"},{"line_number":1481,"context_line":"        with mock.patch.object(self.qos_plugin._placement_client,"},{"line_number":1482,"context_line":"                \u0027update_qos_minbw_allocation\u0027) as mock_update_qos_alloc:"},{"line_number":1483,"context_line":"            mock_update_qos_alloc.side_effect \u003d ("},{"line_number":1484,"context_line":"                pl_exc.PlacementAllocationGenerationConflict("},{"line_number":1485,"context_line":"                    consumer\u003d\u0027rp:uu:id\u0027))"},{"line_number":1486,"context_line":"            self.assertRaises("},{"line_number":1487,"context_line":"                pl_exc.PlacementAllocationGenerationConflict,"},{"line_number":1488,"context_line":"                self.qos_plugin._change_placement_allocation,"},{"line_number":1489,"context_line":"                qos1, qos2, port)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f560f44_61f7615b","line":1489,"range":{"start_line":1463,"start_character":1,"end_line":1489,"end_character":33},"in_reply_to":"9f560f44_59733fe9","updated":"2020-09-16 09:00:45.000000000","message":"the retry is handled in neutron-lib (https://opendev.org/openstack/neutron-lib/src/commit/245e005d1bbb9af5e57ff600fb97b2a13c85c83b/neutron_lib/placement/client.py#L748 )","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    def test_validate_create_port_callback_no_policy(self):"},{"line_number":1289,"context_line":"        self._test_validate_create_port_callback()"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    def _test_check_port_for_placement_allocation_change(self, qos1, qos2):"},{"line_number":1292,"context_line":"        qos1_id \u003d qos1.id if qos1 else None"},{"line_number":1293,"context_line":"        qos2_id \u003d qos2.id if qos2 else None"},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_65f6ff5f","line":1291,"range":{"start_line":1291,"start_character":8,"end_line":1291,"end_character":56},"updated":"2020-09-21 12:56:02.000000000","message":"this is not testing anything. Maybe You can change this name to something else like e.g. \"prepare_for_placement_allocation_change\" or something like that.","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":1288,"context_line":"    def test_validate_create_port_callback_no_policy(self):"},{"line_number":1289,"context_line":"        self._test_validate_create_port_callback()"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    def _test_check_port_for_placement_allocation_change(self, qos1, qos2):"},{"line_number":1292,"context_line":"        qos1_id \u003d qos1.id if qos1 else None"},{"line_number":1293,"context_line":"        qos2_id \u003d qos2.id if qos2 else None"},{"line_number":1294,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_5b2758c8","line":1291,"range":{"start_line":1291,"start_character":8,"end_line":1291,"end_character":56},"in_reply_to":"9f560f44_65f6ff5f","updated":"2020-09-21 14:43:31.000000000","message":"Done","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0432925a05d74e473be3673cc41b6719044c931","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"        mock_alloc_change.assert_called_once_with("},{"line_number":1341,"context_line":"            qos1_obj, None, kwargs[\u0027original_port\u0027])"},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    def _test_change_placement_allocation(self, qos1, qos2\u003dNone,"},{"line_number":1344,"context_line":"                                          min_kbps1\u003d1000, min_kbps2\u003d2000):"},{"line_number":1345,"context_line":"        rule1_obj \u003d self._make_qos_minbw_rule(qos1.id, min_kbps\u003dmin_kbps1)"},{"line_number":1346,"context_line":"        qos1.rules \u003d [rule1_obj]"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_059d8309","line":1343,"range":{"start_line":1343,"start_character":8,"end_line":1343,"end_character":41},"updated":"2020-09-21 12:56:02.000000000","message":"similar comment here also","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d8d67bca628f06ecf8b18eb8b4b57d8025006b5e","unresolved":false,"context_lines":[{"line_number":1340,"context_line":"        mock_alloc_change.assert_called_once_with("},{"line_number":1341,"context_line":"            qos1_obj, None, kwargs[\u0027original_port\u0027])"},{"line_number":1342,"context_line":""},{"line_number":1343,"context_line":"    def _test_change_placement_allocation(self, qos1, qos2\u003dNone,"},{"line_number":1344,"context_line":"                                          min_kbps1\u003d1000, min_kbps2\u003d2000):"},{"line_number":1345,"context_line":"        rule1_obj \u003d self._make_qos_minbw_rule(qos1.id, min_kbps\u003dmin_kbps1)"},{"line_number":1346,"context_line":"        qos1.rules \u003d [rule1_obj]"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_fb110c5f","line":1343,"range":{"start_line":1343,"start_character":8,"end_line":1343,"end_character":41},"in_reply_to":"9f560f44_059d8309","updated":"2020-09-21 14:43:31.000000000","message":"Done","commit_id":"2ef7445504e6eb5510e021c04ffab7d4be58da72"}],"releasenotes/notes/update_qos_allocation_for_bound_port-5358620322b66ae9.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0a335c62ca343ad8a3740edcb719b6e94997b066","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update of an ``already bound port`` with ``QoS minimum_bandwidth`` rule"},{"line_number":5,"context_line":"    with new ``QoS policy`` with ``minimum_bandwidth`` rule changes the"},{"line_number":6,"context_line":"    allocations in placement as well."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9f560f44_19af077e","line":6,"range":{"start_line":4,"start_character":2,"end_line":6,"end_character":37},"updated":"2020-09-15 18:19:48.000000000","message":"i think you need to also call out that updating exciting minimum_bandwidth policies with new values will not update the existing port and is not supported.","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a01c998c4cdc494af50e4bdac60196c6fe2f7a5d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update of an ``already bound port`` with ``QoS minimum_bandwidth`` rule"},{"line_number":5,"context_line":"    with new ``QoS policy`` with ``minimum_bandwidth`` rule changes the"},{"line_number":6,"context_line":"    allocations in placement as well."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9f560f44_8538c03b","line":6,"range":{"start_line":4,"start_character":2,"end_line":6,"end_character":37},"in_reply_to":"9f560f44_19af077e","updated":"2020-09-16 09:27:36.000000000","message":"Done\nI added not to the docs as well","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"eb64471ad9e508fb0946f59bbf22440975df7304","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Update of an ``already bound port`` with ``QoS minimum_bandwidth`` rule"},{"line_number":5,"context_line":"    with new ``QoS policy`` with ``minimum_bandwidth`` rule changes the"},{"line_number":6,"context_line":"    allocations in placement as well."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9f560f44_2598d4ca","line":6,"range":{"start_line":4,"start_character":2,"end_line":6,"end_character":37},"in_reply_to":"9f560f44_19af077e","updated":"2020-09-16 09:00:45.000000000","message":"yeah, perhaps good to highlight that, here and in the doc rst as well","commit_id":"862ac67c875e1cb6fd3f812364adc92e38540090"}]}
