)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Balazs Gibizer \u003cbalazs.gibizer@est.tech\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-12-16 16:20:20 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support interface attach with qos ports"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The following logic is added to the ComputeManager attach_interface"},{"line_number":10,"context_line":"flow:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"6b557e43_b166ff9b","line":7,"range":{"start_line":7,"start_character":30,"end_line":7,"end_character":33},"updated":"2020-12-17 11:22:22.000000000","message":"nit: QoS","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Balazs Gibizer \u003cbalazs.gibizer@est.tech\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-12-16 16:20:20 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support interface attach with qos ports"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The following logic is added to the ComputeManager attach_interface"},{"line_number":10,"context_line":"flow:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da145993_328363de","line":7,"range":{"start_line":7,"start_character":30,"end_line":7,"end_character":33},"in_reply_to":"6b557e43_b166ff9b","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":19,"context_line":"* ensure that during port binding neutron gets the RP UUID, the resources"},{"line_number":20,"context_line":"  are allocated from, in the allocation key of the binding profile"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"This patch bumps the compute service version to indicate that qos"},{"line_number":23,"context_line":"interface attach is supported. Also the check that was so far rejected"},{"line_number":24,"context_line":"such attach is now updated to only reject it if the compute service"},{"line_number":25,"context_line":"version is too old."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"e315f1ad_e55dbc91","line":22,"range":{"start_line":22,"start_character":62,"end_line":22,"end_character":65},"updated":"2021-01-11 12:04:08.000000000","message":"QoS","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":19,"context_line":"* ensure that during port binding neutron gets the RP UUID, the resources"},{"line_number":20,"context_line":"  are allocated from, in the allocation key of the binding profile"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"This patch bumps the compute service version to indicate that qos"},{"line_number":23,"context_line":"interface attach is supported. Also the check that was so far rejected"},{"line_number":24,"context_line":"such attach is now updated to only reject it if the compute service"},{"line_number":25,"context_line":"version is too old."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"13f08880_28f9dea7","line":22,"range":{"start_line":22,"start_character":62,"end_line":22,"end_character":65},"in_reply_to":"e315f1ad_e55dbc91","updated":"2021-01-11 13:47:38.000000000","message":"Done","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":13,"context_line":"* query allocation candidates restricted to the current compute node"},{"line_number":14,"context_line":"  from placement"},{"line_number":15,"context_line":"* extend the existing allocation of the instance with one of the"},{"line_number":16,"context_line":"  allocation candidates in placement"},{"line_number":17,"context_line":"* update the InstancePCIRequest (if any) to ensure that the PCI claim"},{"line_number":18,"context_line":"  only allocates VF from the PF the placement resources are allocated from"},{"line_number":19,"context_line":"* ensure that during port binding neutron gets the RP UUID, the resources"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"a8f26b37_270f47c0","line":16,"updated":"2021-02-09 14:53:24.000000000","message":"Something we haven\u0027t discussed it during the spec review, but since you can detach a network VIF, should we also delete the QoS allocations with detach ?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":13,"context_line":"* query allocation candidates restricted to the current compute node"},{"line_number":14,"context_line":"  from placement"},{"line_number":15,"context_line":"* extend the existing allocation of the instance with one of the"},{"line_number":16,"context_line":"  allocation candidates in placement"},{"line_number":17,"context_line":"* update the InstancePCIRequest (if any) to ensure that the PCI claim"},{"line_number":18,"context_line":"  only allocates VF from the PF the placement resources are allocated from"},{"line_number":19,"context_line":"* ensure that during port binding neutron gets the RP UUID, the resources"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"84c333d8_96b9a0f7","line":16,"in_reply_to":"8b3c2ccc_3602ba33","updated":"2021-02-11 15:46:31.000000000","message":"It is supported already a way Sean describes it","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7c681689af5e6b7f62f7d83b623e3160caefef41","unresolved":true,"context_lines":[{"line_number":13,"context_line":"* query allocation candidates restricted to the current compute node"},{"line_number":14,"context_line":"  from placement"},{"line_number":15,"context_line":"* extend the existing allocation of the instance with one of the"},{"line_number":16,"context_line":"  allocation candidates in placement"},{"line_number":17,"context_line":"* update the InstancePCIRequest (if any) to ensure that the PCI claim"},{"line_number":18,"context_line":"  only allocates VF from the PF the placement resources are allocated from"},{"line_number":19,"context_line":"* ensure that during port binding neutron gets the RP UUID, the resources"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"8b3c2ccc_3602ba33","line":16,"in_reply_to":"a8f26b37_270f47c0","updated":"2021-02-09 16:33:35.000000000","message":"i think gibi said detach was already supported before this change.\n\nbut yes on detach we shoudl update teh allocation to remove the allocation for the port that was detached.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e2cbcd6c79bc9fa2cf4878d877b1be99a383342","unresolved":true,"context_lines":[{"line_number":30,"context_line":"the process it turns out that such allocation candidate points to a PCI"},{"line_number":31,"context_line":"PF that has no free VFs left."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Blueprint: support-interface-attach-with-qos-ports"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: Id4684093e8bdf3b61667490443e3d2f6ed65f4b3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"7e621f1a_1bd84891","line":33,"updated":"2021-01-22 18:16:09.000000000","message":"nit: this porbably should be \"implements: blueprint support-interface-attach-with-qos-ports\"\n\ni think that is what the bot is looking for to mark it as fix released automatically","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39d7fd519f415bce4de19bc4f1bf26d523c65753","unresolved":false,"context_lines":[{"line_number":30,"context_line":"the process it turns out that such allocation candidate points to a PCI"},{"line_number":31,"context_line":"PF that has no free VFs left."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Blueprint: support-interface-attach-with-qos-ports"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: Id4684093e8bdf3b61667490443e3d2f6ed65f4b3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"ea468417_20853bfe","line":33,"in_reply_to":"7e621f1a_1bd84891","updated":"2021-01-26 12:55:42.000000000","message":"the bot never marked a bp Implemented in lauchpad. That was always done by the PTL :). Bugs are handled automatically before the gerrit upgrade but not any more.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3165a6c4a1c7e96ef7c925cefc5c05d707c88ba7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"the process it turns out that such allocation candidate points to a PCI"},{"line_number":31,"context_line":"PF that has no free VFs left."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Blueprint: support-interface-attach-with-qos-ports"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: Id4684093e8bdf3b61667490443e3d2f6ed65f4b3"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"e3ed2b1d_f73657ba","line":33,"in_reply_to":"ea468417_20853bfe","updated":"2021-01-26 13:26:11.000000000","message":"oh ok never mind then","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"}],"api-guide/source/port_with_resource_request.rst":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":36,"context_line":"As of 21.0.0 (Ussuri), nova supports evacuating, live migrating and unshelving"},{"line_number":37,"context_line":"servers with neutron ports having resource requests."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"As of 23.0.0 (Wallaby), nova supports attaching neutron ports having QoS"},{"line_number":40,"context_line":"minimum bandwidth rules."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"See :nova-doc:`the admin guide \u003cadmin/port_with_resource_request.html\u003e` for"}],"source_content_type":"text/x-rst","patch_set":21,"id":"627f92d5_6a72c401","line":39,"range":{"start_line":39,"start_character":38,"end_line":39,"end_character":47},"updated":"2021-02-09 14:53:24.000000000","message":"nit: detach was already supported either way so we don\u0027t need to add it.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":36,"context_line":"As of 21.0.0 (Ussuri), nova supports evacuating, live migrating and unshelving"},{"line_number":37,"context_line":"servers with neutron ports having resource requests."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"As of 23.0.0 (Wallaby), nova supports attaching neutron ports having QoS"},{"line_number":40,"context_line":"minimum bandwidth rules."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"See :nova-doc:`the admin guide \u003cadmin/port_with_resource_request.html\u003e` for"}],"source_content_type":"text/x-rst","patch_set":21,"id":"595f7897_64ae2eec","line":39,"range":{"start_line":39,"start_character":38,"end_line":39,"end_character":47},"in_reply_to":"271ebdc3_16d520df","updated":"2021-02-11 15:46:31.000000000","message":"look at L8 above. It states that detach is supported from the start","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7c681689af5e6b7f62f7d83b623e3160caefef41","unresolved":true,"context_lines":[{"line_number":36,"context_line":"As of 21.0.0 (Ussuri), nova supports evacuating, live migrating and unshelving"},{"line_number":37,"context_line":"servers with neutron ports having resource requests."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"As of 23.0.0 (Wallaby), nova supports attaching neutron ports having QoS"},{"line_number":40,"context_line":"minimum bandwidth rules."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"See :nova-doc:`the admin guide \u003cadmin/port_with_resource_request.html\u003e` for"}],"source_content_type":"text/x-rst","patch_set":21,"id":"271ebdc3_16d520df","line":39,"range":{"start_line":39,"start_character":38,"end_line":39,"end_character":47},"in_reply_to":"627f92d5_6a72c401","updated":"2021-02-09 16:33:35.000000000","message":"ok so this is fine as it is?\ngibi wass just adding that attaching is now supported.\nare you asing him to also state that detach was previously supported since (whatever releaes)","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"}],"nova/api/openstack/compute/attach_interfaces.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":177,"context_line":"                exception.NetworksWithQoSPolicyNotSupported,"},{"line_number":178,"context_line":"                exception.InterfaceAttachPciClaimFailed,"},{"line_number":179,"context_line":"                exception.InterfaceAttachResourceAllocationFailed) as e:"},{"line_number":180,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":181,"context_line":"        except (exception.InstanceIsLocked,"},{"line_number":182,"context_line":"                exception.FixedIpAlreadyInUse,"},{"line_number":183,"context_line":"                exception.PortInUse) as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"04782540_e7dca7ee","line":180,"updated":"2021-02-09 14:53:24.000000000","message":"OK, returning a 400 seems good as we agreed on the spec and we won\u0027t see any instance action yet","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                exception.NetworksWithQoSPolicyNotSupported,"},{"line_number":178,"context_line":"                exception.InterfaceAttachPciClaimFailed,"},{"line_number":179,"context_line":"                exception.InterfaceAttachResourceAllocationFailed) as e:"},{"line_number":180,"context_line":"            raise exc.HTTPBadRequest(explanation\u003de.format_message())"},{"line_number":181,"context_line":"        except (exception.InstanceIsLocked,"},{"line_number":182,"context_line":"                exception.FixedIpAlreadyInUse,"},{"line_number":183,"context_line":"                exception.PortInUse) as e:"}],"source_content_type":"text/x-python","patch_set":21,"id":"56292374_d7f49eeb","line":180,"in_reply_to":"04782540_e7dca7ee","updated":"2021-02-11 15:46:31.000000000","message":"Ack","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"}],"nova/compute/api.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e2cbcd6c79bc9fa2cf4878d877b1be99a383342","unresolved":true,"context_lines":[{"line_number":4978,"context_line":"        # NOTE(gibi): Checking if the requested port has resource request as"},{"line_number":4979,"context_line":"        # such ports are only supported if the compute service version is \u003e\u003d 55"},{"line_number":4980,"context_line":"        # TODO(gibi): Remove this check in X as there we can be sure that all"},{"line_number":4981,"context_line":"        # computes are new enough"},{"line_number":4982,"context_line":"        if port_id:"},{"line_number":4983,"context_line":"            port \u003d self.network_api.show_port(context, port_id)"},{"line_number":4984,"context_line":"            if port[\u0027port\u0027].get(constants.RESOURCE_REQUEST):"}],"source_content_type":"text/x-python","patch_set":21,"id":"2a0baffa_c0cea03b","line":4981,"updated":"2021-01-22 18:16:09.000000000","message":"proivided people follow our do not mix more then n+1 requiremetns yes 😊\nbut ya that should be ok","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39d7fd519f415bce4de19bc4f1bf26d523c65753","unresolved":false,"context_lines":[{"line_number":4978,"context_line":"        # NOTE(gibi): Checking if the requested port has resource request as"},{"line_number":4979,"context_line":"        # such ports are only supported if the compute service version is \u003e\u003d 55"},{"line_number":4980,"context_line":"        # TODO(gibi): Remove this check in X as there we can be sure that all"},{"line_number":4981,"context_line":"        # computes are new enough"},{"line_number":4982,"context_line":"        if port_id:"},{"line_number":4983,"context_line":"            port \u003d self.network_api.show_port(context, port_id)"},{"line_number":4984,"context_line":"            if port[\u0027port\u0027].get(constants.RESOURCE_REQUEST):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ab772d3b_e26ec291","line":4981,"in_reply_to":"2a0baffa_c0cea03b","updated":"2021-01-26 12:55:42.000000000","message":"we have hard failure for older than N-1 computes now: https://review.opendev.org/c/openstack/nova/+/738482","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3165a6c4a1c7e96ef7c925cefc5c05d707c88ba7","unresolved":false,"context_lines":[{"line_number":4978,"context_line":"        # NOTE(gibi): Checking if the requested port has resource request as"},{"line_number":4979,"context_line":"        # such ports are only supported if the compute service version is \u003e\u003d 55"},{"line_number":4980,"context_line":"        # TODO(gibi): Remove this check in X as there we can be sure that all"},{"line_number":4981,"context_line":"        # computes are new enough"},{"line_number":4982,"context_line":"        if port_id:"},{"line_number":4983,"context_line":"            port \u003d self.network_api.show_port(context, port_id)"},{"line_number":4984,"context_line":"            if port[\u0027port\u0027].get(constants.RESOURCE_REQUEST):"}],"source_content_type":"text/x-python","patch_set":21,"id":"ef520f36_cc4c0b15","line":4981,"in_reply_to":"ab772d3b_e26ec291","updated":"2021-01-26 13:26:11.000000000","message":"oh yes i remember that you are right its no longer an assumtion","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":4984,"context_line":"            if port[\u0027port\u0027].get(constants.RESOURCE_REQUEST):"},{"line_number":4985,"context_line":"                svc \u003d objects.Service.get_by_host_and_binary("},{"line_number":4986,"context_line":"                    context, instance.host, \u0027nova-compute\u0027)"},{"line_number":4987,"context_line":"                if svc.version \u003c 55:"},{"line_number":4988,"context_line":"                    raise exception.AttachInterfaceWithQoSPolicyNotSupported("},{"line_number":4989,"context_line":"                        instance_uuid\u003dinstance.uuid)"},{"line_number":4990,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1a5cbab1_9c53fc82","line":4987,"updated":"2021-02-09 14:53:24.000000000","message":"/me nods https://review.opendev.org/c/openstack/nova/+/756530/21/nova/objects/service.py","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":4984,"context_line":"            if port[\u0027port\u0027].get(constants.RESOURCE_REQUEST):"},{"line_number":4985,"context_line":"                svc \u003d objects.Service.get_by_host_and_binary("},{"line_number":4986,"context_line":"                    context, instance.host, \u0027nova-compute\u0027)"},{"line_number":4987,"context_line":"                if svc.version \u003c 55:"},{"line_number":4988,"context_line":"                    raise exception.AttachInterfaceWithQoSPolicyNotSupported("},{"line_number":4989,"context_line":"                        instance_uuid\u003dinstance.uuid)"},{"line_number":4990,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"88ce0a43_7a9a135e","line":4987,"in_reply_to":"1a5cbab1_9c53fc82","updated":"2021-02-11 15:46:31.000000000","message":"Ack","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"}],"nova/compute/manager.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9e7a46779d0d12dd9dd9936b7a9ee7cf25e57171","unresolved":false,"context_lines":[{"line_number":7624,"context_line":""},{"line_number":7625,"context_line":"        res \u003d self._claim_pci_device_for_interface_attach("},{"line_number":7626,"context_line":"            context, instance, requested_networks)"},{"line_number":7627,"context_line":"        pci_device, request_group \u003d res"},{"line_number":7628,"context_line":""},{"line_number":7629,"context_line":"        # TODO(gibi): refactor this ResourceRequest and the"},{"line_number":7630,"context_line":"        # scheduler_utils.ResourceRequest."}],"source_content_type":"text/x-python","patch_set":1,"id":"9f560f44_e41163b1","line":7627,"updated":"2020-10-07 19:30:16.000000000","message":"pep8: error: \u0027None\u0027 object is not iterable","commit_id":"d2deb519ec2d0314597eecc0f39593f9fd47e24c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"aed16da2e6dc3bbccf42a8ba45dbfee70a8a63f3","unresolved":false,"context_lines":[{"line_number":7511,"context_line":"        \"\"\""},{"line_number":7512,"context_line":""},{"line_number":7513,"context_line":"        if not pci_req:"},{"line_number":7514,"context_line":"            return"},{"line_number":7515,"context_line":""},{"line_number":7516,"context_line":"        devices \u003d self.rt.claim_pci_devices("},{"line_number":7517,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f560f44_fd4f1b89","line":7514,"updated":"2020-10-09 04:54:22.000000000","message":"pep8: error: Return value expected","commit_id":"3bc8d7d9174939b09d0940567f9722127fb4fe50"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5f8fcceca6694b481baaa4a950b5b718c63ab30f","unresolved":false,"context_lines":[{"line_number":7517,"context_line":"        \"\"\""},{"line_number":7518,"context_line":""},{"line_number":7519,"context_line":"        if not pci_req:"},{"line_number":7520,"context_line":"            return"},{"line_number":7521,"context_line":""},{"line_number":7522,"context_line":"        devices \u003d self.rt.claim_pci_devices("},{"line_number":7523,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_9e7c0672","line":7520,"updated":"2020-10-10 05:58:40.000000000","message":"pep8: error: Return value expected","commit_id":"371b93e3ad8231fd4e17bea0efc80effaffcea69"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a31c3b84de6e5400cb99c82d03bd8f702efd0847","unresolved":false,"context_lines":[{"line_number":7515,"context_line":"        \"\"\""},{"line_number":7516,"context_line":""},{"line_number":7517,"context_line":"        if not pci_reqs:"},{"line_number":7518,"context_line":"            return"},{"line_number":7519,"context_line":""},{"line_number":7520,"context_line":"        devices \u003d self.rt.claim_pci_devices("},{"line_number":7521,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9f560f44_704304b1","line":7518,"updated":"2020-10-13 04:32:11.000000000","message":"pep8: error: Return value expected","commit_id":"460b4d130d75968db9d19954d4a8089b98ff0f15"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":7545,"context_line":"        return device"},{"line_number":7546,"context_line":""},{"line_number":7547,"context_line":"    def _allocate_port_resource_for_instance("},{"line_number":7548,"context_line":"            self,"},{"line_number":7549,"context_line":"            context: nova.context.RequestContext,"},{"line_number":7550,"context_line":"            instance: \u0027objects.Instance\u0027,"},{"line_number":7551,"context_line":"            pci_reqs: \u0027objects.InstancePCIRequests\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ccaadb71_61403c3e","line":7548,"range":{"start_line":7548,"start_character":8,"end_line":7548,"end_character":12},"updated":"2020-12-17 11:22:22.000000000","message":"nit","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":7545,"context_line":"        return device"},{"line_number":7546,"context_line":""},{"line_number":7547,"context_line":"    def _allocate_port_resource_for_instance("},{"line_number":7548,"context_line":"            self,"},{"line_number":7549,"context_line":"            context: nova.context.RequestContext,"},{"line_number":7550,"context_line":"            instance: \u0027objects.Instance\u0027,"},{"line_number":7551,"context_line":"            pci_reqs: \u0027objects.InstancePCIRequests\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"16c6d5f3_ba0908bf","line":7548,"range":{"start_line":7548,"start_character":8,"end_line":7548,"end_character":12},"in_reply_to":"ccaadb71_61403c3e","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":7575,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7576,"context_line":""},{"line_number":7577,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7578,"context_line":"        # smartnic the SingleRequestGroupBasedResourceRequest could be extended"},{"line_number":7579,"context_line":"        # to handle multiple request groups."},{"line_number":7580,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7581,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":18,"id":"ae85b432_21c0b0f4","line":7578,"range":{"start_line":7578,"start_character":23,"end_line":7578,"end_character":61},"updated":"2021-01-07 15:22:00.000000000","message":"Whoops","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":7575,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7576,"context_line":""},{"line_number":7577,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7578,"context_line":"        # smartnic the SingleRequestGroupBasedResourceRequest could be extended"},{"line_number":7579,"context_line":"        # to handle multiple request groups."},{"line_number":7580,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7581,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":18,"id":"a41f7b72_f70f091a","line":7578,"range":{"start_line":7578,"start_character":10,"end_line":7578,"end_character":18},"updated":"2021-01-07 15:22:00.000000000","message":"nit: smart NIC?","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":7575,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7576,"context_line":""},{"line_number":7577,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7578,"context_line":"        # smartnic the SingleRequestGroupBasedResourceRequest could be extended"},{"line_number":7579,"context_line":"        # to handle multiple request groups."},{"line_number":7580,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7581,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fc089068_61adbe9f","line":7578,"range":{"start_line":7578,"start_character":10,"end_line":7578,"end_character":18},"in_reply_to":"a41f7b72_f70f091a","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":7575,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7576,"context_line":""},{"line_number":7577,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7578,"context_line":"        # smartnic the SingleRequestGroupBasedResourceRequest could be extended"},{"line_number":7579,"context_line":"        # to handle multiple request groups."},{"line_number":7580,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7581,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":18,"id":"daaa4cfa_810b4b0b","line":7578,"range":{"start_line":7578,"start_character":23,"end_line":7578,"end_character":61},"in_reply_to":"ae85b432_21c0b0f4","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":7598,"context_line":"                # We lost a race. We could retry another candidate"},{"line_number":7599,"context_line":"                raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7600,"context_line":"                    instance_uuid\u003dinstance.uuid) from e"},{"line_number":7601,"context_line":"            except (exception.ConsumerAllocationRetrievalFailed,"},{"line_number":7602,"context_line":"                    keystone_exception.ClientException) as e:"},{"line_number":7603,"context_line":"                # These are non-recoverable errors so we should not retry"},{"line_number":7604,"context_line":"                raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7605,"context_line":"                    instance_uuid\u003dinstance.uuid) from e"}],"source_content_type":"text/x-python","patch_set":18,"id":"cf0a774b_8405d8d5","line":7602,"range":{"start_line":7601,"start_character":12,"end_line":7602,"end_character":61},"updated":"2021-01-07 15:22:00.000000000","message":"style nit:\n\n  except (\n      exception.ConsumerAllocationRetrievalFailed,\n      keystone_exception.ClientException,\n  ) as e:\n\nmakes this easier to expand in future and arguably prettier?","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":7598,"context_line":"                # We lost a race. We could retry another candidate"},{"line_number":7599,"context_line":"                raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7600,"context_line":"                    instance_uuid\u003dinstance.uuid) from e"},{"line_number":7601,"context_line":"            except (exception.ConsumerAllocationRetrievalFailed,"},{"line_number":7602,"context_line":"                    keystone_exception.ClientException) as e:"},{"line_number":7603,"context_line":"                # These are non-recoverable errors so we should not retry"},{"line_number":7604,"context_line":"                raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7605,"context_line":"                    instance_uuid\u003dinstance.uuid) from e"}],"source_content_type":"text/x-python","patch_set":18,"id":"a35f0e77_4ab0e69e","line":7602,"range":{"start_line":7601,"start_character":12,"end_line":7602,"end_character":61},"in_reply_to":"cf0a774b_8405d8d5","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":7617,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7618,"context_line":"                provider_mappings)"},{"line_number":7619,"context_line":"        except (exception.AmbiguousResourceProviderForPCIRequest,"},{"line_number":7620,"context_line":"                exception.UnexpectedResourceProviderNameForPCIRequest):"},{"line_number":7621,"context_line":"            # These are programing errors. So we clean up an re-raise to let"},{"line_number":7622,"context_line":"            # the request fail"},{"line_number":7623,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":18,"id":"6eb8c121_ca63be90","line":7620,"updated":"2021-01-07 15:22:00.000000000","message":"ditto","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":7617,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7618,"context_line":"                provider_mappings)"},{"line_number":7619,"context_line":"        except (exception.AmbiguousResourceProviderForPCIRequest,"},{"line_number":7620,"context_line":"                exception.UnexpectedResourceProviderNameForPCIRequest):"},{"line_number":7621,"context_line":"            # These are programing errors. So we clean up an re-raise to let"},{"line_number":7622,"context_line":"            # the request fail"},{"line_number":7623,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":18,"id":"63f07f1f_5f051a37","line":7620,"in_reply_to":"6eb8c121_ca63be90","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":7546,"context_line":"        context: nova.context.RequestContext,"},{"line_number":7547,"context_line":"        instance: \u0027objects.Instance\u0027,"},{"line_number":7548,"context_line":"        pci_reqs: \u0027objects.InstancePCIRequests\u0027,"},{"line_number":7549,"context_line":"        request_groups: \u0027objects.RequestGroup\u0027,"},{"line_number":7550,"context_line":"    ) -\u003e ty.Tuple[ty.Optional[ty.Dict[str, ty.List[str]]],"},{"line_number":7551,"context_line":"                  ty.Optional[ty.Dict[str, ty.Dict[str, ty.Dict[str, int]]]]]:"},{"line_number":7552,"context_line":"        \"\"\"Allocate resources for the request in placement"}],"source_content_type":"text/x-python","patch_set":19,"id":"4e567ea8_8c628611","line":7549,"range":{"start_line":7549,"start_character":24,"end_line":7549,"end_character":46},"updated":"2021-01-11 12:04:08.000000000","message":"Is this correct? The use of the index operator below (request_groups[0]) and name suggest not.","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":7546,"context_line":"        context: nova.context.RequestContext,"},{"line_number":7547,"context_line":"        instance: \u0027objects.Instance\u0027,"},{"line_number":7548,"context_line":"        pci_reqs: \u0027objects.InstancePCIRequests\u0027,"},{"line_number":7549,"context_line":"        request_groups: \u0027objects.RequestGroup\u0027,"},{"line_number":7550,"context_line":"    ) -\u003e ty.Tuple[ty.Optional[ty.Dict[str, ty.List[str]]],"},{"line_number":7551,"context_line":"                  ty.Optional[ty.Dict[str, ty.Dict[str, ty.Dict[str, int]]]]]:"},{"line_number":7552,"context_line":"        \"\"\"Allocate resources for the request in placement"}],"source_content_type":"text/x-python","patch_set":19,"id":"953e4a04_0e8dc8d9","line":7549,"range":{"start_line":7549,"start_character":24,"end_line":7549,"end_character":46},"in_reply_to":"4e567ea8_8c628611","updated":"2021-01-11 13:47:38.000000000","message":"you are right. Interestingly mypy did not caught that. Fixed now.","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":7586,"context_line":"            # allocation"},{"line_number":7587,"context_line":"            # TODO(gibi): We could loop over all possible candidates"},{"line_number":7588,"context_line":"            # if the first one selected here does not work due to race or due"},{"line_number":7589,"context_line":"            # to not having free PCI devices. However the latter only detected"},{"line_number":7590,"context_line":"            # later in the interface attach code path."},{"line_number":7591,"context_line":"            alloc_req \u003d alloc_reqs[0]"},{"line_number":7592,"context_line":"            resources \u003d alloc_req[\u0027allocations\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"fcc0fc98_079dc938","line":7589,"range":{"start_line":7589,"start_character":64,"end_line":7589,"end_character":65},"updated":"2021-01-11 12:04:08.000000000","message":"nit: is","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":7586,"context_line":"            # allocation"},{"line_number":7587,"context_line":"            # TODO(gibi): We could loop over all possible candidates"},{"line_number":7588,"context_line":"            # if the first one selected here does not work due to race or due"},{"line_number":7589,"context_line":"            # to not having free PCI devices. However the latter only detected"},{"line_number":7590,"context_line":"            # later in the interface attach code path."},{"line_number":7591,"context_line":"            alloc_req \u003d alloc_reqs[0]"},{"line_number":7592,"context_line":"            resources \u003d alloc_req[\u0027allocations\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"ef749718_831135e8","line":7589,"range":{"start_line":7589,"start_character":64,"end_line":7589,"end_character":65},"in_reply_to":"fcc0fc98_079dc938","updated":"2021-01-11 13:47:38.000000000","message":"Done","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":7609,"context_line":"        else:"},{"line_number":7610,"context_line":"            # no allocation candidates available, we run out of free resources"},{"line_number":7611,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7612,"context_line":"                instance_uuid\u003dinstance.uuid)"},{"line_number":7613,"context_line":""},{"line_number":7614,"context_line":"        try:"},{"line_number":7615,"context_line":"            update \u003d ("}],"source_content_type":"text/x-python","patch_set":19,"id":"004f59dc_24352b76","line":7612,"updated":"2021-01-11 12:04:08.000000000","message":"style nit:\n\n  if not alloc_reqs:\n      raise exception.InterfaceAttachResourceAllocationFailed(\n          instance_uuid\u003dinstance.uuid)\n\n  # select one of the candidates and update the instance allocation\n  ...","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":7609,"context_line":"        else:"},{"line_number":7610,"context_line":"            # no allocation candidates available, we run out of free resources"},{"line_number":7611,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7612,"context_line":"                instance_uuid\u003dinstance.uuid)"},{"line_number":7613,"context_line":""},{"line_number":7614,"context_line":"        try:"},{"line_number":7615,"context_line":"            update \u003d ("}],"source_content_type":"text/x-python","patch_set":19,"id":"28168b51_1cfff966","line":7612,"in_reply_to":"004f59dc_24352b76","updated":"2021-01-11 13:47:38.000000000","message":"OK. I\u0027ve inverted the branches and removed the else branch and then promoted the content of it to top level of the function","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7583,"context_line":"        :param instance: the objects.Instance to where the interface is being"},{"line_number":7584,"context_line":"            attached"},{"line_number":7585,"context_line":"        :param pci_reqs: A list of InstancePCIRequest objects describing the"},{"line_number":7586,"context_line":"            needed PCI devices"},{"line_number":7587,"context_line":"        :raises InterfaceAttachResourceAllocationFailed: if we failed to"},{"line_number":7588,"context_line":"            allocate resource in placement for the request"},{"line_number":7589,"context_line":"        :returns: A tuple of provider mappings and allocated resources or"}],"source_content_type":"text/x-python","patch_set":21,"id":"21ca9ba4_7a6e026e","line":7586,"updated":"2021-02-09 14:53:24.000000000","message":"you forgot a docstring for explaining the request_groups parameter.\n\nYet another proof of mypy be nice but not that important.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7c681689af5e6b7f62f7d83b623e3160caefef41","unresolved":true,"context_lines":[{"line_number":7583,"context_line":"        :param instance: the objects.Instance to where the interface is being"},{"line_number":7584,"context_line":"            attached"},{"line_number":7585,"context_line":"        :param pci_reqs: A list of InstancePCIRequest objects describing the"},{"line_number":7586,"context_line":"            needed PCI devices"},{"line_number":7587,"context_line":"        :raises InterfaceAttachResourceAllocationFailed: if we failed to"},{"line_number":7588,"context_line":"            allocate resource in placement for the request"},{"line_number":7589,"context_line":"        :returns: A tuple of provider mappings and allocated resources or"}],"source_content_type":"text/x-python","patch_set":21,"id":"64726229_59a81ec3","line":7586,"in_reply_to":"21ca9ba4_7a6e026e","updated":"2021-02-09 16:33:35.000000000","message":"mypy does not use this infact if we wer just using my py we would remove the docs string so not really an argument to not use mypy.\nits an argumet to stop used seperate doc string for parmaters.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":false,"context_lines":[{"line_number":7583,"context_line":"        :param instance: the objects.Instance to where the interface is being"},{"line_number":7584,"context_line":"            attached"},{"line_number":7585,"context_line":"        :param pci_reqs: A list of InstancePCIRequest objects describing the"},{"line_number":7586,"context_line":"            needed PCI devices"},{"line_number":7587,"context_line":"        :raises InterfaceAttachResourceAllocationFailed: if we failed to"},{"line_number":7588,"context_line":"            allocate resource in placement for the request"},{"line_number":7589,"context_line":"        :returns: A tuple of provider mappings and allocated resources or"}],"source_content_type":"text/x-python","patch_set":21,"id":"83cb9aff_c74bcca4","line":7586,"in_reply_to":"484e4e48_d0f1a227","updated":"2021-02-12 12:23:12.000000000","message":"\u003e describing the type can be done with mypy describing the meaning needs a comment. Done\n\n+1\n\nFor this to be complete _without_ mypy, you should really use:\n\n  :param pci_reqs: A list of InstancePCIRequest objects describing the\n       needed PCI devices\n  :type pci_reqs: ``nova.objects.InstancePCIRequest``\n\n[1] https://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":7583,"context_line":"        :param instance: the objects.Instance to where the interface is being"},{"line_number":7584,"context_line":"            attached"},{"line_number":7585,"context_line":"        :param pci_reqs: A list of InstancePCIRequest objects describing the"},{"line_number":7586,"context_line":"            needed PCI devices"},{"line_number":7587,"context_line":"        :raises InterfaceAttachResourceAllocationFailed: if we failed to"},{"line_number":7588,"context_line":"            allocate resource in placement for the request"},{"line_number":7589,"context_line":"        :returns: A tuple of provider mappings and allocated resources or"}],"source_content_type":"text/x-python","patch_set":21,"id":"484e4e48_d0f1a227","line":7586,"in_reply_to":"64726229_59a81ec3","updated":"2021-02-11 15:46:31.000000000","message":"describing the type can be done with mypy describing the meaning needs a comment. Done","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7599,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"},{"line_number":7600,"context_line":"        # placement"},{"line_number":7601,"context_line":"        compute_node_uuid \u003d objects.ComputeNode.get_by_nodename("},{"line_number":7602,"context_line":"            context, instance.node).uuid"},{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"}],"source_content_type":"text/x-python","patch_set":21,"id":"0cdbfa27_6cd27915","line":7602,"updated":"2021-02-09 14:53:24.000000000","message":"this is a bit fragile, as get_by_nodename could raise a ComputeHostNotFound exception in case of a missing compute_nodes record. I\u0027d like if we could be a bit more conservative.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":true,"context_lines":[{"line_number":7599,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"},{"line_number":7600,"context_line":"        # placement"},{"line_number":7601,"context_line":"        compute_node_uuid \u003d objects.ComputeNode.get_by_nodename("},{"line_number":7602,"context_line":"            context, instance.node).uuid"},{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"}],"source_content_type":"text/x-python","patch_set":21,"id":"d57ae26f_a3355513","line":7602,"in_reply_to":"0cdbfa27_6cd27915","updated":"2021-02-11 15:46:31.000000000","message":"While technically possible it is really unrealistic that ComputeNode record does not exists while the compute RPC was able to send the attach_interface message to this this compute. \n\nSo if this happens then I think we have a big problem we have an instance running on a compute node where the compute node record does not exists. The current interface_attach call will fail with HTTP500 (as no handler is added) which I think is correct as we hit a DB inconsistency at least.\n\nUntil this point in the interface_attach process we did not allocated any external resources or modified the DB so nothing to roll back hence there is no except: branch.\n\nDo you have a better idea what to do in this situation?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":false,"context_lines":[{"line_number":7599,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"},{"line_number":7600,"context_line":"        # placement"},{"line_number":7601,"context_line":"        compute_node_uuid \u003d objects.ComputeNode.get_by_nodename("},{"line_number":7602,"context_line":"            context, instance.node).uuid"},{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"}],"source_content_type":"text/x-python","patch_set":21,"id":"7d6ff8c8_abbe0114","line":7602,"in_reply_to":"96a5f258_0cd60e1d","updated":"2021-02-22 14:39:56.000000000","message":"Well, actually you\u0027re right. If the compute is not existing, then we should hardfail.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":false,"context_lines":[{"line_number":7599,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"},{"line_number":7600,"context_line":"        # placement"},{"line_number":7601,"context_line":"        compute_node_uuid \u003d objects.ComputeNode.get_by_nodename("},{"line_number":7602,"context_line":"            context, instance.node).uuid"},{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"}],"source_content_type":"text/x-python","patch_set":21,"id":"96a5f258_0cd60e1d","line":7602,"in_reply_to":"d57ae26f_a3355513","updated":"2021-02-12 12:23:12.000000000","message":"I agree that letting this hard fail is a reasonable approach, given how serious an error that would be if we encountered it","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e2cbcd6c79bc9fa2cf4878d877b1be99a383342","unresolved":true,"context_lines":[{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":21,"id":"18427899_8023b1b3","line":7606,"range":{"start_line":7606,"start_character":68,"end_line":7606,"end_character":76},"updated":"2021-01-22 18:16:09.000000000","message":"its possible but im not sure it will be.\nthats a little tricky because really we will need a way to corralate multiple requst groups if\nsimilar to same subtree or via aggreate sharing of some kind but i dont think we can experss that relationship\nto placment with the current set of apis.\n\nanyway the note does not hurt but i do wonder what direction we might end up taking.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39d7fd519f415bce4de19bc4f1bf26d523c65753","unresolved":false,"context_lines":[{"line_number":7603,"context_line":"        request_group.in_tree \u003d compute_node_uuid"},{"line_number":7604,"context_line":""},{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"}],"source_content_type":"text/x-python","patch_set":21,"id":"f2f4b0e3_24ba2784","line":7606,"range":{"start_line":7606,"start_character":68,"end_line":7606,"end_character":76},"in_reply_to":"18427899_8023b1b3","updated":"2021-01-26 12:55:42.000000000","message":"yeah, at the first step in SmartNIC the neutron qos support is out of scope. So this case will not happen soon. Also true that expressing colocation of qos and smartnic RCs to the same subtree would be needed or sharing relationships needs to be set up. It is all depends on how we will model smartnic and how that can be connected to the existing qos resource model in placement. If I have to guess then placement aggregates will be needed at the end.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e2cbcd6c79bc9fa2cf4878d877b1be99a383342","unresolved":true,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"843cb976_f39d8be8","line":7608,"range":{"start_line":7608,"start_character":8,"end_line":7608,"end_character":10},"updated":"2021-01-22 18:16:09.000000000","message":"nit: not a huge fan of really short names but meh\n\nyou are doing this to avoid nesting but \n\n\nalloc_reqs, provider_sums, version \u003d (\n    self.reportclient.get_allocation_candidates(\n        context, scheduler_utils.ResourceRequest.from_request_group(\n            request_group)))\n\nmight be nicer.\n\nbut ya general feedback is meh it could be better named but the code works and its\nnot hard to follow since the short names are imediatly used on the next line anyway.\n\nif you were usign them many lines down in the funciton it would be a different matter\nbut your not.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"6083c95c_d4f78200","line":7608,"updated":"2021-02-09 14:53:24.000000000","message":"you could end up with ValueError exceptions if the request group is malformed, I\u0027d appreciate some kind of preventive action in this case.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3165a6c4a1c7e96ef7c925cefc5c05d707c88ba7","unresolved":false,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"b5cdb9d9_33a09a59","line":7608,"range":{"start_line":7608,"start_character":8,"end_line":7608,"end_character":10},"in_reply_to":"267b098e_dacbf3e8","updated":"2021-01-26 13:26:11.000000000","message":"for me its more about proximity.\n\nsort names need to be consumed locally where the context of the short name is likely still in your brain.\nlonger names can be consumed farther away in a function as they carry the context with them\n\nin this case i think they are ok to use in my view since its definetly the fromer case as they are\nused directly on the line they are needed.\n\nThe \n\nalloc_reqs, provider_sums, version \u003d (\n    self.reportclient.get_allocation_candidates(\n        context, scheduler_utils.ResourceRequest.from_request_group(\n            request_group)))\n\napproach is actually motivated by a different thing which is to not name things if they are only used once and dont need a name.\n\nbut nesting like this is not always the simplest to read either.\n\nin this case i am fine with what you wrote as its perfectly readable and correct.\ni just tend to do it the other way to limit the lifetime/scope of objects in memory.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":false,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"8978d17f_b25322c9","line":7608,"in_reply_to":"499f8856_e2ce0d9c","updated":"2021-02-12 12:23:12.000000000","message":"Good point from bauzas but +1 to simply raising for program error","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":true,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"499f8856_e2ce0d9c","line":7608,"in_reply_to":"6083c95c_d4f78200","updated":"2021-02-11 15:46:31.000000000","message":"As the ValueError states it is an implementation error. The API call will fail with HTTP500 as there is no specific handler but HTTP500 is appropriate for programmer error. Also at this point we are not allocated any external resources or updated the DB so nothing to roll back.\n\nDo you have a specific idea how to prevent this here?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39d7fd519f415bce4de19bc4f1bf26d523c65753","unresolved":false,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"267b098e_dacbf3e8","line":7608,"range":{"start_line":7608,"start_character":8,"end_line":7608,"end_character":10},"in_reply_to":"843cb976_f39d8be8","updated":"2021-01-26 12:55:42.000000000","message":"yeah it is matter of taste I guess.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":false,"context_lines":[{"line_number":7605,"context_line":"        # NOTE(gibi): when support is added for attaching a cyborg based"},{"line_number":7606,"context_line":"        # smart NIC the ResourceRequest could be extended to handle multiple"},{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"cb904987_033192eb","line":7608,"in_reply_to":"8978d17f_b25322c9","updated":"2021-02-22 14:39:56.000000000","message":"Well, OK, let\u0027s hardstop too...","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""},{"line_number":7612,"context_line":"        if not alloc_reqs:"},{"line_number":7613,"context_line":"            # no allocation candidates available, we run out of free resources"}],"source_content_type":"text/x-python","patch_set":21,"id":"c3ded50b_d6a8f27b","line":7610,"updated":"2021-02-09 14:53:24.000000000","message":"this always returns a tuple, so we\u0027re all good.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":7607,"context_line":"        # request groups."},{"line_number":7608,"context_line":"        rr \u003d scheduler_utils.ResourceRequest.from_request_group(request_group)"},{"line_number":7609,"context_line":"        res \u003d self.reportclient.get_allocation_candidates(context, rr)"},{"line_number":7610,"context_line":"        alloc_reqs, provider_sums, version \u003d res"},{"line_number":7611,"context_line":""},{"line_number":7612,"context_line":"        if not alloc_reqs:"},{"line_number":7613,"context_line":"            # no allocation candidates available, we run out of free resources"}],"source_content_type":"text/x-python","patch_set":21,"id":"0cf32d17_ea3d88d6","line":7610,"in_reply_to":"c3ded50b_d6a8f27b","updated":"2021-02-11 15:46:31.000000000","message":"Ack","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7612,"context_line":"        if not alloc_reqs:"},{"line_number":7613,"context_line":"            # no allocation candidates available, we run out of free resources"},{"line_number":7614,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7615,"context_line":"                instance_uuid\u003dinstance.uuid)"},{"line_number":7616,"context_line":""},{"line_number":7617,"context_line":"        # select one of the candidates and update the instance"},{"line_number":7618,"context_line":"        # allocation"}],"source_content_type":"text/x-python","patch_set":21,"id":"0a99126c_c91435d5","line":7615,"updated":"2021-02-09 14:53:24.000000000","message":"all good, since we record the instance action failure, it\u0027s OK to just return a 400 here.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":7612,"context_line":"        if not alloc_reqs:"},{"line_number":7613,"context_line":"            # no allocation candidates available, we run out of free resources"},{"line_number":7614,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7615,"context_line":"                instance_uuid\u003dinstance.uuid)"},{"line_number":7616,"context_line":""},{"line_number":7617,"context_line":"        # select one of the candidates and update the instance"},{"line_number":7618,"context_line":"        # allocation"}],"source_content_type":"text/x-python","patch_set":21,"id":"e8c9b996_ef0e0af2","line":7615,"in_reply_to":"0a99126c_c91435d5","updated":"2021-02-11 15:46:31.000000000","message":"Ack","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7629,"context_line":"        except exception.AllocationUpdateFailed as e:"},{"line_number":7630,"context_line":"            # We lost a race. We could retry another candidate"},{"line_number":7631,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7632,"context_line":"                instance_uuid\u003dinstance.uuid) from e"},{"line_number":7633,"context_line":"        except ("},{"line_number":7634,"context_line":"            exception.ConsumerAllocationRetrievalFailed,"},{"line_number":7635,"context_line":"            keystone_exception.ClientException,"}],"source_content_type":"text/x-python","patch_set":21,"id":"9aa01099_8b1b7178","line":7632,"range":{"start_line":7632,"start_character":45,"end_line":7632,"end_character":51},"updated":"2021-02-09 14:53:24.000000000","message":"yet again some py3 sugar, but OK we won\u0027t backport this change...","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":7629,"context_line":"        except exception.AllocationUpdateFailed as e:"},{"line_number":7630,"context_line":"            # We lost a race. We could retry another candidate"},{"line_number":7631,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7632,"context_line":"                instance_uuid\u003dinstance.uuid) from e"},{"line_number":7633,"context_line":"        except ("},{"line_number":7634,"context_line":"            exception.ConsumerAllocationRetrievalFailed,"},{"line_number":7635,"context_line":"            keystone_exception.ClientException,"}],"source_content_type":"text/x-python","patch_set":21,"id":"f7f5c7fd_1fb00697","line":7632,"range":{"start_line":7632,"start_character":45,"end_line":7632,"end_character":51},"in_reply_to":"9aa01099_8b1b7178","updated":"2021-02-11 15:46:31.000000000","message":"this is not just sugar, this actually makes sure that the content of the original exception is not lost when we are replacing it with a more context specific exception.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":false,"context_lines":[{"line_number":7629,"context_line":"        except exception.AllocationUpdateFailed as e:"},{"line_number":7630,"context_line":"            # We lost a race. We could retry another candidate"},{"line_number":7631,"context_line":"            raise exception.InterfaceAttachResourceAllocationFailed("},{"line_number":7632,"context_line":"                instance_uuid\u003dinstance.uuid) from e"},{"line_number":7633,"context_line":"        except ("},{"line_number":7634,"context_line":"            exception.ConsumerAllocationRetrievalFailed,"},{"line_number":7635,"context_line":"            keystone_exception.ClientException,"}],"source_content_type":"text/x-python","patch_set":21,"id":"a68dd969_e43c333d","line":7632,"range":{"start_line":7632,"start_character":45,"end_line":7632,"end_character":51},"in_reply_to":"f7f5c7fd_1fb00697","updated":"2021-02-12 12:23:12.000000000","message":"It\u0027s called exception chaining. Lots more information here [1] and here [2]. If we wanted to support Python 2 then we could use six.raise_from, which doe this on Python 3 and just raised the primary exception (exception.InterfaceAttachResourceAllocationFailed) on Python 2, but we don\u0027t need that now obviously\n\n[1] https://www.python.org/dev/peps/pep-3134/\n[2] https://stackoverflow.com/a/23743388/613428","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7641,"context_line":"        try:"},{"line_number":7642,"context_line":"            update \u003d ("},{"line_number":7643,"context_line":"                compute_utils."},{"line_number":7644,"context_line":"                    update_pci_request_spec_with_allocated_interface_name)"},{"line_number":7645,"context_line":"            update("},{"line_number":7646,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7647,"context_line":"                provider_mappings)"}],"source_content_type":"text/x-python","patch_set":21,"id":"e77810a4_f8edc51e","line":7644,"updated":"2021-02-09 14:53:24.000000000","message":"heh, shortening again ;)","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":7641,"context_line":"        try:"},{"line_number":7642,"context_line":"            update \u003d ("},{"line_number":7643,"context_line":"                compute_utils."},{"line_number":7644,"context_line":"                    update_pci_request_spec_with_allocated_interface_name)"},{"line_number":7645,"context_line":"            update("},{"line_number":7646,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7647,"context_line":"                provider_mappings)"}],"source_content_type":"text/x-python","patch_set":21,"id":"0fedaf4b_829f611d","line":7644,"in_reply_to":"e77810a4_f8edc51e","updated":"2021-02-11 15:46:31.000000000","message":"Ack","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":7653,"context_line":"            # the request fail"},{"line_number":7654,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7655,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7656,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7657,"context_line":""},{"line_number":7658,"context_line":"        return provider_mappings, resources"},{"line_number":7659,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"f5433ffe_916553b1","line":7656,"updated":"2021-02-09 14:53:24.000000000","message":"what if the removal raises conflict because of a race ?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":7653,"context_line":"            # the request fail"},{"line_number":7654,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7655,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7656,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7657,"context_line":""},{"line_number":7658,"context_line":"        return provider_mappings, resources"},{"line_number":7659,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"13ba3139_80732b50","line":7656,"in_reply_to":"91bb9769_b850c66b","updated":"2021-02-23 14:05:31.000000000","message":"We have the following logged:\n\nFailed to update allocations for consumer 829453f5-a63e-41b1-b7e9-98dfb74b9bfd. Error: Cannot remove resources {\u0027f92f1b6f-da29-4eba-9046-663e2d6ba2bb\u0027: {\u0027resources\u0027: {\u0027NET_BW_EGR_KILOBIT_PER_SEC\u0027: 10000, \u0027NET_BW_IGR_KILOBIT_PER_SEC\u0027: 10000}}} from the allocation due to multiple successive generation conflicts in placement.\n\nI added an assert to the functional test to show it in a FUP\n\nI changed the exception text to mention the audit command as well in the FUP.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":7653,"context_line":"            # the request fail"},{"line_number":7654,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7655,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7656,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7657,"context_line":""},{"line_number":7658,"context_line":"        return provider_mappings, resources"},{"line_number":7659,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"91bb9769_b850c66b","line":7656,"in_reply_to":"c004b36d_c449d6a3","updated":"2021-02-22 14:39:56.000000000","message":"We could mention by a LOG.error that the operator should probably double check the allocations as there are good chances they could be orphaned and we could hint the fact we do have an audit() command that helps for sure.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":true,"context_lines":[{"line_number":7653,"context_line":"            # the request fail"},{"line_number":7654,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7655,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7656,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7657,"context_line":""},{"line_number":7658,"context_line":"        return provider_mappings, resources"},{"line_number":7659,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"c004b36d_c449d6a3","line":7656,"in_reply_to":"f5433ffe_916553b1","updated":"2021-02-11 15:46:31.000000000","message":"Please note that remove_resources_from_instance_allocation implements an internal retry loop in case of conflict. So it only gives up if we run out of predefine number of retries. \n\nThen the AllocationUpdateFailed will bubble up to the API, translated to HTTP 500 there as no error handler is added for this exception. And yes it means we leaked allocation in placement. But the only way to avoid that is to delete the allocation. We tried that here coupe of times and failed. I don\u0027t see what else I can do other than give up. (The logged exception will have information about what resource is leaked and where so the admin can recover the situation based on the logs)  \n\nWhat do you suggest? Shall we translate it to another error code?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":true,"context_lines":[{"line_number":7593,"context_line":"        \"\"\""},{"line_number":7594,"context_line":""},{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"11223f1c_fdb504f0","line":7596,"range":{"start_line":7596,"start_character":19,"end_line":7596,"end_character":29},"updated":"2021-02-12 12:23:12.000000000","message":"If you just returned an tuple of empty dicts then your signature would be a lot nicer and the caller would still work similarly (assuming you\u0027re using false\u0027y checks rather than \u0027is None\u0027 checks)","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":7593,"context_line":"        \"\"\""},{"line_number":7594,"context_line":""},{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"22c25c34_ff4b0d16","line":7596,"range":{"start_line":7596,"start_character":19,"end_line":7596,"end_character":29},"in_reply_to":"11223f1c_fdb504f0","updated":"2021-02-22 14:39:56.000000000","message":"Fortunately, by default, it returns a tuple :\n  \u003e\u003e\u003e def test():\n  ...     return None, None\n  ... \n  \u003e\u003e\u003e ret \u003d test()\n  \u003e\u003e\u003e type(ret)\n  \u003cclass \u0027tuple\u0027\u003e\n\nAnd fwiw, returning None instead of an empty dict is I think better as it\u0027s providing a better signal.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":7593,"context_line":"        \"\"\""},{"line_number":7594,"context_line":""},{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ce400c91_7b032f6e","line":7596,"range":{"start_line":7596,"start_character":19,"end_line":7596,"end_character":29},"in_reply_to":"22c25c34_ff4b0d16","updated":"2021-02-23 14:05:31.000000000","message":"Hm so you are actually not agreeing to change None, None to {}, {}. Then I guess I will leave this as is.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"8797b19889e9cf7b0f29573bd8874513aacde7d7","unresolved":true,"context_lines":[{"line_number":7593,"context_line":"        \"\"\""},{"line_number":7594,"context_line":""},{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"d8f53c46_03056b76","line":7596,"range":{"start_line":7596,"start_character":19,"end_line":7596,"end_character":29},"in_reply_to":"22c25c34_ff4b0d16","updated":"2021-02-24 00:53:58.000000000","message":"In line7578, it was defined the return value with *tuple* need to keep the same, so here returns a tuple.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":true,"context_lines":[{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""},{"line_number":7600,"context_line":"        # restrict the resource request to the current compute node. The"},{"line_number":7601,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"}],"source_content_type":"text/x-python","patch_set":22,"id":"0396cb6b_66dc21c1","line":7598,"updated":"2021-02-12 12:23:12.000000000","message":"A bit of context about why we use only the first one would be helpful. I assume it\u0027s because of this comment from below:\n\n        # We only support one port per attach request so we at most have one\n        # pci request\n\nPerhaps we could just delegate this (taking the first item from the list) to the caller instead?","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""},{"line_number":7600,"context_line":"        # restrict the resource request to the current compute node. The"},{"line_number":7601,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"}],"source_content_type":"text/x-python","patch_set":22,"id":"a2fec27e_80bdee63","line":7598,"in_reply_to":"0396cb6b_66dc21c1","updated":"2021-02-22 14:39:56.000000000","message":"Agreed with Stephen, just add some comment about why you can just use the first value but this could be done in a FUP.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":7595,"context_line":"        if not request_groups:"},{"line_number":7596,"context_line":"            return None, None"},{"line_number":7597,"context_line":""},{"line_number":7598,"context_line":"        request_group \u003d request_groups[0]"},{"line_number":7599,"context_line":""},{"line_number":7600,"context_line":"        # restrict the resource request to the current compute node. The"},{"line_number":7601,"context_line":"        # compute node uuid is the uuid of the root provider of the node in"}],"source_content_type":"text/x-python","patch_set":22,"id":"c668f418_bbc600c7","line":7598,"in_reply_to":"a2fec27e_80bdee63","updated":"2021-02-23 14:05:31.000000000","message":"There are two things here:\n1) we only support one port per attach request\n2) today one port can only request a single request group\n\nI don\u0027t think #1) will change in the future but #2) can. This is why nova.network.neutron.API.create_resource_requests() returns a list of RequestGroup objects and this is why that list is passed down here. I added a comment explaining why we can assume a single RequestGroup here in a FUP","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"329c552f09e872a709f931c056c23a89f240d710","unresolved":true,"context_lines":[{"line_number":7643,"context_line":"        try:"},{"line_number":7644,"context_line":"            update \u003d ("},{"line_number":7645,"context_line":"                compute_utils."},{"line_number":7646,"context_line":"                    update_pci_request_spec_with_allocated_interface_name)"},{"line_number":7647,"context_line":"            update("},{"line_number":7648,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7649,"context_line":"                provider_mappings)"}],"source_content_type":"text/x-python","patch_set":22,"id":"8c663577_83bffb3b","line":7646,"updated":"2021-02-12 12:23:12.000000000","message":"we really need to shorten this function name 😄","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":7643,"context_line":"        try:"},{"line_number":7644,"context_line":"            update \u003d ("},{"line_number":7645,"context_line":"                compute_utils."},{"line_number":7646,"context_line":"                    update_pci_request_spec_with_allocated_interface_name)"},{"line_number":7647,"context_line":"            update("},{"line_number":7648,"context_line":"                context, self.reportclient, pci_reqs.requests,"},{"line_number":7649,"context_line":"                provider_mappings)"}],"source_content_type":"text/x-python","patch_set":22,"id":"f978606d_e4e15eaf","line":7646,"in_reply_to":"8c663577_83bffb3b","updated":"2021-02-23 14:05:31.000000000","message":"or allow nova to have more than 79 chars in a line :)","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":7655,"context_line":"            # the request fail"},{"line_number":7656,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7657,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7658,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7659,"context_line":""},{"line_number":7660,"context_line":"        return provider_mappings, resources"},{"line_number":7661,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bf577436_c388121a","line":7658,"updated":"2021-02-22 14:39:56.000000000","message":"See comment on PS21 about a possible ERROR log for ops. Worth a FUP tho.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":7655,"context_line":"            # the request fail"},{"line_number":7656,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":7657,"context_line":"                self.reportclient.remove_resources_from_instance_allocation("},{"line_number":7658,"context_line":"                    context, instance.uuid, resources)"},{"line_number":7659,"context_line":""},{"line_number":7660,"context_line":"        return provider_mappings, resources"},{"line_number":7661,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"358ada3c_b4d0ee58","line":7658,"in_reply_to":"bf577436_c388121a","updated":"2021-02-23 14:05:31.000000000","message":"See my reply in PS21.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"}],"nova/scheduler/utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":497,"context_line":"        return parse.urlencode(sorted(qparams))"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __str__(self):"},{"line_number":500,"context_line":"        return str(self.request_group)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"def build_request_spec(image, instances, instance_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"f166344e_90918d6a","line":500,"updated":"2020-12-17 11:22:22.000000000","message":"I don\u0027t know why, but I really don\u0027t like having this second view into what is essentially the same thing as \u0027ResourceRequest\u0027. Rather than doing this, would it be possible to rework \u0027ResourceRequest\u0027 somehow? I\u0027m thinking we could moving the contents of \u0027__init__\u0027 to a staticmethod e.g. \u0027create_from_request_spec\u0027? You could then have another \u0027create_from_request_group\u0027 staticmethod to achieve what you want here. I know that\u0027s probably a little more complicated but at least \u0027get_allocation_candidates\u0027 is being called with a consistent thing then.","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        return parse.urlencode(sorted(qparams))"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __str__(self):"},{"line_number":500,"context_line":"        return str(self.request_group)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"def build_request_spec(image, instances, instance_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"a282867d_d114bff6","line":500,"in_reply_to":"9c3b89d6_e310544a","updated":"2021-01-07 15:22:00.000000000","message":"Ack","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        return parse.urlencode(sorted(qparams))"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def __str__(self):"},{"line_number":500,"context_line":"        return str(self.request_group)"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"def build_request_spec(image, instances, instance_type\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9c3b89d6_e310544a","line":500,"in_reply_to":"f166344e_90918d6a","updated":"2021-01-07 12:47:18.000000000","message":"Added the refactoring as a separate parent patch and changed this patch to add and use new factory method to ResourceRequest","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":193,"context_line":"        return self"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    @staticmethod"},{"line_number":196,"context_line":"    def from_request_group(request_group):"},{"line_number":197,"context_line":"        \"\"\"Create a new instance of ResourceRequest from a RequestGroup."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        :param request_group: a RequestGroup object defining the request"}],"source_content_type":"text/x-python","patch_set":18,"id":"7e46711d_e87893b0","line":196,"range":{"start_line":196,"start_character":27,"end_line":196,"end_character":42},"updated":"2021-01-07 15:22:00.000000000","message":"nit: could add type hints","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        return self"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    @staticmethod"},{"line_number":196,"context_line":"    def from_request_group(request_group):"},{"line_number":197,"context_line":"        \"\"\"Create a new instance of ResourceRequest from a RequestGroup."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        :param request_group: a RequestGroup object defining the request"}],"source_content_type":"text/x-python","patch_set":18,"id":"9b04c63e_fc115706","line":196,"range":{"start_line":196,"start_character":27,"end_line":196,"end_character":42},"in_reply_to":"7e46711d_e87893b0","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        :return: a ResourceRequest instance"},{"line_number":201,"context_line":"        \"\"\""},{"line_number":202,"context_line":"        self \u003d ResourceRequest()"},{"line_number":203,"context_line":"        self._add_request_group(request_group)"},{"line_number":204,"context_line":"        return self"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _process_requested_resources(self, request_spec):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9ccea7db_7310947f","line":203,"updated":"2021-01-07 15:22:00.000000000","message":"Do we need to call \u0027strip_zeros\u0027 here? Is there any chance that RequestGroup.resources will contain 0 values? I assume not, but just checking. Note that if we do decide to handle multiple groups here in the future, we\u0027ll have to remember to call this.","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        :return: a ResourceRequest instance"},{"line_number":201,"context_line":"        \"\"\""},{"line_number":202,"context_line":"        self \u003d ResourceRequest()"},{"line_number":203,"context_line":"        self._add_request_group(request_group)"},{"line_number":204,"context_line":"        return self"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"    def _process_requested_resources(self, request_spec):"}],"source_content_type":"text/x-python","patch_set":18,"id":"039007da_1c61b5fd","line":203,"in_reply_to":"9ccea7db_7310947f","updated":"2021-01-08 16:02:05.000000000","message":"it does not hurt to call strip here.","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @classmethod"},{"line_number":195,"context_line":"    def from_request_group("},{"line_number":196,"context_line":"        cls: ty.Type[\u0027ResourceRequest\u0027],"},{"line_number":197,"context_line":"        request_group: \u0027objects.RequestGroup\u0027,"},{"line_number":198,"context_line":"    ) -\u003e \u0027ResourceRequest\u0027:"},{"line_number":199,"context_line":"        \"\"\"Create a new instance of ResourceRequest from a RequestGroup.\"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"ef36b8da_ee8da247","line":196,"range":{"start_line":196,"start_character":11,"end_line":196,"end_character":40},"updated":"2021-01-11 12:04:08.000000000","message":"as before, I don\u0027t think this is necessary","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @classmethod"},{"line_number":195,"context_line":"    def from_request_group("},{"line_number":196,"context_line":"        cls: ty.Type[\u0027ResourceRequest\u0027],"},{"line_number":197,"context_line":"        request_group: \u0027objects.RequestGroup\u0027,"},{"line_number":198,"context_line":"    ) -\u003e \u0027ResourceRequest\u0027:"},{"line_number":199,"context_line":"        \"\"\"Create a new instance of ResourceRequest from a RequestGroup.\"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"3710e9be_475d1540","line":196,"range":{"start_line":196,"start_character":11,"end_line":196,"end_character":40},"in_reply_to":"ef36b8da_ee8da247","updated":"2021-01-11 13:47:38.000000000","message":"Done","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        request_group: \u0027objects.RequestGroup\u0027,"},{"line_number":198,"context_line":"    ) -\u003e \u0027ResourceRequest\u0027:"},{"line_number":199,"context_line":"        \"\"\"Create a new instance of ResourceRequest from a RequestGroup.\"\"\""},{"line_number":200,"context_line":"        rr \u003d cls()"},{"line_number":201,"context_line":"        rr._add_request_group(request_group)"},{"line_number":202,"context_line":"        rr.strip_zeros()"},{"line_number":203,"context_line":"        return rr"}],"source_content_type":"text/x-python","patch_set":19,"id":"f4f48e96_5ff24b5a","line":200,"range":{"start_line":200,"start_character":8,"end_line":200,"end_character":10},"updated":"2021-01-11 13:47:38.000000000","message":"renamed to res_req","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":5911,"context_line":""},{"line_number":5912,"context_line":"        with mock.patch("},{"line_number":5913,"context_line":"            \u0027nova.objects.Service.get_by_host_and_binary\u0027,"},{"line_number":5914,"context_line":"            side_effect\u003dfake_get_service):"},{"line_number":5915,"context_line":"            # try to add a port with resource request"},{"line_number":5916,"context_line":"            post \u003d {"},{"line_number":5917,"context_line":"                \u0027interfaceAttachment\u0027: {"}],"source_content_type":"text/x-python","patch_set":16,"id":"b7948211_16594785","line":5914,"range":{"start_line":5914,"start_character":40,"end_line":5914,"end_character":42},"updated":"2020-12-17 11:22:22.000000000","message":"nit:\n\n      side_effect\u003dfake_get_service,\n  ):","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":5911,"context_line":""},{"line_number":5912,"context_line":"        with mock.patch("},{"line_number":5913,"context_line":"            \u0027nova.objects.Service.get_by_host_and_binary\u0027,"},{"line_number":5914,"context_line":"            side_effect\u003dfake_get_service):"},{"line_number":5915,"context_line":"            # try to add a port with resource request"},{"line_number":5916,"context_line":"            post \u003d {"},{"line_number":5917,"context_line":"                \u0027interfaceAttachment\u0027: {"}],"source_content_type":"text/x-python","patch_set":16,"id":"d26fbdf5_c1ce603f","line":5914,"range":{"start_line":5914,"start_character":40,"end_line":5914,"end_character":42},"in_reply_to":"b7948211_16594785","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":6138,"context_line":"            self.sriov_dev_rp_per_host[self.compute1_rp_uuid][self.PF2],"},{"line_number":6139,"context_line":"            sriov_binding[\u0027allocation\u0027])"},{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"    def test_interface_attach_with_resource_request(self):"},{"line_number":6142,"context_line":"        server \u003d self._create_server("},{"line_number":6143,"context_line":"            flavor\u003dself.flavor,"},{"line_number":6144,"context_line":"            networks\u003d[{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":16,"id":"966fd600_dbb48d7b","line":6141,"updated":"2020-12-17 11:22:22.000000000","message":"nit: any chance we could group this with the above? Perhaps before it? Also, why is one titled \u0027with_port_resource_request\u0027 and the other \u0027with_resource_request\u0027? 😊","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":true,"context_lines":[{"line_number":6138,"context_line":"            self.sriov_dev_rp_per_host[self.compute1_rp_uuid][self.PF2],"},{"line_number":6139,"context_line":"            sriov_binding[\u0027allocation\u0027])"},{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"    def test_interface_attach_with_resource_request(self):"},{"line_number":6142,"context_line":"        server \u003d self._create_server("},{"line_number":6143,"context_line":"            flavor\u003dself.flavor,"},{"line_number":6144,"context_line":"            networks\u003d[{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":16,"id":"b3ee7fcf_2890a5f0","line":6141,"in_reply_to":"966fd600_dbb48d7b","updated":"2021-01-07 12:47:18.000000000","message":"I did the a rename above now. \n\nThese tests are further apart because they are in different test classes:\n\n* UnsupportedPortResourceRequestBasedSchedulingTest.test_interface_attach_with_port_resource_request_old_compute\n\n* PortResourceRequestBasedSchedulingTest.test_interface_attach_with_resource_request\n\nBoth test classes have the same base class so technically they could be merged, but I think the current organization is valid too. The tests in UnsupportedPortResourceRequestBasedSchedulingTest could be used to see what is not supported today with QoS. In the past it was a lot bigger test class today it is pretty small. \n\nAlso note that there is a sub class of UnsupportedPortResourceRequestBasedSchedulingTest named NonAdminUnsupportedPortResourceRequestBasedSchedulingTest which rerun the unsupported cases with non admin, as we had a bug[1] where the checks in the api was skipped with non-admin leading to late failures.\n\n[1] https://bugs.launchpad.net/nova/+bug/1850280","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":false,"context_lines":[{"line_number":6138,"context_line":"            self.sriov_dev_rp_per_host[self.compute1_rp_uuid][self.PF2],"},{"line_number":6139,"context_line":"            sriov_binding[\u0027allocation\u0027])"},{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"    def test_interface_attach_with_resource_request(self):"},{"line_number":6142,"context_line":"        server \u003d self._create_server("},{"line_number":6143,"context_line":"            flavor\u003dself.flavor,"},{"line_number":6144,"context_line":"            networks\u003d[{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":16,"id":"1be89744_b25e07e6","line":6141,"in_reply_to":"b3ee7fcf_2890a5f0","updated":"2021-01-07 15:22:00.000000000","message":"Ack","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":6144,"context_line":"            networks\u003d[{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}])"},{"line_number":6145,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":6146,"context_line":""},{"line_number":6147,"context_line":"        # start a second compute to show that resources only allocated from"},{"line_number":6148,"context_line":"        # the compute the instance currently runs on"},{"line_number":6149,"context_line":"        self.compute2 \u003d self._start_compute(\u0027host2\u0027)"},{"line_number":6150,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a8a1431_e6213331","line":6147,"range":{"start_line":6147,"start_character":56,"end_line":6147,"end_character":60},"updated":"2020-12-17 11:22:22.000000000","message":"are only ?","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":6144,"context_line":"            networks\u003d[{\u0027port\u0027: self.neutron.port_1[\u0027id\u0027]}])"},{"line_number":6145,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":6146,"context_line":""},{"line_number":6147,"context_line":"        # start a second compute to show that resources only allocated from"},{"line_number":6148,"context_line":"        # the compute the instance currently runs on"},{"line_number":6149,"context_line":"        self.compute2 \u003d self._start_compute(\u0027host2\u0027)"},{"line_number":6150,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"6aeaf3a7_b65d5f39","line":6147,"range":{"start_line":6147,"start_character":56,"end_line":6147,"end_character":60},"in_reply_to":"1a8a1431_e6213331","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":6152,"context_line":"        self.compute2_service_id \u003d self.admin_api.get_services("},{"line_number":6153,"context_line":"            host\u003d\u0027host2\u0027, binary\u003d\u0027nova-compute\u0027)[0][\u0027id\u0027]"},{"line_number":6154,"context_line":""},{"line_number":6155,"context_line":"        # attach an ovs port with resource request"},{"line_number":6156,"context_line":"        ovs_port \u003d self.neutron.port_with_resource_request"},{"line_number":6157,"context_line":"        post \u003d {"},{"line_number":6158,"context_line":"            \u0027interfaceAttachment\u0027: {"}],"source_content_type":"text/x-python","patch_set":16,"id":"78d47641_8e007c0c","line":6155,"range":{"start_line":6155,"start_character":20,"end_line":6155,"end_character":23},"updated":"2020-12-17 11:22:22.000000000","message":"OVS","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":6152,"context_line":"        self.compute2_service_id \u003d self.admin_api.get_services("},{"line_number":6153,"context_line":"            host\u003d\u0027host2\u0027, binary\u003d\u0027nova-compute\u0027)[0][\u0027id\u0027]"},{"line_number":6154,"context_line":""},{"line_number":6155,"context_line":"        # attach an ovs port with resource request"},{"line_number":6156,"context_line":"        ovs_port \u003d self.neutron.port_with_resource_request"},{"line_number":6157,"context_line":"        post \u003d {"},{"line_number":6158,"context_line":"            \u0027interfaceAttachment\u0027: {"}],"source_content_type":"text/x-python","patch_set":16,"id":"3d1cad30_aa38a048","line":6155,"range":{"start_line":6155,"start_character":20,"end_line":6155,"end_character":23},"in_reply_to":"78d47641_8e007c0c","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":6197,"context_line":"            \u0027/allocations/%s\u0027 % server[\u0027id\u0027]).body[\u0027allocations\u0027]"},{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"        # We expect one set of allocations for the compute resources on the"},{"line_number":6200,"context_line":"        # compute rp and one set for the networking resources on the ovs bridge"},{"line_number":6201,"context_line":"        # rp and on the SRIOV PF rp."},{"line_number":6202,"context_line":"        self.assertEqual(3, len(allocations))"},{"line_number":6203,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"758195a8_5a689dc8","line":6200,"range":{"start_line":6200,"start_character":29,"end_line":6200,"end_character":32},"updated":"2020-12-17 11:22:22.000000000","message":"set each","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":6197,"context_line":"            \u0027/allocations/%s\u0027 % server[\u0027id\u0027]).body[\u0027allocations\u0027]"},{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"        # We expect one set of allocations for the compute resources on the"},{"line_number":6200,"context_line":"        # compute rp and one set for the networking resources on the ovs bridge"},{"line_number":6201,"context_line":"        # rp and on the SRIOV PF rp."},{"line_number":6202,"context_line":"        self.assertEqual(3, len(allocations))"},{"line_number":6203,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"f466d9d1_5a7d5020","line":6200,"range":{"start_line":6200,"start_character":29,"end_line":6200,"end_character":32},"in_reply_to":"758195a8_5a689dc8","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"        # We expect one set of allocations for the compute resources on the"},{"line_number":6200,"context_line":"        # compute rp and one set for the networking resources on the ovs bridge"},{"line_number":6201,"context_line":"        # rp and on the SRIOV PF rp."},{"line_number":6202,"context_line":"        self.assertEqual(3, len(allocations))"},{"line_number":6203,"context_line":""},{"line_number":6204,"context_line":"        self.assertComputeAllocationMatchesFlavor("}],"source_content_type":"text/x-python","patch_set":16,"id":"0b0d2612_9e67d364","line":6201,"range":{"start_line":6201,"start_character":33,"end_line":6201,"end_character":36},"updated":"2020-12-17 11:22:22.000000000","message":"RP, respectively.\n\n(I assume you\u0027re saying one allocation set for compute node, one for OVS and one for SR-IOV)","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":6198,"context_line":""},{"line_number":6199,"context_line":"        # We expect one set of allocations for the compute resources on the"},{"line_number":6200,"context_line":"        # compute rp and one set for the networking resources on the ovs bridge"},{"line_number":6201,"context_line":"        # rp and on the SRIOV PF rp."},{"line_number":6202,"context_line":"        self.assertEqual(3, len(allocations))"},{"line_number":6203,"context_line":""},{"line_number":6204,"context_line":"        self.assertComputeAllocationMatchesFlavor("}],"source_content_type":"text/x-python","patch_set":16,"id":"1e989baa_4c112125","line":6201,"range":{"start_line":6201,"start_character":33,"end_line":6201,"end_character":36},"in_reply_to":"0b0d2612_9e67d364","updated":"2021-01-07 12:47:18.000000000","message":"yes, Done.","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":5919,"context_line":"                    \u0027port_id\u0027: self.neutron.port_with_resource_request[\u0027id\u0027]"},{"line_number":5920,"context_line":"                }}"},{"line_number":5921,"context_line":"            ex \u003d self.assertRaises(client.OpenStackApiException,"},{"line_number":5922,"context_line":"                               self.api.attach_interface,"},{"line_number":5923,"context_line":"                               server[\u0027id\u0027], post)"},{"line_number":5924,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":5925,"context_line":"        self.assertIn(\u0027Attaching interfaces with QoS policy is \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"3e088ae8_36a0d5fc","line":5922,"range":{"start_line":5922,"start_character":30,"end_line":5922,"end_character":31},"updated":"2021-01-11 12:04:08.000000000","message":"style nit: missing indentation (or too much, depending on your perspective)","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":5919,"context_line":"                    \u0027port_id\u0027: self.neutron.port_with_resource_request[\u0027id\u0027]"},{"line_number":5920,"context_line":"                }}"},{"line_number":5921,"context_line":"            ex \u003d self.assertRaises(client.OpenStackApiException,"},{"line_number":5922,"context_line":"                               self.api.attach_interface,"},{"line_number":5923,"context_line":"                               server[\u0027id\u0027], post)"},{"line_number":5924,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":5925,"context_line":"        self.assertIn(\u0027Attaching interfaces with QoS policy is \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"dc49ad9d_09c6160c","line":5922,"range":{"start_line":5922,"start_character":30,"end_line":5922,"end_character":31},"in_reply_to":"3e088ae8_36a0d5fc","updated":"2021-01-11 13:47:38.000000000","message":"something is broken in my IDE... :/","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":6283,"context_line":"            server[\u0027id\u0027], post)"},{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":6286,"context_line":"        self.assertIn(\u0027Failed to claim PCI device\u0027, str(ex))"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6289,"context_line":"        port \u003d self.neutron.port_with_resource_request"}],"source_content_type":"text/x-python","patch_set":21,"id":"6fa4522c_3d6970e3","line":6286,"updated":"2021-02-09 14:53:24.000000000","message":"you should test the allocations to see we reverted.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":false,"context_lines":[{"line_number":6283,"context_line":"            server[\u0027id\u0027], post)"},{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":6286,"context_line":"        self.assertIn(\u0027Failed to claim PCI device\u0027, str(ex))"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6289,"context_line":"        port \u003d self.neutron.port_with_resource_request"}],"source_content_type":"text/x-python","patch_set":21,"id":"db85fa7d_ca3c713f","line":6286,"in_reply_to":"6fa4522c_3d6970e3","updated":"2021-02-11 15:46:31.000000000","message":"Done","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"b7b9cfa9c347fed57ecbaa2ebce18f92338c6038","unresolved":true,"context_lines":[{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":6286,"context_line":"        self.assertIn(\u0027Failed to claim PCI device\u0027, str(ex))"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6289,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":6290,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"0b62a398_5c987e6d","line":6287,"updated":"2021-02-09 14:53:24.000000000","message":"should we also test PCI claiming failure with a race on allocations removal ?","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5fa352debda07904a1b821dce0611bb34bb87b33","unresolved":true,"context_lines":[{"line_number":6284,"context_line":""},{"line_number":6285,"context_line":"        self.assertEqual(400, ex.response.status_code)"},{"line_number":6286,"context_line":"        self.assertIn(\u0027Failed to claim PCI device\u0027, str(ex))"},{"line_number":6287,"context_line":""},{"line_number":6288,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6289,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":6290,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"f050199b_e757b9bd","line":6287,"in_reply_to":"0b62a398_5c987e6d","updated":"2021-02-11 15:46:31.000000000","message":"To test that I would first need to inject configuration failure to trigger an error in update_pci_request_spec_with_allocated_interface_name. Then to test a conflict during cleanup I would need a parallel process to generate a conflict in placement or I have to mock the placement fixture to lie a conflict. It is pretty complicated but now I added two new functional tests.\n1) test_interface_attach_sriov_with_qos_pci_update_fails here the cleanup is triggered but succeeds\n2) test_interface_attach_sriov_with_qos_pci_update_fails_cleanup_fails here the cleanup is triggered and fails with conflict even after retires.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":6432,"context_line":"                self.compute1_rp_uuid][self.PF2]][\u0027resources\u0027]"},{"line_number":6433,"context_line":""},{"line_number":6434,"context_line":"        # this is the leaked allocation in placement"},{"line_number":6435,"context_line":"        self.assertPortMatchesAllocation(sriov_port, sriov_allocations)"},{"line_number":6436,"context_line":""},{"line_number":6437,"context_line":"        # We expect that the port binding is not updated with any RP uuid as"},{"line_number":6438,"context_line":"        # the attach failed."}],"source_content_type":"text/x-python","patch_set":22,"id":"0eeeed63_a964ac7d","line":6435,"updated":"2021-02-22 14:39:56.000000000","message":"see, that\u0027s why I think we should notice the operator by writing some ERROR log they could parse.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":true,"context_lines":[{"line_number":6432,"context_line":"                self.compute1_rp_uuid][self.PF2]][\u0027resources\u0027]"},{"line_number":6433,"context_line":""},{"line_number":6434,"context_line":"        # this is the leaked allocation in placement"},{"line_number":6435,"context_line":"        self.assertPortMatchesAllocation(sriov_port, sriov_allocations)"},{"line_number":6436,"context_line":""},{"line_number":6437,"context_line":"        # We expect that the port binding is not updated with any RP uuid as"},{"line_number":6438,"context_line":"        # the attach failed."}],"source_content_type":"text/x-python","patch_set":22,"id":"d11ad41f_3e5ccb9c","line":6435,"in_reply_to":"0eeeed63_a964ac7d","updated":"2021-02-23 14:05:31.000000000","message":"The code logs the problem already in the following format:\n\nFailed to update allocations for consumer 829453f5-a63e-41b1-b7e9-98dfb74b9bfd. Error: Cannot remove resources {\u0027f92f1b6f-da29-4eba-9046-663e2d6ba2bb\u0027: {\u0027resources\u0027: {\u0027NET_BW_EGR_KILOBIT_PER_SEC\u0027: 10000, \u0027NET_BW_IGR_KILOBIT_PER_SEC\u0027: 10000}}} from the allocation due to multiple successive generation conflicts in placement.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f6179ab9f81c9dbae0e60466ada633a1704a861d","unresolved":true,"context_lines":[{"line_number":6438,"context_line":"        # the attach failed."},{"line_number":6439,"context_line":"        sriov_binding \u003d sriov_port[\u0027binding:profile\u0027]"},{"line_number":6440,"context_line":"        self.assertNotIn(\u0027allocation\u0027, sriov_binding)"},{"line_number":6441,"context_line":""},{"line_number":6442,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6443,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":6444,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"8c57fa66_cb99d163","line":6441,"updated":"2021-02-22 14:39:56.000000000","message":"thanks for writing those tests, this helps me.","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c446916def6e7b37b0379bc6ca1169bc1f1e0872","unresolved":false,"context_lines":[{"line_number":6438,"context_line":"        # the attach failed."},{"line_number":6439,"context_line":"        sriov_binding \u003d sriov_port[\u0027binding:profile\u0027]"},{"line_number":6440,"context_line":"        self.assertNotIn(\u0027allocation\u0027, sriov_binding)"},{"line_number":6441,"context_line":""},{"line_number":6442,"context_line":"    def test_interface_detach_with_port_with_bandwidth_request(self):"},{"line_number":6443,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":6444,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"d8efa012_cb0745de","line":6441,"in_reply_to":"8c57fa66_cb99d163","updated":"2021-02-23 14:05:31.000000000","message":"Ack","commit_id":"5af28c4de5eeace702cb76aa8540533ef77b9016"}],"nova/tests/unit/compute/test_api.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":7131,"context_line":"        service.version \u003d 54"},{"line_number":7132,"context_line":"        mock_get_service.return_value \u003d service"},{"line_number":7133,"context_line":"        with mock.patch.object("},{"line_number":7134,"context_line":"                self.compute_api.network_api, \u0027show_port\u0027,"},{"line_number":7135,"context_line":"                return_value\u003d{\u0027port\u0027: {"},{"line_number":7136,"context_line":"                    constants.RESOURCE_REQUEST: {"},{"line_number":7137,"context_line":"                        \u0027resources\u0027: {\u0027CUSTOM_RESOURCE_CLASS\u0027: 42}"}],"source_content_type":"text/x-python","patch_set":16,"id":"d8eb2496_ab5ebd07","line":7134,"range":{"start_line":7134,"start_character":12,"end_line":7134,"end_character":16},"updated":"2020-12-17 11:22:22.000000000","message":"nit","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":7131,"context_line":"        service.version \u003d 54"},{"line_number":7132,"context_line":"        mock_get_service.return_value \u003d service"},{"line_number":7133,"context_line":"        with mock.patch.object("},{"line_number":7134,"context_line":"                self.compute_api.network_api, \u0027show_port\u0027,"},{"line_number":7135,"context_line":"                return_value\u003d{\u0027port\u0027: {"},{"line_number":7136,"context_line":"                    constants.RESOURCE_REQUEST: {"},{"line_number":7137,"context_line":"                        \u0027resources\u0027: {\u0027CUSTOM_RESOURCE_CLASS\u0027: 42}"}],"source_content_type":"text/x-python","patch_set":16,"id":"44e5827e_6fe435bc","line":7134,"range":{"start_line":7134,"start_character":12,"end_line":7134,"end_character":16},"in_reply_to":"d8eb2496_ab5ebd07","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":7135,"context_line":"                return_value\u003d{\u0027port\u0027: {"},{"line_number":7136,"context_line":"                    constants.RESOURCE_REQUEST: {"},{"line_number":7137,"context_line":"                        \u0027resources\u0027: {\u0027CUSTOM_RESOURCE_CLASS\u0027: 42}"},{"line_number":7138,"context_line":"                }}}) as mock_show_port:"},{"line_number":7139,"context_line":"            self.compute_api.attach_interface("},{"line_number":7140,"context_line":"                self.context, instance, mock.sentinel.net_id,"},{"line_number":7141,"context_line":"                mock.sentinel.port_id, mock.sentinel.ip, mock.sentinel.tag)"}],"source_content_type":"text/x-python","patch_set":16,"id":"951f1098_8ad1832c","line":7138,"range":{"start_line":7138,"start_character":18,"end_line":7138,"end_character":39},"updated":"2020-12-17 11:22:22.000000000","message":"nit:\n\n      }\n  ) as mock_show_port:","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":7135,"context_line":"                return_value\u003d{\u0027port\u0027: {"},{"line_number":7136,"context_line":"                    constants.RESOURCE_REQUEST: {"},{"line_number":7137,"context_line":"                        \u0027resources\u0027: {\u0027CUSTOM_RESOURCE_CLASS\u0027: 42}"},{"line_number":7138,"context_line":"                }}}) as mock_show_port:"},{"line_number":7139,"context_line":"            self.compute_api.attach_interface("},{"line_number":7140,"context_line":"                self.context, instance, mock.sentinel.net_id,"},{"line_number":7141,"context_line":"                mock.sentinel.port_id, mock.sentinel.ip, mock.sentinel.tag)"}],"source_content_type":"text/x-python","patch_set":16,"id":"03f824a0_8a753ec5","line":7138,"range":{"start_line":7138,"start_character":18,"end_line":7138,"end_character":39},"in_reply_to":"951f1098_8ad1832c","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"81aed102a7833f79966ef6001254a6b900063cdf","unresolved":true,"context_lines":[{"line_number":7097,"context_line":"    @mock.patch(\u0027nova.objects.service.Service.get_by_host_and_binary\u0027)"},{"line_number":7098,"context_line":"    @mock.patch(\u0027nova.compute.api.API._record_action_start\u0027)"},{"line_number":7099,"context_line":"    def test_attach_interface_qos_aware_port_old_compute("},{"line_number":7100,"context_line":"        self, mock_record, mock_get_service):"},{"line_number":7101,"context_line":""},{"line_number":7102,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":7103,"context_line":"        service \u003d objects.Service()"}],"source_content_type":"text/x-python","patch_set":19,"id":"51d30bf0_c6e78b4e","line":7100,"range":{"start_line":7100,"start_character":43,"end_line":7100,"end_character":45},"updated":"2021-01-11 12:04:08.000000000","message":"style nit: next line","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9fbf8a29fb00448708b8a58de56dbd42431d6772","unresolved":false,"context_lines":[{"line_number":7097,"context_line":"    @mock.patch(\u0027nova.objects.service.Service.get_by_host_and_binary\u0027)"},{"line_number":7098,"context_line":"    @mock.patch(\u0027nova.compute.api.API._record_action_start\u0027)"},{"line_number":7099,"context_line":"    def test_attach_interface_qos_aware_port_old_compute("},{"line_number":7100,"context_line":"        self, mock_record, mock_get_service):"},{"line_number":7101,"context_line":""},{"line_number":7102,"context_line":"        instance \u003d self._create_instance_obj()"},{"line_number":7103,"context_line":"        service \u003d objects.Service()"}],"source_content_type":"text/x-python","patch_set":19,"id":"6dc25cbc_e4afb91e","line":7100,"range":{"start_line":7100,"start_character":43,"end_line":7100,"end_character":45},"in_reply_to":"51d30bf0_c6e78b4e","updated":"2021-01-11 13:47:38.000000000","message":"Done","commit_id":"b7b5d12d020811df37f4c1ae48d0f8f6d08b939a"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":10212,"context_line":"                \"_claim_pci_device_for_interface_attach\","},{"line_number":10213,"context_line":"                return_value\u003dNone)"},{"line_number":10214,"context_line":"        ) as (cap, mock_lock, mock_create_resource_req, mock_claim_pci):"},{"line_number":10215,"context_line":"            mock_create_resource_req.return_value \u003d None, []"},{"line_number":10216,"context_line":"            vif \u003d self.compute.attach_interface(self.context,"},{"line_number":10217,"context_line":"                                                instance,"},{"line_number":10218,"context_line":"                                                network_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"0a9da8eb_ec5e9101","line":10215,"range":{"start_line":10215,"start_character":52,"end_line":10215,"end_character":60},"updated":"2020-12-17 11:22:22.000000000","message":"nit: this is an example where brackets would it clearer that this is a tuple, IMO","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":10212,"context_line":"                \"_claim_pci_device_for_interface_attach\","},{"line_number":10213,"context_line":"                return_value\u003dNone)"},{"line_number":10214,"context_line":"        ) as (cap, mock_lock, mock_create_resource_req, mock_claim_pci):"},{"line_number":10215,"context_line":"            mock_create_resource_req.return_value \u003d None, []"},{"line_number":10216,"context_line":"            vif \u003d self.compute.attach_interface(self.context,"},{"line_number":10217,"context_line":"                                                instance,"},{"line_number":10218,"context_line":"                                                network_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"dc9bf09f_31b39d7e","line":10215,"range":{"start_line":10215,"start_character":52,"end_line":10215,"end_character":60},"in_reply_to":"0a9da8eb_ec5e9101","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":10270,"context_line":"                self.compute, \u0027_allocate_port_resource_for_instance\u0027),"},{"line_number":10271,"context_line":"        ) as (cap, mock_lock, mock_create_resource_req, mock_claim_pci,"},{"line_number":10272,"context_line":"              mock_allocate_res"},{"line_number":10273,"context_line":"        ):"},{"line_number":10274,"context_line":"            request_groups \u003d [objects.RequestGroup]"},{"line_number":10275,"context_line":"            mock_create_resource_req.return_value \u003d None, request_groups"},{"line_number":10276,"context_line":"            mock_allocate_res.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"9dbe017e_ef625272","line":10273,"updated":"2020-12-17 11:22:22.000000000","message":"not that it matters, but any reason to do this inline vs decorators, given you already have one of the latter?","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":false,"context_lines":[{"line_number":10270,"context_line":"                self.compute, \u0027_allocate_port_resource_for_instance\u0027),"},{"line_number":10271,"context_line":"        ) as (cap, mock_lock, mock_create_resource_req, mock_claim_pci,"},{"line_number":10272,"context_line":"              mock_allocate_res"},{"line_number":10273,"context_line":"        ):"},{"line_number":10274,"context_line":"            request_groups \u003d [objects.RequestGroup]"},{"line_number":10275,"context_line":"            mock_create_resource_req.return_value \u003d None, request_groups"},{"line_number":10276,"context_line":"            mock_allocate_res.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"3c814a62_061a0718","line":10273,"in_reply_to":"58a9fd9e_0cb12c57","updated":"2021-01-07 15:22:00.000000000","message":"Ack","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":true,"context_lines":[{"line_number":10270,"context_line":"                self.compute, \u0027_allocate_port_resource_for_instance\u0027),"},{"line_number":10271,"context_line":"        ) as (cap, mock_lock, mock_create_resource_req, mock_claim_pci,"},{"line_number":10272,"context_line":"              mock_allocate_res"},{"line_number":10273,"context_line":"        ):"},{"line_number":10274,"context_line":"            request_groups \u003d [objects.RequestGroup]"},{"line_number":10275,"context_line":"            mock_create_resource_req.return_value \u003d None, request_groups"},{"line_number":10276,"context_line":"            mock_allocate_res.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"58a9fd9e_0cb12c57","line":10273,"in_reply_to":"9dbe017e_ef625272","updated":"2021-01-07 12:47:18.000000000","message":"it is copy pasted above. I think I keep it as is.","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":10279,"context_line":"                                                instance,"},{"line_number":10280,"context_line":"                                                network_id,"},{"line_number":10281,"context_line":"                                                port_id,"},{"line_number":10282,"context_line":"                                                req_ip, None)"},{"line_number":10283,"context_line":"        self.assertEqual(vif[\u0027id\u0027], port_id)"},{"line_number":10284,"context_line":"        mock_allocate.assert_called_once_with("},{"line_number":10285,"context_line":"            self.context, instance,"}],"source_content_type":"text/x-python","patch_set":16,"id":"2f765f83_49cbb0bc","line":10282,"updated":"2020-12-17 11:22:22.000000000","message":"nit: newline under this would help, IMO","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":10279,"context_line":"                                                instance,"},{"line_number":10280,"context_line":"                                                network_id,"},{"line_number":10281,"context_line":"                                                port_id,"},{"line_number":10282,"context_line":"                                                req_ip, None)"},{"line_number":10283,"context_line":"        self.assertEqual(vif[\u0027id\u0027], port_id)"},{"line_number":10284,"context_line":"        mock_allocate.assert_called_once_with("},{"line_number":10285,"context_line":"            self.context, instance,"}],"source_content_type":"text/x-python","patch_set":16,"id":"e18f48d9_27487a80","line":10282,"in_reply_to":"2f765f83_49cbb0bc","updated":"2021-01-07 12:47:18.000000000","message":"Done","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":10308,"context_line":"        self.assertEqual([], pci_reqs.requests)"},{"line_number":10309,"context_line":""},{"line_number":10310,"context_line":"        mock_allocate_res.assert_called_once_with("},{"line_number":10311,"context_line":"            self.context, instance, pci_reqs, request_groups)"},{"line_number":10312,"context_line":""},{"line_number":10313,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10314,"context_line":"    def test_attach_sriov_interface(self, mock_notify):"}],"source_content_type":"text/x-python","patch_set":16,"id":"aa457e30_47feda7e","line":10311,"updated":"2020-12-17 11:22:22.000000000","message":"This test is very dense and tough to parse. I don\u0027t have any clever ideas on how to break it up, but perhaps a few comments stating why you\u0027re asserting what you are would be good?","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":false,"context_lines":[{"line_number":10308,"context_line":"        self.assertEqual([], pci_reqs.requests)"},{"line_number":10309,"context_line":""},{"line_number":10310,"context_line":"        mock_allocate_res.assert_called_once_with("},{"line_number":10311,"context_line":"            self.context, instance, pci_reqs, request_groups)"},{"line_number":10312,"context_line":""},{"line_number":10313,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10314,"context_line":"    def test_attach_sriov_interface(self, mock_notify):"}],"source_content_type":"text/x-python","patch_set":16,"id":"780fc3e4_2b7b7020","line":10311,"in_reply_to":"32fbdd2a_4a6bc99a","updated":"2021-01-07 15:22:00.000000000","message":"Yes, the comments make this easier to grok. Thanks!","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":true,"context_lines":[{"line_number":10308,"context_line":"        self.assertEqual([], pci_reqs.requests)"},{"line_number":10309,"context_line":""},{"line_number":10310,"context_line":"        mock_allocate_res.assert_called_once_with("},{"line_number":10311,"context_line":"            self.context, instance, pci_reqs, request_groups)"},{"line_number":10312,"context_line":""},{"line_number":10313,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10314,"context_line":"    def test_attach_sriov_interface(self, mock_notify):"}],"source_content_type":"text/x-python","patch_set":16,"id":"32fbdd2a_4a6bc99a","line":10311,"in_reply_to":"aa457e30_47feda7e","updated":"2021-01-07 12:47:18.000000000","message":"I tried to improve it. Let me know how it looks now","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"92f16d1096e769c73d7a85b2741a3c64ad635960","unresolved":true,"context_lines":[{"line_number":10420,"context_line":"                                    pci_requests\u003dNone, affinity_policy\u003dNone):"},{"line_number":10421,"context_line":"                # Simulate that the requested port is an SRIOV port"},{"line_number":10422,"context_line":"                pci_requests.requests.append(pci_req)"},{"line_number":10423,"context_line":"                # without resource request"},{"line_number":10424,"context_line":"                return None, request_groups"},{"line_number":10425,"context_line":""},{"line_number":10426,"context_line":"            mock_create_resource_req.side_effect \u003d create_resource_req"},{"line_number":10427,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"08d17d06_fb27919c","line":10424,"range":{"start_line":10423,"start_character":0,"end_line":10424,"end_character":43},"updated":"2020-12-17 11:22:22.000000000","message":"Is this realistic. Neutron *has* to return a resource request for QoS, right?","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23e9538935f0e09e254c9e50fd5d8af376cfe4ee","unresolved":false,"context_lines":[{"line_number":10420,"context_line":"                                    pci_requests\u003dNone, affinity_policy\u003dNone):"},{"line_number":10421,"context_line":"                # Simulate that the requested port is an SRIOV port"},{"line_number":10422,"context_line":"                pci_requests.requests.append(pci_req)"},{"line_number":10423,"context_line":"                # without resource request"},{"line_number":10424,"context_line":"                return None, request_groups"},{"line_number":10425,"context_line":""},{"line_number":10426,"context_line":"            mock_create_resource_req.side_effect \u003d create_resource_req"},{"line_number":10427,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"2cdc459d_1e678447","line":10424,"range":{"start_line":10423,"start_character":0,"end_line":10424,"end_character":43},"in_reply_to":"08d17d06_fb27919c","updated":"2021-01-07 12:47:18.000000000","message":"The comment is a bad copy paste. It stub clearly returns a resource request :) Done.","commit_id":"a91ae6e6cca439db4027382046b8f1b7e127f7ef"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2e2cbcd6c79bc9fa2cf4878d877b1be99a383342","unresolved":true,"context_lines":[{"line_number":10187,"context_line":"        return nwinfo, port_id"},{"line_number":10188,"context_line":""},{"line_number":10189,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10190,"context_line":"    def test_attach_interface_with_qos(self, mock_notify):"},{"line_number":10191,"context_line":"        instance \u003d self._create_fake_instance_obj()"},{"line_number":10192,"context_line":"        nwinfo \u003d [fake_network_cache_model.new_vif()]"},{"line_number":10193,"context_line":"        network_id \u003d nwinfo[0][\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"d1951c21_28169fe6","line":10190,"range":{"start_line":10190,"start_character":8,"end_line":10190,"end_character":38},"updated":"2021-01-22 18:16:09.000000000","message":"i may have missed it but can you add a similar test for detach.\n\nso create a vm, attach the interface with qos, then detach it and asset the allocatoin are the same as before the attach.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3165a6c4a1c7e96ef7c925cefc5c05d707c88ba7","unresolved":false,"context_lines":[{"line_number":10187,"context_line":"        return nwinfo, port_id"},{"line_number":10188,"context_line":""},{"line_number":10189,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10190,"context_line":"    def test_attach_interface_with_qos(self, mock_notify):"},{"line_number":10191,"context_line":"        instance \u003d self._create_fake_instance_obj()"},{"line_number":10192,"context_line":"        nwinfo \u003d [fake_network_cache_model.new_vif()]"},{"line_number":10193,"context_line":"        network_id \u003d nwinfo[0][\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"86f8abb1_44a2a5d8","line":10190,"range":{"start_line":10190,"start_character":8,"end_line":10190,"end_character":38},"in_reply_to":"151a461b_ee50fc21","updated":"2021-01-26 13:26:11.000000000","message":"ah nice in that case +1 this was the only thing that i though was missing.","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"39d7fd519f415bce4de19bc4f1bf26d523c65753","unresolved":false,"context_lines":[{"line_number":10187,"context_line":"        return nwinfo, port_id"},{"line_number":10188,"context_line":""},{"line_number":10189,"context_line":"    @mock.patch.object(compute_utils, \u0027notify_about_instance_action\u0027)"},{"line_number":10190,"context_line":"    def test_attach_interface_with_qos(self, mock_notify):"},{"line_number":10191,"context_line":"        instance \u003d self._create_fake_instance_obj()"},{"line_number":10192,"context_line":"        nwinfo \u003d [fake_network_cache_model.new_vif()]"},{"line_number":10193,"context_line":"        network_id \u003d nwinfo[0][\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":21,"id":"151a461b_ee50fc21","line":10190,"range":{"start_line":10190,"start_character":8,"end_line":10190,"end_character":38},"in_reply_to":"d1951c21_28169fe6","updated":"2021-01-26 12:55:42.000000000","message":"The detach support was added couple of cycles ago. At that time a functional test coverage was added in [1] and the detach unit test is extended here [2]. So I think we are well covered.\n\n[1] https://github.com/openstack/nova/blob/941f4624638090b27e9e18601cde0529fcdbd22f/nova/tests/functional/test_servers.py#L6134\n[2] https://github.com/openstack/nova/blob/941f4624638090b27e9e18601cde0529fcdbd22f/nova/tests/unit/compute/test_compute.py#L10517","commit_id":"e8ecac947e5f6a38d1114ba5bfa1e6558bfdb806"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":false,"context_lines":[{"line_number":834,"context_line":"        actual \u003d utils.resources_from_flavor(instance, flavor)"},{"line_number":835,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def test_resource_request_init(self):"},{"line_number":838,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":839,"context_line":"            vcpus\u003d1, memory_mb\u003d1024, root_gb\u003d10, ephemeral_gb\u003d5, swap\u003d0)"},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"8136c559_53c488b5","line":837,"range":{"start_line":837,"start_character":30,"end_line":837,"end_character":34},"updated":"2021-01-07 15:22:00.000000000","message":"Whoops, we should have renamed these. Will comment on the the previous change","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":834,"context_line":"        actual \u003d utils.resources_from_flavor(instance, flavor)"},{"line_number":835,"context_line":"        self.assertEqual(expected, actual)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def test_resource_request_init(self):"},{"line_number":838,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":839,"context_line":"            vcpus\u003d1, memory_mb\u003d1024, root_gb\u003d10, ephemeral_gb\u003d5, swap\u003d0)"},{"line_number":840,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"ec2cc740_9ff49798","line":837,"range":{"start_line":837,"start_character":30,"end_line":837,"end_character":34},"in_reply_to":"8136c559_53c488b5","updated":"2021-01-08 16:02:05.000000000","message":"Done in the previous change","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":1940,"context_line":"        self.assertIn(\u0027group_policy\u003dnone\u0027, rr.to_querystring())"},{"line_number":1941,"context_line":""},{"line_number":1942,"context_line":""},{"line_number":1943,"context_line":"class TestResourceRequestFromRequestGroup(test.NoDBTestCase):"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def test_to_queryparams(self):"},{"line_number":1946,"context_line":"        mock_rg \u003d mock.Mock()"},{"line_number":1947,"context_line":"        mock_rg.is_empty.return_value \u003d False"},{"line_number":1948,"context_line":"        mock_rg.to_queryparams.return_value \u003d [(\u0027a\u0027, \u0027b\u0027), (\u0027c\u0027, \u0027d\u0027)]"},{"line_number":1949,"context_line":"        rr \u003d utils.ResourceRequest.from_request_group(mock_rg)"},{"line_number":1950,"context_line":"        self.assertEqual(\u0027a\u003db\u0026c\u003dd\u0026limit\u003d1000\u0027, rr.to_querystring())"},{"line_number":1951,"context_line":""},{"line_number":1952,"context_line":"        mock_rg.to_queryparams.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":18,"id":"2eafa8f7_0f352903","line":1952,"range":{"start_line":1943,"start_character":0,"end_line":1952,"end_character":56},"updated":"2021-01-07 15:22:00.000000000","message":"Is there really a good reason for this to be separate now? Could we merge this into the above under \u0027test_resource_request_init_*\u0027 (which should also be renamed, but before this). It might make more sense to add a test that calls the factory method with a real \u0027RequestSpec\u0027 since we want to make sure that it can, in fact, handle parsing such an object. \u0027test_from_request_group\u0027 would do quite nicely.","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":1940,"context_line":"        self.assertIn(\u0027group_policy\u003dnone\u0027, rr.to_querystring())"},{"line_number":1941,"context_line":""},{"line_number":1942,"context_line":""},{"line_number":1943,"context_line":"class TestResourceRequestFromRequestGroup(test.NoDBTestCase):"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def test_to_queryparams(self):"},{"line_number":1946,"context_line":"        mock_rg \u003d mock.Mock()"},{"line_number":1947,"context_line":"        mock_rg.is_empty.return_value \u003d False"},{"line_number":1948,"context_line":"        mock_rg.to_queryparams.return_value \u003d [(\u0027a\u0027, \u0027b\u0027), (\u0027c\u0027, \u0027d\u0027)]"},{"line_number":1949,"context_line":"        rr \u003d utils.ResourceRequest.from_request_group(mock_rg)"},{"line_number":1950,"context_line":"        self.assertEqual(\u0027a\u003db\u0026c\u003dd\u0026limit\u003d1000\u0027, rr.to_querystring())"},{"line_number":1951,"context_line":""},{"line_number":1952,"context_line":"        mock_rg.to_queryparams.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":18,"id":"cc249ceb_d60fff20","line":1952,"range":{"start_line":1943,"start_character":0,"end_line":1952,"end_character":56},"in_reply_to":"2eafa8f7_0f352903","updated":"2021-01-08 16:02:05.000000000","message":"Done","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"}],"releasenotes/notes/support-interface-attach-with-qos-port-22eb452202eb92fd.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"90a14ef9abcbc228686b2b15803053ab944eda92","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``POST /servers/{server_id}/os-interface`` API now support servers"},{"line_number":5,"context_line":"    with neutron ports having resource requests, e.g. ports that have QoS"},{"line_number":6,"context_line":"    minimum bandwidth rules attached."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"d464150d_e8da8eb2","line":5,"updated":"2021-01-07 15:22:00.000000000","message":"Or: \n\n  The ``POST /servers/{server_id}/os-interface`` API now supports\n  attaching neutron ports with QoS minimum bandwidth rules attached.\n\nThe concept of resource requests is pretty much an implementation detail, right?","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"642fda5199a5a8af93f002463c089c34e1bea83d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``POST /servers/{server_id}/os-interface`` API now support servers"},{"line_number":5,"context_line":"    with neutron ports having resource requests, e.g. ports that have QoS"},{"line_number":6,"context_line":"    minimum bandwidth rules attached."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"d42b7a69_ebf1280f","line":5,"in_reply_to":"d464150d_e8da8eb2","updated":"2021-01-08 16:02:05.000000000","message":"correct. Done,.","commit_id":"82463ccce81767acde5db4c010d6da25577c0357"}]}
