)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Transfer port.resource_request to the scheduler"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch collects the resource requests from each neutron port"},{"line_number":10,"context_line":"involved in a server create request. Converts the each request to"},{"line_number":11,"context_line":"a RequestGroup object and includes them into the RequestSpec."},{"line_number":12,"context_line":"This way the requests are reaching the scheduler and there"},{"line_number":13,"context_line":"they are included in the generation of the allocation_candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_0e1e2d0b","line":10,"range":{"start_line":10,"start_character":46,"end_line":10,"end_character":49},"updated":"2018-06-01 20:57:54.000000000","message":"strike","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Transfer port.resource_request to the scheduler"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch collects the resource requests from each neutron port"},{"line_number":10,"context_line":"involved in a server create request. Converts the each request to"},{"line_number":11,"context_line":"a RequestGroup object and includes them into the RequestSpec."},{"line_number":12,"context_line":"This way the requests are reaching the scheduler and there"},{"line_number":13,"context_line":"they are included in the generation of the allocation_candidates"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_436d9297","line":10,"range":{"start_line":10,"start_character":46,"end_line":10,"end_character":49},"in_reply_to":"5f7c97a3_0e1e2d0b","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch collects the resource requests from each neutron port"},{"line_number":10,"context_line":"involved in a server create request. Converts the each request to"},{"line_number":11,"context_line":"a RequestGroup object and includes them into the RequestSpec."},{"line_number":12,"context_line":"This way the requests are reaching the scheduler and there"},{"line_number":13,"context_line":"they are included in the generation of the allocation_candidates"},{"line_number":14,"context_line":"query."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_6ed48120","line":11,"range":{"start_line":11,"start_character":40,"end_line":11,"end_character":44},"updated":"2018-06-01 20:57:54.000000000","message":"in","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch collects the resource requests from each neutron port"},{"line_number":10,"context_line":"involved in a server create request. Converts the each request to"},{"line_number":11,"context_line":"a RequestGroup object and includes them into the RequestSpec."},{"line_number":12,"context_line":"This way the requests are reaching the scheduler and there"},{"line_number":13,"context_line":"they are included in the generation of the allocation_candidates"},{"line_number":14,"context_line":"query."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_03679ab9","line":11,"range":{"start_line":11,"start_character":40,"end_line":11,"end_character":44},"in_reply_to":"5f7c97a3_6ed48120","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch only handles the happy path of a server create request. But"},{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code pathes need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of a subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_4edd053f","line":18,"range":{"start_line":18,"start_character":13,"end_line":18,"end_character":19},"updated":"2018-06-01 20:57:54.000000000","message":"paths","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch only handles the happy path of a server create request. But"},{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code pathes need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of a subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_23f736d7","line":18,"range":{"start_line":18,"start_character":13,"end_line":18,"end_character":19},"in_reply_to":"5f7c97a3_4edd053f","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":16,"context_line":"This patch only handles the happy path of a server create request. But"},{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code pathes need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of a subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_cee835e0","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":28},"updated":"2018-06-01 20:57:54.000000000","message":"\"subsequent patches\" or \"a subsequent patch\"","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":16,"context_line":"This patch only handles the happy path of a server create request. But"},{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code pathes need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of a subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_43f272e5","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":28},"in_reply_to":"5f7c97a3_cee835e0","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b6072dc8ea73d3f6919fb53ad130c17fadbefbf2","unresolved":false,"context_lines":[{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code paths need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"3f79a3b5_6a95dc3d","line":20,"updated":"2018-12-17 15:49:47.000000000","message":"Based on our IRC conversation today, this change effectively \"turns on\" the new port resource request allocation claims code during server create, which is a bit backward from how we\u0027d normally do these kinds of features where we enable the lower level nova-compute code to deal with these types of servers/resources (like the port detach change later in the series, and move operations), and then the control plane stuff happens at the end. The alternative to that is we hold off on approving the bottom changes in the series until we happy up to a point with just merging a large chunk of this series together.\n\nIt could also be noted in the commit message that none of this works until the request request shows up in the port, which is controlled by policy (defaults to admin-only) which is in this change:\n\nhttps://review.openstack.org/#/c/590363/\n\nSo even if we merge all of the nova changes, they won\u0027t do anything until the neutron changes land and an operator configures the deployment for users to be able to create these kinds of QoS ports/networks.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"be6b2d6911d76d48ce6bd53d13ce8e03bb48888a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code paths need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"3f79a3b5_b320324c","line":20,"in_reply_to":"3f79a3b5_6a95dc3d","updated":"2018-12-18 15:58:13.000000000","message":"Bah, I missed the commit message update before pushing the whole serise. I will post a \"review guide\"(tm) for this series on the ML. Then I will fixup the commit message as well.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4820c3b5c391dc2a18e0b5246d8ae5077074cb60","unresolved":false,"context_lines":[{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code paths need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"3f79a3b5_64808f9e","line":20,"updated":"2018-12-18 21:22:09.000000000","message":"Relaying from PS36:\n\n\u003e It could also be noted in the commit message that none of this works until the request request shows up in the port, which is controlled by policy (defaults to admin-only) which is in this change:\nhttps://review.openstack.org/#/c/590363/","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b84f77afbdd8de73bcb53c3d50481d63f4507d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"it adds couple of TODOs to places where the server move operations"},{"line_number":18,"context_line":"related code paths need to be implemented. That implementation will be"},{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"blueprint bandwidth-resource-provider"},{"line_number":22,"context_line":"Change-Id: Ica6152ccb97dce805969d964d6ed032bfe22a33f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":39,"id":"3f79a3b5_a74d37c7","line":20,"in_reply_to":"3f79a3b5_64808f9e","updated":"2018-12-19 15:50:04.000000000","message":"Done","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Note that this patch technically makes it possible to boot server with"},{"line_number":22,"context_line":"one neutron port that has resource request. But it does not handle"},{"line_number":23,"context_line":"multiple such ports or SRIOV ports where two PFs are supporting the"},{"line_number":24,"context_line":"same physnet as well as many server lifecycle operations like resize,"},{"line_number":25,"context_line":"migrate, live-migrate, unshelve. To avoid possible resource allocation"},{"line_number":26,"context_line":"inconsistencies due to the partial support nova rejects any requests"},{"line_number":27,"context_line":"that involves such ports. See the previous patches in this patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"9fdfeff1_7a3ef68c","line":24,"range":{"start_line":22,"start_character":44,"end_line":24,"end_character":12},"updated":"2019-01-28 19:20:27.000000000","message":"Are there ways to test this by adding negative tests to assert they fail? Or is that pointless for now since it would be all based on stuff in our fixtures? In other words, I\u0027m not sure why creating a server with multiple ports with resource requests doesn\u0027t work - this doesn\u0027t explain it and we don\u0027t have any tests asserting it doesn\u0027t work. You don\u0027t necessarily have to change something in this patch, I\u0027m just wondering.","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4fda0c8447836211aac63050d48a8188ddc22952","unresolved":false,"context_lines":[{"line_number":19,"context_line":"part of subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Note that this patch technically makes it possible to boot server with"},{"line_number":22,"context_line":"one neutron port that has resource request. But it does not handle"},{"line_number":23,"context_line":"multiple such ports or SRIOV ports where two PFs are supporting the"},{"line_number":24,"context_line":"same physnet as well as many server lifecycle operations like resize,"},{"line_number":25,"context_line":"migrate, live-migrate, unshelve. To avoid possible resource allocation"},{"line_number":26,"context_line":"inconsistencies due to the partial support nova rejects any requests"},{"line_number":27,"context_line":"that involves such ports. See the previous patches in this patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":46,"id":"9fdfeff1_3b3fecb4","line":24,"range":{"start_line":22,"start_character":44,"end_line":24,"end_character":12},"in_reply_to":"9fdfeff1_7a3ef68c","updated":"2019-01-30 16:26:17.000000000","message":"There are functional tests later on in this series for these cases in those patches that fixes the given case. So in theory we can move those functional tests here and let them fail (e.g. assert the failure).","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4e462dccd5f8f05635e5540cf277aa46982a6760","unresolved":false,"context_lines":[{"line_number":3114,"context_line":"                context, instance.uuid)"},{"line_number":3115,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3116,"context_line":"            # therefore we don\u0027t have to re-calculat the resource requests"},{"line_number":3117,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3118,"context_line":""},{"line_number":3119,"context_line":"            # If a new image is provided on rebuild, we will need to run"},{"line_number":3120,"context_line":"            # through the scheduler again, but we want the instance to be"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_493d08b9","line":3117,"updated":"2018-06-01 13:20:48.000000000","message":"This should live in conductor manager and only in the case of recreate (evacuate). Rebuild (not evacuate) does not move the instance.","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9bfd0631a80c2ed88868fde41e06f1135ead6ca","unresolved":false,"context_lines":[{"line_number":3114,"context_line":"                context, instance.uuid)"},{"line_number":3115,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3116,"context_line":"            # therefore we don\u0027t have to re-calculat the resource requests"},{"line_number":3117,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3118,"context_line":""},{"line_number":3119,"context_line":"            # If a new image is provided on rebuild, we will need to run"},{"line_number":3120,"context_line":"            # through the scheduler again, but we want the instance to be"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_bf096edd","line":3117,"in_reply_to":"5f7c97a3_493d08b9","updated":"2018-06-01 15:22:44.000000000","message":"I moved the hack and the TODO","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4e462dccd5f8f05635e5540cf277aa46982a6760","unresolved":false,"context_lines":[{"line_number":3398,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3399,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3400,"context_line":"            # neutron ports."},{"line_number":3401,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3402,"context_line":""},{"line_number":3403,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3404,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_696d64ca","line":3401,"updated":"2018-06-01 13:20:48.000000000","message":"move this to the cold migrate conductor task","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9bfd0631a80c2ed88868fde41e06f1135ead6ca","unresolved":false,"context_lines":[{"line_number":3398,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3399,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3400,"context_line":"            # neutron ports."},{"line_number":3401,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3402,"context_line":""},{"line_number":3403,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3404,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_df18ea1e","line":3401,"in_reply_to":"5f7c97a3_696d64ca","updated":"2018-06-01 15:22:44.000000000","message":"Done","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2e6163ba053acad93b037daf811f2b90e708dd2b","unresolved":false,"context_lines":[{"line_number":4231,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":4232,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":4233,"context_line":"            # neutron ports."},{"line_number":4234,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":4235,"context_line":""},{"line_number":4236,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":4237,"context_line":"            # Some old instances can still have no RequestSpec object attached"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_092e308b","line":4234,"updated":"2018-06-01 13:18:50.000000000","message":"Any request spec tinkering should happen in the conductor - we already do some of that with the ensure_project_and_user calls and reset_request_destinations.","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9bfd0631a80c2ed88868fde41e06f1135ead6ca","unresolved":false,"context_lines":[{"line_number":4231,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":4232,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":4233,"context_line":"            # neutron ports."},{"line_number":4234,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":4235,"context_line":""},{"line_number":4236,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":4237,"context_line":"            # Some old instances can still have no RequestSpec object attached"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_44216fb3","line":4234,"in_reply_to":"5f7c97a3_092e308b","updated":"2018-06-01 15:22:44.000000000","message":"Thanks for the pointers. Moved the hack and the TODO to the LiveMigratonTask","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9bfd0631a80c2ed88868fde41e06f1135ead6ca","unresolved":false,"context_lines":[{"line_number":4389,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":4390,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":4391,"context_line":"            # neutron ports."},{"line_number":4392,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":4393,"context_line":"        except exception.RequestSpecNotFound:"},{"line_number":4394,"context_line":"            # Some old instances can still have no RequestSpec object attached"},{"line_number":4395,"context_line":"            # to them, we need to support the old way"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_5fda9a4a","line":4392,"updated":"2018-06-01 15:22:44.000000000","message":"Moved to the conductor manager","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        pci_request_info \u003d pci_request.get_pci_requests_from_flavor("},{"line_number":808,"context_line":"            instance_type)"},{"line_number":809,"context_line":"        # NOTE(gibi): It is a big hack that create_pci_requests_for_sriov_ports"},{"line_number":810,"context_line":"        # returns the resource requests for every ports"},{"line_number":811,"context_line":"        # TODO(gibi): make create_pci_requests_for_sriov_ports more generic"},{"line_number":812,"context_line":"        # to handle both the pci request and the resource request part"},{"line_number":813,"context_line":"        create_pci_reqs \u003d self.network_api.create_pci_requests_for_sriov_ports"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_8ec0fd51","line":810,"range":{"start_line":810,"start_character":50,"end_line":810,"end_character":55},"updated":"2018-06-01 20:57:54.000000000","message":"port","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        pci_request_info \u003d pci_request.get_pci_requests_from_flavor("},{"line_number":808,"context_line":"            instance_type)"},{"line_number":809,"context_line":"        # NOTE(gibi): It is a big hack that create_pci_requests_for_sriov_ports"},{"line_number":810,"context_line":"        # returns the resource requests for every ports"},{"line_number":811,"context_line":"        # TODO(gibi): make create_pci_requests_for_sriov_ports more generic"},{"line_number":812,"context_line":"        # to handle both the pci request and the resource request part"},{"line_number":813,"context_line":"        create_pci_reqs \u003d self.network_api.create_pci_requests_for_sriov_ports"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_e04db4c4","line":810,"range":{"start_line":810,"start_character":50,"end_line":810,"end_character":55},"in_reply_to":"5f7c97a3_8ec0fd51","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":853,"context_line":"        # return the validated options and maximum number of instances allowed"},{"line_number":854,"context_line":"        # by the network quotas"},{"line_number":855,"context_line":"        return (base_options, max_network_count, key_pair, security_groups,"},{"line_number":856,"context_line":"                network_metadata)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def _provision_instances(self, context, instance_type, min_count,"},{"line_number":859,"context_line":"            max_count, base_options, boot_meta, security_groups,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_bd51fc34","line":856,"range":{"start_line":856,"start_character":16,"end_line":856,"end_character":32},"updated":"2018-12-17 17:49:16.000000000","message":"When Stephen added network_metadata he added it to the tuple here, which prompted me to ask for a namedtuple since this list was getting long, so throwing port_resource_requests into base_options seems OK, except I think base_options was historically more about instance-specific fields.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":853,"context_line":"        # return the validated options and maximum number of instances allowed"},{"line_number":854,"context_line":"        # by the network quotas"},{"line_number":855,"context_line":"        return (base_options, max_network_count, key_pair, security_groups,"},{"line_number":856,"context_line":"                network_metadata)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def _provision_instances(self, context, instance_type, min_count,"},{"line_number":859,"context_line":"            max_count, base_options, boot_meta, security_groups,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_5cf9bc1a","line":856,"range":{"start_line":856,"start_character":16,"end_line":856,"end_character":32},"in_reply_to":"3f79a3b5_bd51fc34","updated":"2018-12-18 09:31:13.000000000","message":"port_resource_request is similar to pci_requests that is also added to base_options. Stephens patch with the numa policy was made in parallel with this this patch so it very likely I missed when network_metadata was born and appeared here after a rebase.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":882,"context_line":"                        instance_group, base_options[\u0027availability_zone\u0027],"},{"line_number":883,"context_line":"                        security_groups\u003dsecurity_groups,"},{"line_number":884,"context_line":"                        port_resource_requests\u003d"},{"line_number":885,"context_line":"                        base_options[\u0027port_resource_requests\u0027])"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"                if block_device_mapping:"},{"line_number":888,"context_line":"                    # Record whether or not we are a BFV instance"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_40f9df18","line":885,"range":{"start_line":885,"start_character":36,"end_line":885,"end_character":37},"updated":"2018-12-17 17:49:16.000000000","message":"see below, either pop this out or don\u0027t include it in base_options","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b924f83953f53554fb1d56bdbdee563614cfb91d","unresolved":false,"context_lines":[{"line_number":882,"context_line":"                        instance_group, base_options[\u0027availability_zone\u0027],"},{"line_number":883,"context_line":"                        security_groups\u003dsecurity_groups,"},{"line_number":884,"context_line":"                        port_resource_requests\u003d"},{"line_number":885,"context_line":"                        base_options[\u0027port_resource_requests\u0027])"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"                if block_device_mapping:"},{"line_number":888,"context_line":"                    # Record whether or not we are a BFV instance"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8dfcf90a","line":885,"range":{"start_line":885,"start_character":36,"end_line":885,"end_character":37},"in_reply_to":"3f79a3b5_40f9df18","updated":"2018-12-18 14:09:34.000000000","message":"see below.\nDone","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                # Create an instance object, but do not store in db yet."},{"line_number":907,"context_line":"                instance \u003d objects.Instance(context\u003dcontext)"},{"line_number":908,"context_line":"                instance.uuid \u003d instance_uuid"},{"line_number":909,"context_line":"                instance.update(base_options)"},{"line_number":910,"context_line":"                instance.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":911,"context_line":"                if key_pair:"},{"line_number":912,"context_line":"                    instance.keypairs.objects.append(key_pair)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_7df9241b","line":909,"range":{"start_line":909,"start_character":16,"end_line":909,"end_character":45},"updated":"2018-12-17 17:49:16.000000000","message":"This is where having port_resource_requests in base_options is bad, because you\u0027re setting it on the instance object here. So we should either:\n\n1. not put port_resource_requests in base_options as noted above, add it to the mega tuple of doom\n\n2. pop port_resource_requests out of base_options above when setting it on the RequestSpec","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                # Create an instance object, but do not store in db yet."},{"line_number":907,"context_line":"                instance \u003d objects.Instance(context\u003dcontext)"},{"line_number":908,"context_line":"                instance.uuid \u003d instance_uuid"},{"line_number":909,"context_line":"                instance.update(base_options)"},{"line_number":910,"context_line":"                instance.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":911,"context_line":"                if key_pair:"},{"line_number":912,"context_line":"                    instance.keypairs.objects.append(key_pair)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8f2dd892","line":909,"range":{"start_line":909,"start_character":16,"end_line":909,"end_character":45},"in_reply_to":"3f79a3b5_7df9241b","updated":"2018-12-18 09:31:13.000000000","message":"Good point. I don\u0027t want to store the port_resource_requests in the instance.\n\nThe network_metadata is object.NetworkMetadata I can add the port_resource_requests field there but the naming of that object makes this a bit award. Also network_metadata is directly stored in the RequesSpec (L904) while the port_resource_requests is a parameter to the factory method of the RequestSpec and transformed to RequestGroups during the RequestSpec creation. So even if it is tempting to use the NetworkMetadata in _validate_and_build_base_options() it would be akward to pop out of that at L878 to pass it to RequestSpec constructor. so I will go with option 2.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b924f83953f53554fb1d56bdbdee563614cfb91d","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                # Create an instance object, but do not store in db yet."},{"line_number":907,"context_line":"                instance \u003d objects.Instance(context\u003dcontext)"},{"line_number":908,"context_line":"                instance.uuid \u003d instance_uuid"},{"line_number":909,"context_line":"                instance.update(base_options)"},{"line_number":910,"context_line":"                instance.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":911,"context_line":"                if key_pair:"},{"line_number":912,"context_line":"                    instance.keypairs.objects.append(key_pair)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_0afbef16","line":909,"range":{"start_line":909,"start_character":16,"end_line":909,"end_character":45},"in_reply_to":"3f79a3b5_8f2dd892","updated":"2018-12-18 14:09:34.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77a9d3c5a0c251b36248d57efe82ea5a27b14a5f","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                # Create an instance object, but do not store in db yet."},{"line_number":907,"context_line":"                instance \u003d objects.Instance(context\u003dcontext)"},{"line_number":908,"context_line":"                instance.uuid \u003d instance_uuid"},{"line_number":909,"context_line":"                instance.update(base_options)"},{"line_number":910,"context_line":"                instance.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":911,"context_line":"                if key_pair:"},{"line_number":912,"context_line":"                    instance.keypairs.objects.append(key_pair)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_9863d5e0","line":909,"range":{"start_line":909,"start_character":16,"end_line":909,"end_character":45},"in_reply_to":"3f79a3b5_8f2dd892","updated":"2018-12-18 14:57:17.000000000","message":"To be clear, I\u0027m not asking that port_resource_requests gets munged in with network_metadata, I\u0027m just saying either pop it out of base_options when you use port_resource_requests *or* return it in the tuple as a new item from _validate_and_build_base_options().","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"19f8d895caa78f8b3680b8c6e7fe081d3b18a8b2","unresolved":false,"context_lines":[{"line_number":906,"context_line":"                # Create an instance object, but do not store in db yet."},{"line_number":907,"context_line":"                instance \u003d objects.Instance(context\u003dcontext)"},{"line_number":908,"context_line":"                instance.uuid \u003d instance_uuid"},{"line_number":909,"context_line":"                instance.update(base_options)"},{"line_number":910,"context_line":"                instance.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":911,"context_line":"                if key_pair:"},{"line_number":912,"context_line":"                    instance.keypairs.objects.append(key_pair)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_33bae2d9","line":909,"range":{"start_line":909,"start_character":16,"end_line":909,"end_character":45},"in_reply_to":"3f79a3b5_9863d5e0","updated":"2018-12-18 16:04:22.000000000","message":"Ohh I see. I went with the popping. If you feel returning yet another param would be better, then I can do that too.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"            request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":3374,"context_line":"                context, instance.uuid)"},{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_a0d31364","line":3376,"range":{"start_line":3376,"start_character":55,"end_line":3376,"end_character":77},"updated":"2018-12-17 17:49:16.000000000","message":"This could be confusing because of the comment immediately after this on L3381 - if you rebuild with a new image, we run through the scheduler filters again, however, we don\u0027t make any new resource allocation claims, which is what you\u0027re trying to say here. So maybe just re-word \"scheduling\" to \"new allocations\". But maybe you don\u0027t need this at all, see below.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"            request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":3374,"context_line":"                context, instance.uuid)"},{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_efaecc81","line":3376,"range":{"start_line":3376,"start_character":55,"end_line":3376,"end_character":77},"in_reply_to":"3f79a3b5_a0d31364","updated":"2018-12-18 09:31:13.000000000","message":"Good point","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":3373,"context_line":"            request_spec \u003d objects.RequestSpec.get_by_instance_uuid("},{"line_number":3374,"context_line":"                context, instance.uuid)"},{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8df5e055","line":3376,"range":{"start_line":3376,"start_character":55,"end_line":3376,"end_character":77},"in_reply_to":"3f79a3b5_efaecc81","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""},{"line_number":3380,"context_line":"            # If a new image is provided on rebuild, we will need to run"},{"line_number":3381,"context_line":"            # through the scheduler again, but we want the instance to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8046171f","line":3378,"updated":"2018-12-17 17:49:16.000000000","message":"Is this even really needed? The point in doing this would be to avoid a RequestSpec from server create accidentally being used to claim new resources during rebuild (if we go through the scheduler again). However, since requested_resources is not persisted, that shouldn\u0027t happen anyway, right?\n\nhttps://review.openstack.org/#/c/567268/36/nova/objects/request_spec.py@589","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""},{"line_number":3380,"context_line":"            # If a new image is provided on rebuild, we will need to run"},{"line_number":3381,"context_line":"            # through the scheduler again, but we want the instance to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8fc2b82c","line":3378,"in_reply_to":"3f79a3b5_8046171f","updated":"2018-12-18 09:31:13.000000000","message":"I intentionally defaulted RequestSpec.requested_resources to None so the code blows if at some point the requested_resources are needed to make a new allocation but it is not recalculated beforehand. \n\nI guess, If we go through the scheduler because a new image is requested then the requested_resources field is being read to generate the allocation candidate query and that blows.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":3375,"context_line":""},{"line_number":3376,"context_line":"            # NOTE(gibi): this is a rebuild so it will not lead to scheduling"},{"line_number":3377,"context_line":"            # therefore we don\u0027t have to re-calculate the resource requests"},{"line_number":3378,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3379,"context_line":""},{"line_number":3380,"context_line":"            # If a new image is provided on rebuild, we will need to run"},{"line_number":3381,"context_line":"            # through the scheduler again, but we want the instance to be"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_0dc1d0fc","line":3378,"in_reply_to":"3f79a3b5_8fc2b82c","updated":"2018-12-18 11:46:41.000000000","message":"After taking a deeper look I see that if rebuild is signalled to scheduler then no a_c query is made so requested_resources are not used. Therefore this code can be removed.\n\nDone","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":3667,"context_line":"                request_spec.requested_destination \u003d objects.Destination("},{"line_number":3668,"context_line":"                    host\u003dnode.host, node\u003dnode.hypervisor_hostname)"},{"line_number":3669,"context_line":""},{"line_number":3670,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3671,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3672,"context_line":"            # neutron ports."},{"line_number":3673,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3676,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_c0c16f52","line":3673,"range":{"start_line":3670,"start_character":12,"end_line":3673,"end_character":49},"updated":"2018-12-17 17:49:16.000000000","message":"I would think this TODO should be in conductor because of reschedules on resize, but in thinking about that, we only reschedule using our alternates which would have to match the port requested resources. However, I think it would still make more sense to have this closer to the actual scheduler call in conductor, otherwise it\u0027s just more tight coupling between API and conductor on resize, i.e. I have to remember that this happens to the RequestSpec in the API even though the scheduler call happens in conductor. We do lots of RequestSpec stuff in the conductor task prior to calling the scheduler here:\n\nhttps://github.com/openstack/nova/blob/af9977c71c45aa3228a416bad9f9c5de835839fb/nova/conductor/tasks/migrate.py#L165\n\nOh, by the way, we\u0027ll lose RequestSpec.requested_resource during a resize reschedule because nova-compute currently doesn\u0027t pass the request spec back to the cell conductor:\n\nhttps://github.com/openstack/nova/blob/af9977c71c45aa3228a416bad9f9c5de835839fb/nova/conductor/manager.py#L304\n\nI\u0027m trying to fix that here: https://review.openstack.org/#/c/582417/\n\nBut since we already calculated the alternate hosts from the top (superconductor) and the alternate hosts *are* passed from compute to cell conductor, I think we should be OK - the RequestSpec.requested_resources are only needed when we call select_destinations, right?","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"19f8d895caa78f8b3680b8c6e7fe081d3b18a8b2","unresolved":false,"context_lines":[{"line_number":3667,"context_line":"                request_spec.requested_destination \u003d objects.Destination("},{"line_number":3668,"context_line":"                    host\u003dnode.host, node\u003dnode.hypervisor_hostname)"},{"line_number":3669,"context_line":""},{"line_number":3670,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3671,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3672,"context_line":"            # neutron ports."},{"line_number":3673,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3676,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_f38b0a13","line":3673,"range":{"start_line":3670,"start_character":12,"end_line":3673,"end_character":49},"in_reply_to":"3f79a3b5_78a359fe","updated":"2018-12-18 16:04:22.000000000","message":"Yes, resize re-schedule breaks as it cannot re-do the port request - RP mapping for the new host without the RequestSpec. I will try to look into https://review.openstack.org/#/c/582417/ to unblock it and therefore unblock the resize re-schedule","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":3667,"context_line":"                request_spec.requested_destination \u003d objects.Destination("},{"line_number":3668,"context_line":"                    host\u003dnode.host, node\u003dnode.hypervisor_hostname)"},{"line_number":3669,"context_line":""},{"line_number":3670,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3671,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3672,"context_line":"            # neutron ports."},{"line_number":3673,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3676,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_0d8f90d2","line":3673,"range":{"start_line":3670,"start_character":12,"end_line":3673,"end_character":49},"in_reply_to":"3f79a3b5_aff69491","updated":"2018-12-18 11:46:41.000000000","message":"TODO is already in the conductor manager as you requested so this TODO is removed here.\n\nDone","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77a9d3c5a0c251b36248d57efe82ea5a27b14a5f","unresolved":false,"context_lines":[{"line_number":3667,"context_line":"                request_spec.requested_destination \u003d objects.Destination("},{"line_number":3668,"context_line":"                    host\u003dnode.host, node\u003dnode.hypervisor_hostname)"},{"line_number":3669,"context_line":""},{"line_number":3670,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3671,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3672,"context_line":"            # neutron ports."},{"line_number":3673,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3676,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_78a359fe","line":3673,"range":{"start_line":3670,"start_character":12,"end_line":3673,"end_character":49},"in_reply_to":"3f79a3b5_aff69491","updated":"2018-12-18 14:57:17.000000000","message":"Yeah I thought about how resize reschedule doesn\u0027t pass the request spec back from compute to the cell conductor. That is OK for picking a new host since we don\u0027t go through the scheduler (we use the host_lists param which has the alternates), but it will break port binding on resize reschedule since the port binding needs the resource requests doesn\u0027t it? Or will we just pass the allocation candidate request from the host_lists Selection object to the port binding API?","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":3667,"context_line":"                request_spec.requested_destination \u003d objects.Destination("},{"line_number":3668,"context_line":"                    host\u003dnode.host, node\u003dnode.hypervisor_hostname)"},{"line_number":3669,"context_line":""},{"line_number":3670,"context_line":"            # TODO(gibi): We need to make sure that the"},{"line_number":3671,"context_line":"            # requested_resources field is re calculated based on"},{"line_number":3672,"context_line":"            # neutron ports."},{"line_number":3673,"context_line":"            request_spec.requested_resources \u003d []"},{"line_number":3674,"context_line":""},{"line_number":3675,"context_line":"        self.compute_task_api.resize_instance(context, instance,"},{"line_number":3676,"context_line":"                extra_instance_updates, scheduler_hint\u003dscheduler_hint,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_aff69491","line":3673,"range":{"start_line":3670,"start_character":12,"end_line":3673,"end_character":49},"in_reply_to":"3f79a3b5_c0c16f52","updated":"2018-12-18 09:31:13.000000000","message":"I have deja vu. I think you commented something similar before and I moved this to the conductor manager. But apparently I didn\u0027t.\n\nWe need to re-calculate requested_resource for the resize happy path. I will move this TODO to the conductor as you suggested\n\nI want to believe that in case of re-schedule we use the alternates and not hitting the scheduler again. However during re-schedule we still needed the original requested_resources to be able to calculate the mapping of the request groups to the alternate RPs in the alternate allocation [1]. \n\n[1] https://review.openstack.org/#/c/619529/7/nova/conductor/manager.py@672","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5680fd315b3e2b01b0bba9887dd213d10e410722","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        security_groups \u003d self.security_group_api.populate_security_groups("},{"line_number":872,"context_line":"                security_groups)"},{"line_number":873,"context_line":"        self.security_group_api.ensure_default(context)"},{"line_number":874,"context_line":"        port_resource_requests \u003d base_options.pop(\u0027port_resource_requests\u0027)"},{"line_number":875,"context_line":"        LOG.debug(\"Going to run %s instances...\", num_instances)"},{"line_number":876,"context_line":"        instances_to_build \u003d []"},{"line_number":877,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_2905ee7a","line":874,"range":{"start_line":874,"start_character":46,"end_line":874,"end_character":49},"updated":"2019-02-07 00:25:07.000000000","message":"I\u0027m not sure why port_resource_requests are being removed from base_options here -- I don\u0027t see any other base_options being removed in this file. I don\u0027t think it hurts anything though.","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a3b9a0309b9589377708351e363c3a522c6e33e7","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        security_groups \u003d self.security_group_api.populate_security_groups("},{"line_number":872,"context_line":"                security_groups)"},{"line_number":873,"context_line":"        self.security_group_api.ensure_default(context)"},{"line_number":874,"context_line":"        port_resource_requests \u003d base_options.pop(\u0027port_resource_requests\u0027)"},{"line_number":875,"context_line":"        LOG.debug(\"Going to run %s instances...\", num_instances)"},{"line_number":876,"context_line":"        instances_to_build \u003d []"},{"line_number":877,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_6b7c46b5","line":874,"range":{"start_line":874,"start_character":46,"end_line":874,"end_character":49},"in_reply_to":"9fdfeff1_2905ee7a","updated":"2019-02-07 07:14:25.000000000","message":"Matt found out that base_option ends up copied into the instance object so this extra param needs to be removed.\nhttps://review.openstack.org/#/c/567268/36/nova/compute/api.py@909","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"92dba8b59b9fd13f11dfc9bcfd115beaf3bc6e29","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        security_groups \u003d self.security_group_api.populate_security_groups("},{"line_number":872,"context_line":"                security_groups)"},{"line_number":873,"context_line":"        self.security_group_api.ensure_default(context)"},{"line_number":874,"context_line":"        port_resource_requests \u003d base_options.pop(\u0027port_resource_requests\u0027)"},{"line_number":875,"context_line":"        LOG.debug(\"Going to run %s instances...\", num_instances)"},{"line_number":876,"context_line":"        instances_to_build \u003d []"},{"line_number":877,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_7a6f20c5","line":874,"range":{"start_line":874,"start_character":46,"end_line":874,"end_character":49},"in_reply_to":"9fdfeff1_3f03ca44","updated":"2019-02-07 20:11:14.000000000","message":"A-ha, thank you both for explaining that.","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"71d49e7f4c59e5369f06ba36f54afbb136ad6d4f","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        security_groups \u003d self.security_group_api.populate_security_groups("},{"line_number":872,"context_line":"                security_groups)"},{"line_number":873,"context_line":"        self.security_group_api.ensure_default(context)"},{"line_number":874,"context_line":"        port_resource_requests \u003d base_options.pop(\u0027port_resource_requests\u0027)"},{"line_number":875,"context_line":"        LOG.debug(\"Going to run %s instances...\", num_instances)"},{"line_number":876,"context_line":"        instances_to_build \u003d []"},{"line_number":877,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_3f03ca44","line":874,"range":{"start_line":874,"start_character":46,"end_line":874,"end_character":49},"in_reply_to":"9fdfeff1_6b7c46b5","updated":"2019-02-07 19:54:20.000000000","message":"Technically it doesn\u0027t *need* to be pop\u0027ed since it will just be an extra attribute on the Instance object, but base_options is really mostly about attributes for the instance, we\u0027re just abusing it here.\n\nThe alternative is _validate_and_build_base_options passes it as another entry in that already-big tuple, so it\u0027s just a matter of preference.","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4e462dccd5f8f05635e5540cf277aa46982a6760","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                                                   instance.uuid)"},{"line_number":778,"context_line":"                    request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":779,"context_line":"                        context, request_spec, filter_properties)"},{"line_number":780,"context_line":"                    # TODO(gibi): We need to make sure that the"},{"line_number":781,"context_line":"                    # requested_resources field is re calculated based on"},{"line_number":782,"context_line":"                    # neutron ports."},{"line_number":783,"context_line":"                    request_spec.requested_resources \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_695484fe","line":780,"updated":"2018-06-01 13:20:48.000000000","message":"You\u0027ll need something like this in the rebuild_instance method (for the evacuate scenario).","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e9bfd0631a80c2ed88868fde41e06f1135ead6ca","unresolved":false,"context_lines":[{"line_number":777,"context_line":"                                                   instance.uuid)"},{"line_number":778,"context_line":"                    request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":779,"context_line":"                        context, request_spec, filter_properties)"},{"line_number":780,"context_line":"                    # TODO(gibi): We need to make sure that the"},{"line_number":781,"context_line":"                    # requested_resources field is re calculated based on"},{"line_number":782,"context_line":"                    # neutron ports."},{"line_number":783,"context_line":"                    request_spec.requested_resources \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"5f7c97a3_3fcc7e87","line":780,"in_reply_to":"5f7c97a3_695484fe","updated":"2018-06-01 15:22:44.000000000","message":"Done","commit_id":"7baf05f727e34aa85b0ac5f28e2b2933b48db0e1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                # This is not a reschedule, so we need to call the scheduler to"},{"line_number":604,"context_line":"                # get appropriate hosts for the request."},{"line_number":605,"context_line":"                # NOTE(gibi): we only reach this if we are running cellsv1"},{"line_number":606,"context_line":"                # cellv2 is mandatory from Queens. So it is an old compute"},{"line_number":607,"context_line":"                # therefore the instance cannot have any requested resource"},{"line_number":608,"context_line":"                # outside of nova like bandwidth."},{"line_number":609,"context_line":"                spec_obj.requested_resources \u003d []"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_603f3b23","line":606,"range":{"start_line":606,"start_character":43,"end_line":606,"end_character":49},"updated":"2018-12-17 17:49:16.000000000","message":"Ocata actually, but you can still run cells v1 with cellsv2 enabled (that\u0027s how our nova-cells-v1 job works). Maybe you mean alternate hosts (host_lists) was added in Queens?\n\nI\u0027m not sure what the \"old compute\" mention is in here - do you mean if the host_lists variable is None?\n\nI would maybe just re-write this as, \"We only call the scheduler if using cells v1 or we are rescheduling from a really old compute. In either case we do not support externally-defined resource requests, like port QoS.\".","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                # This is not a reschedule, so we need to call the scheduler to"},{"line_number":604,"context_line":"                # get appropriate hosts for the request."},{"line_number":605,"context_line":"                # NOTE(gibi): we only reach this if we are running cellsv1"},{"line_number":606,"context_line":"                # cellv2 is mandatory from Queens. So it is an old compute"},{"line_number":607,"context_line":"                # therefore the instance cannot have any requested resource"},{"line_number":608,"context_line":"                # outside of nova like bandwidth."},{"line_number":609,"context_line":"                spec_obj.requested_resources \u003d []"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_efb48c86","line":606,"range":{"start_line":606,"start_character":43,"end_line":606,"end_character":49},"in_reply_to":"3f79a3b5_603f3b23","updated":"2018-12-18 09:31:13.000000000","message":"Thanks for understanding my gibberish and decoded the real meaning I wanted to communicate. I will update the wording as you suggested.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":603,"context_line":"                # This is not a reschedule, so we need to call the scheduler to"},{"line_number":604,"context_line":"                # get appropriate hosts for the request."},{"line_number":605,"context_line":"                # NOTE(gibi): we only reach this if we are running cellsv1"},{"line_number":606,"context_line":"                # cellv2 is mandatory from Queens. So it is an old compute"},{"line_number":607,"context_line":"                # therefore the instance cannot have any requested resource"},{"line_number":608,"context_line":"                # outside of nova like bandwidth."},{"line_number":609,"context_line":"                spec_obj.requested_resources \u003d []"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_0d46b07e","line":606,"range":{"start_line":606,"start_character":43,"end_line":606,"end_character":49},"in_reply_to":"3f79a3b5_efb48c86","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":907,"context_line":"                                \u0027not found.\u0027, instance.host, instance.node,"},{"line_number":908,"context_line":"                                instance\u003dinstance)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        # TODO(gibi): We need to handle the bandwidth resource which is not"},{"line_number":911,"context_line":"        # on the compute host RP so blind copying will not work."},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        # TODO(mriedem): In Queens, call select_destinations() with a"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_60509b2e","line":910,"updated":"2018-12-17 17:49:16.000000000","message":"This would also be covered by blueprint remove-force-flag-from-live-migrate-and-evacuate right? Because I think we said we\u0027d just outright fail a forced evacuate/live migration request if the source node contained \"nested allocations\".","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":907,"context_line":"                                \u0027not found.\u0027, instance.host, instance.node,"},{"line_number":908,"context_line":"                                instance\u003dinstance)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        # TODO(gibi): We need to handle the bandwidth resource which is not"},{"line_number":911,"context_line":"        # on the compute host RP so blind copying will not work."},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        # TODO(mriedem): In Queens, call select_destinations() with a"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8d516035","line":910,"in_reply_to":"3f79a3b5_0f2b089a","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":907,"context_line":"                                \u0027not found.\u0027, instance.host, instance.node,"},{"line_number":908,"context_line":"                                instance\u003dinstance)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        # TODO(gibi): We need to handle the bandwidth resource which is not"},{"line_number":911,"context_line":"        # on the compute host RP so blind copying will not work."},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        # TODO(mriedem): In Queens, call select_destinations() with a"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_0f2b089a","line":910,"in_reply_to":"3f79a3b5_60509b2e","updated":"2018-12-18 09:31:13.000000000","message":"You are right [1] https://review.openstack.org/#/c/605785/ already rejects forced evacuate with bandwidth allocation as that makes the allocation nested.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                        image_meta, [instance])"},{"line_number":1004,"context_line":"                    request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":1005,"context_line":"                        context, request_spec, filter_properties)"},{"line_number":1006,"context_line":"                    # NOTE(gibi): As it is an old instance it cannot have any"},{"line_number":1007,"context_line":"                    # requested resource outside of nova like bandwidth."},{"line_number":1008,"context_line":"                    request_spec.requested_resources \u003d []"},{"line_number":1009,"context_line":"                elif recreate:"},{"line_number":1010,"context_line":"                    # NOTE(sbauza): Augment the RequestSpec object by excluding"},{"line_number":1011,"context_line":"                    # the source host for avoiding the scheduler to pick it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_a01b1383","line":1008,"range":{"start_line":1006,"start_character":20,"end_line":1008,"end_character":57},"updated":"2018-12-17 17:49:16.000000000","message":"Do we even need to set this? The field defaults to None.\n\nhttps://review.openstack.org/#/c/567268/36/nova/objects/request_spec.py@89","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                        image_meta, [instance])"},{"line_number":1004,"context_line":"                    request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":1005,"context_line":"                        context, request_spec, filter_properties)"},{"line_number":1006,"context_line":"                    # NOTE(gibi): As it is an old instance it cannot have any"},{"line_number":1007,"context_line":"                    # requested resource outside of nova like bandwidth."},{"line_number":1008,"context_line":"                    request_spec.requested_resources \u003d []"},{"line_number":1009,"context_line":"                elif recreate:"},{"line_number":1010,"context_line":"                    # NOTE(sbauza): Augment the RequestSpec object by excluding"},{"line_number":1011,"context_line":"                    # the source host for avoiding the scheduler to pick it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_8804ee12","line":1008,"range":{"start_line":1006,"start_character":20,"end_line":1008,"end_character":57},"in_reply_to":"3f79a3b5_12f9eb19","updated":"2018-12-18 11:46:41.000000000","message":"Removed.\nDone.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"                        image_meta, [instance])"},{"line_number":1004,"context_line":"                    request_spec \u003d objects.RequestSpec.from_primitives("},{"line_number":1005,"context_line":"                        context, request_spec, filter_properties)"},{"line_number":1006,"context_line":"                    # NOTE(gibi): As it is an old instance it cannot have any"},{"line_number":1007,"context_line":"                    # requested resource outside of nova like bandwidth."},{"line_number":1008,"context_line":"                    request_spec.requested_resources \u003d []"},{"line_number":1009,"context_line":"                elif recreate:"},{"line_number":1010,"context_line":"                    # NOTE(sbauza): Augment the RequestSpec object by excluding"},{"line_number":1011,"context_line":"                    # the source host for avoiding the scheduler to pick it"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_12f9eb19","line":1008,"range":{"start_line":1006,"start_character":20,"end_line":1008,"end_character":57},"in_reply_to":"3f79a3b5_a01b1383","updated":"2018-12-18 09:31:13.000000000","message":"Good point.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":71,"context_line":"        # is re calculated based on neutron ports."},{"line_number":72,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        self._source_cn, self._held_allocations \u003d ("},{"line_number":75,"context_line":"            # NOTE(danms): This may raise various exceptions, which will"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_802057b0","line":72,"updated":"2018-12-17 17:49:16.000000000","message":"There are really two paths here. If self.destination is None, then we\u0027re going to call the scheduler, and this calculation could be closer to that code, like in _get_request_spec_for_select_destinations. If self.destination is not None, the admin is forcing the live migration to a specific host and bypassing the scheduler. With blueprint remove-force-flag-from-live-migrate-and-evacuate I think we said we\u0027d fail that scenario if the source node has nested allocations. So I\u0027m not sure if you just want to leave this here and move it later when dealing with the TODO, because I would think dealing with that TODO would be part of blueprint remove-force-flag-from-live-migrate-and-evacuate.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":71,"context_line":"        # is re calculated based on neutron ports."},{"line_number":72,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        self._source_cn, self._held_allocations \u003d ("},{"line_number":75,"context_line":"            # NOTE(danms): This may raise various exceptions, which will"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e86c82d3","line":72,"in_reply_to":"3f79a3b5_72329ff6","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":71,"context_line":"        # is re calculated based on neutron ports."},{"line_number":72,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        self._source_cn, self._held_allocations \u003d ("},{"line_number":75,"context_line":"            # NOTE(danms): This may raise various exceptions, which will"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_72329ff6","line":72,"in_reply_to":"3f79a3b5_802057b0","updated":"2018-12-18 09:31:13.000000000","message":"I will move this TODO to _get_request_spec_for_select_destination(). The force case already handled by rejecting force move when instance has nested allocation on the source.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/conductor/tasks/migrate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # is not forced to be the original host"},{"line_number":182,"context_line":"        self.request_spec.reset_forced_destinations()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":185,"context_line":"        # is re calculated based on neutron ports."},{"line_number":186,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_5bf9d018","line":184,"updated":"2018-12-17 17:49:16.000000000","message":"This is what I was talking about in the API:\n\nhttps://review.openstack.org/#/c/567268/36/nova/compute/api.py@3673\n\nSo the TODO in the API is redundant with this and we can remove that change.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # is not forced to be the original host"},{"line_number":182,"context_line":"        self.request_spec.reset_forced_destinations()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":185,"context_line":"        # is re calculated based on neutron ports."},{"line_number":186,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_d250530b","line":184,"in_reply_to":"3f79a3b5_5bf9d018","updated":"2018-12-18 09:31:13.000000000","message":"This confirms my deja vu :) So I did copied the TODO here due to your previous comments (I think in PS10) but I forget to delete in the old place.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        # is not forced to be the original host"},{"line_number":182,"context_line":"        self.request_spec.reset_forced_destinations()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        # TODO(gibi): We need to make sure that the requested_resources field"},{"line_number":185,"context_line":"        # is re calculated based on neutron ports."},{"line_number":186,"context_line":"        self.request_spec.requested_resources \u003d []"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_08d77ef5","line":184,"in_reply_to":"3f79a3b5_d250530b","updated":"2018-12-18 11:46:41.000000000","message":"The TODO has been removed from the api.\nDone","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/conf/workarounds.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"daa53d9bc2e94fd4590f7cd767cb2c7f8ee7c2f9","unresolved":false,"context_lines":[{"line_number":215,"context_line":"\"\"\"),"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    cfg.BoolOpt("},{"line_number":218,"context_line":"        \u0027enable_port_resource_request_support\u0027,"},{"line_number":219,"context_line":"        default\u003dFalse,"},{"line_number":220,"context_line":"        help\u003d\"\"\""},{"line_number":221,"context_line":"Enable resource allocation handling for Neutron ports."}],"source_content_type":"text/x-python","patch_set":42,"id":"3f79a3b5_5734f5a9","line":218,"updated":"2018-12-20 17:38:07.000000000","message":"I really don\u0027t like config-driven API behavior. At the very least a policy rule, read from the API when calling create_resource_requests(), would be better since then the deployer can configure which users can do this thing rather than being forced to either enable or disable it globally.","commit_id":"5e471e1f968ce6142ee2d48185780483dd54d023"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"9e80761057e0e06c875e51587e8cff6a3bd8a0c7","unresolved":false,"context_lines":[{"line_number":215,"context_line":"\"\"\"),"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    cfg.BoolOpt("},{"line_number":218,"context_line":"        \u0027enable_port_resource_request_support\u0027,"},{"line_number":219,"context_line":"        default\u003dFalse,"},{"line_number":220,"context_line":"        help\u003d\"\"\""},{"line_number":221,"context_line":"Enable resource allocation handling for Neutron ports."}],"source_content_type":"text/x-python","patch_set":42,"id":"1f769fc5_65aea9e8","line":218,"in_reply_to":"3f79a3b5_5734f5a9","updated":"2018-12-29 02:32:06.000000000","message":"So I don\u0027t quite understand that why do we need this switch, so we cannot perform the following cases for instance with ports that have resource request, why couldn\u0027t we just fail on these cases? like we don\u0027t allow instance to move with NUMA request. and then we will have to relax the limits one by one when the feature has been implemented.","commit_id":"5e471e1f968ce6142ee2d48185780483dd54d023"}],"nova/network/api.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"055c37ee66bd9e02309c1d2012abdb464f07badc","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        \"\"\""},{"line_number":394,"context_line":"        # This is NOOP for Nova network since it doesn\u0027t support SR-IOV or"},{"line_number":395,"context_line":"        # NUMA-aware vSwitch functionality."},{"line_number":396,"context_line":"        return None, []"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    def get_dns_domains(self, context):"},{"line_number":399,"context_line":"        \"\"\"Returns a list of available dns domains."}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_0da3099e","line":396,"updated":"2018-11-06 01:48:25.000000000","message":"What\u0027s the format of this tuple? Code comment would be nice.\n\n(later)\n\nnetwork_metadata, port_resource_requests","commit_id":"e3563e73f928938b98b89c85d953f71a0f9e4f39"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de3408b7cff66fd20706b0e2c37c0f6955a8ce2f","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        \"\"\""},{"line_number":394,"context_line":"        # This is NOOP for Nova network since it doesn\u0027t support SR-IOV or"},{"line_number":395,"context_line":"        # NUMA-aware vSwitch functionality."},{"line_number":396,"context_line":"        return None, []"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    def get_dns_domains(self, context):"},{"line_number":399,"context_line":"        \"\"\"Returns a list of available dns domains."}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_1719b221","line":396,"in_reply_to":"3f79a3b5_0da3099e","updated":"2018-11-07 11:27:21.000000000","message":"Done","commit_id":"e3563e73f928938b98b89c85d953f71a0f9e4f39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        :param context: The request context."},{"line_number":395,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":396,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":397,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":398,"context_line":"            requests created here will be added."},{"line_number":399,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3dff2cb1","line":396,"range":{"start_line":396,"start_character":47,"end_line":396,"end_character":67},"updated":"2018-12-17 17:49:16.000000000","message":"NetworkRequestList","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        :param context: The request context."},{"line_number":395,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":396,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":397,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":398,"context_line":"            requests created here will be added."},{"line_number":399,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_88306e54","line":396,"range":{"start_line":396,"start_character":47,"end_line":396,"end_character":67},"in_reply_to":"3f79a3b5_3dff2cb1","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":402,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":403,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":404,"context_line":"        \"\"\""},{"line_number":405,"context_line":"        # This is NOOP for Nova network since it doesn\u0027t support SR-IOV or"},{"line_number":406,"context_line":"        # NUMA-aware vSwitch functionality."}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_1d25905e","line":403,"range":{"start_line":403,"start_character":66,"end_line":403,"end_character":79},"updated":"2018-12-17 17:49:16.000000000","message":"nit: requested port","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":402,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":403,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":404,"context_line":"        \"\"\""},{"line_number":405,"context_line":"        # This is NOOP for Nova network since it doesn\u0027t support SR-IOV or"},{"line_number":406,"context_line":"        # NUMA-aware vSwitch functionality."}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_483a5632","line":403,"range":{"start_line":403,"start_character":66,"end_line":403,"end_character":79},"in_reply_to":"3f79a3b5_1d25905e","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/network/base_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        :param context: The request context."},{"line_number":281,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":282,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":283,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":284,"context_line":"            requests created here will be added."},{"line_number":285,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        :returns: An instance of ``objects.NetworkMetadata`` for use by the"},{"line_number":288,"context_line":"            scheduler or None."}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_ddd39835","side":"PARENT","line":285,"range":{"start_line":283,"start_character":8,"end_line":285,"end_character":60},"updated":"2018-12-17 17:49:16.000000000","message":"Interesting, this param was missed in the base_api - rather than remove this docstring, it would probably be more correct to fix the missing parameter.","commit_id":"f49bcd7782ac95ceb3a73dd49cd2986e97ef69f4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        :param context: The request context."},{"line_number":281,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":282,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":283,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":284,"context_line":"            requests created here will be added."},{"line_number":285,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        :returns: An instance of ``objects.NetworkMetadata`` for use by the"},{"line_number":288,"context_line":"            scheduler or None."}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_68639247","side":"PARENT","line":285,"range":{"start_line":283,"start_character":8,"end_line":285,"end_character":60},"in_reply_to":"3f79a3b5_32418738","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"f49bcd7782ac95ceb3a73dd49cd2986e97ef69f4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        :param context: The request context."},{"line_number":281,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":282,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":283,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":284,"context_line":"            requests created here will be added."},{"line_number":285,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        :returns: An instance of ``objects.NetworkMetadata`` for use by the"},{"line_number":288,"context_line":"            scheduler or None."}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_32418738","side":"PARENT","line":285,"range":{"start_line":283,"start_character":8,"end_line":285,"end_character":60},"in_reply_to":"3f79a3b5_ddd39835","updated":"2018-12-18 09:31:13.000000000","message":"Sure","commit_id":"f49bcd7782ac95ceb3a73dd49cd2986e97ef69f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        :param context: The request context."},{"line_number":281,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":282,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":285,"context_line":"                  use by the scheduler or None and a list of RequestGroup"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3d288c33","line":282,"range":{"start_line":282,"start_character":47,"end_line":282,"end_character":67},"updated":"2018-12-17 17:49:16.000000000","message":"I see where the typo came from, but this is wrong.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        :param context: The request context."},{"line_number":281,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":282,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":285,"context_line":"                  use by the scheduler or None and a list of RequestGroup"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_885e2e7a","line":282,"range":{"start_line":282,"start_character":47,"end_line":282,"end_character":67},"in_reply_to":"3f79a3b5_3d288c33","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":285,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":286,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        raise NotImplementedError()"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fdd69425","line":286,"range":{"start_line":286,"start_character":66,"end_line":286,"end_character":79},"updated":"2018-12-17 17:49:16.000000000","message":"requested port","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":285,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":286,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":287,"context_line":"        \"\"\""},{"line_number":288,"context_line":"        raise NotImplementedError()"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_286d9a2f","line":286,"range":{"start_line":286,"start_character":66,"end_line":286,"end_character":79},"in_reply_to":"3f79a3b5_fdd69425","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4820c3b5c391dc2a18e0b5246d8ae5077074cb60","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \"\"\""},{"line_number":274,"context_line":"        raise NotImplementedError()"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def create_resource_requests(self, context, pci_requests,"},{"line_number":277,"context_line":"                                 requested_networks):"},{"line_number":278,"context_line":"        \"\"\"Retrieve all information for the networks passed at the time of"},{"line_number":279,"context_line":"        creating the server."}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_8454cb24","line":276,"range":{"start_line":276,"start_character":48,"end_line":276,"end_character":60},"updated":"2018-12-18 21:22:09.000000000","message":"This is the wrong order, the signature should be:\n\ndef create_resource_requests(self, context, requested_networks, pci_requests\u003dNone):","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b84f77afbdd8de73bcb53c3d50481d63f4507d","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \"\"\""},{"line_number":274,"context_line":"        raise NotImplementedError()"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def create_resource_requests(self, context, pci_requests,"},{"line_number":277,"context_line":"                                 requested_networks):"},{"line_number":278,"context_line":"        \"\"\"Retrieve all information for the networks passed at the time of"},{"line_number":279,"context_line":"        creating the server."}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_c7edd301","line":276,"range":{"start_line":276,"start_character":48,"end_line":276,"end_character":60},"in_reply_to":"3f79a3b5_8454cb24","updated":"2018-12-19 15:50:04.000000000","message":"Done","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"            # Add pci_request_id into the requested network"},{"line_number":1946,"context_line":"            request_net.pci_request_id \u003d pci_request_id"},{"line_number":1947,"context_line":""},{"line_number":1948,"context_line":"        return objects.NetworkMetadata(physnets\u003dphysnets, tunneled\u003dtunneled)"},{"line_number":1949,"context_line":""},{"line_number":1950,"context_line":"    def _can_auto_allocate_network(self, context, neutron):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_bda33c45","side":"PARENT","line":1947,"updated":"2018-12-17 17:49:16.000000000","message":"unrelated","commit_id":"f49bcd7782ac95ceb3a73dd49cd2986e97ef69f4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"            # Add pci_request_id into the requested network"},{"line_number":1946,"context_line":"            request_net.pci_request_id \u003d pci_request_id"},{"line_number":1947,"context_line":""},{"line_number":1948,"context_line":"        return objects.NetworkMetadata(physnets\u003dphysnets, tunneled\u003dtunneled)"},{"line_number":1949,"context_line":""},{"line_number":1950,"context_line":"    def _can_auto_allocate_network(self, context, neutron):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_235a9b1e","side":"PARENT","line":1947,"in_reply_to":"3f79a3b5_bda33c45","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"f49bcd7782ac95ceb3a73dd49cd2986e97ef69f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"},{"line_number":1867,"context_line":"            trusted \u003d self._get_trusted_mode_from_port(port)"},{"line_number":1868,"context_line":""},{"line_number":1869,"context_line":"        resource_request \u003d port.get(\u0027resource_request\u0027, None)"},{"line_number":1870,"context_line":"        return vnic_type, trusted, network_id, resource_request"},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"    def create_resource_requests(self, context, requested_networks,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fdabf46c","line":1869,"updated":"2018-12-17 17:49:16.000000000","message":"OK this comes from https://review.openstack.org/#/c/590363/27/neutron/services/qos/qos_plugin.py.\n\nA generic comment here could be useful to indicate why we have to handle \u0027resource_request\u0027 being optional, e.g. \"Get the port resource_request which may or may not be set depending on neutron configuration, e.g. if QoS rules are applied to the port/network.\".","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"},{"line_number":1867,"context_line":"            trusted \u003d self._get_trusted_mode_from_port(port)"},{"line_number":1868,"context_line":""},{"line_number":1869,"context_line":"        resource_request \u003d port.get(\u0027resource_request\u0027, None)"},{"line_number":1870,"context_line":"        return vnic_type, trusted, network_id, resource_request"},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"    def create_resource_requests(self, context, requested_networks,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_88f5ce55","line":1869,"in_reply_to":"3f79a3b5_b266f7ef","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"        if vnic_type in network_model.VNIC_TYPES_SRIOV:"},{"line_number":1867,"context_line":"            trusted \u003d self._get_trusted_mode_from_port(port)"},{"line_number":1868,"context_line":""},{"line_number":1869,"context_line":"        resource_request \u003d port.get(\u0027resource_request\u0027, None)"},{"line_number":1870,"context_line":"        return vnic_type, trusted, network_id, resource_request"},{"line_number":1871,"context_line":""},{"line_number":1872,"context_line":"    def create_resource_requests(self, context, requested_networks,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_b266f7ef","line":1869,"in_reply_to":"3f79a3b5_fdabf46c","updated":"2018-12-18 09:31:13.000000000","message":"Good point.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":"        :param context: The request context."},{"line_number":1878,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":1879,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":1880,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":1881,"context_line":"            requests created here will be added."},{"line_number":1882,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_5de78811","line":1879,"range":{"start_line":1879,"start_character":47,"end_line":1879,"end_character":67},"updated":"2018-12-17 17:49:16.000000000","message":"NetworkRequestList - could be fixed separately.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1876,"context_line":""},{"line_number":1877,"context_line":"        :param context: The request context."},{"line_number":1878,"context_line":"        :param requested_networks: The networks requested for the server."},{"line_number":1879,"context_line":"        :type requested_networks: nova.objects.RequestedNetworkList"},{"line_number":1880,"context_line":"        :param pci_requests: The list of PCI requests to which additional PCI"},{"line_number":1881,"context_line":"            requests created here will be added."},{"line_number":1882,"context_line":"        :type pci_requests: nova.objects.InstancePCIRequests"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_489d76fb","line":1879,"range":{"start_line":1879,"start_character":47,"end_line":1879,"end_character":67},"in_reply_to":"3f79a3b5_5de78811","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1883,"context_line":""},{"line_number":1884,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":1885,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":1886,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":1887,"context_line":"        \"\"\""},{"line_number":1888,"context_line":"        if not requested_networks or requested_networks.no_allocate:"},{"line_number":1889,"context_line":"            return None, []"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fdaf7499","line":1886,"range":{"start_line":1886,"start_character":66,"end_line":1886,"end_character":79},"updated":"2018-12-17 17:49:16.000000000","message":"requested port","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1883,"context_line":""},{"line_number":1884,"context_line":"        :returns: A tuple with an instance of ``objects.NetworkMetadata`` for"},{"line_number":1885,"context_line":"                  use by the scheduler or None and a list of RequestGroup"},{"line_number":1886,"context_line":"                  objects representing the resource needs of each request ports"},{"line_number":1887,"context_line":"        \"\"\""},{"line_number":1888,"context_line":"        if not requested_networks or requested_networks.no_allocate:"},{"line_number":1889,"context_line":"            return None, []"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e859e267","line":1886,"range":{"start_line":1886,"start_character":66,"end_line":1886,"end_character":79},"in_reply_to":"3f79a3b5_fdaf7499","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1911,"context_line":"                if resource_request:"},{"line_number":1912,"context_line":"                    resource_requests.append("},{"line_number":1913,"context_line":"                        objects.RequestGroup.from_port_request("},{"line_number":1914,"context_line":"                            context, resource_request))"},{"line_number":1915,"context_line":""},{"line_number":1916,"context_line":"            elif request_net.network_id and not request_net.auto_allocate:"},{"line_number":1917,"context_line":"                network_id \u003d request_net.network_id"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fd98d419","line":1914,"range":{"start_line":1914,"start_character":28,"end_line":1914,"end_character":35},"updated":"2018-12-17 17:49:16.000000000","message":"I\u0027m not sure how much this is really needed since we shouldn\u0027t be saving this to the DB so it should be OK to leave these as orphans. This doesn\u0027t hurt though.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1911,"context_line":"                if resource_request:"},{"line_number":1912,"context_line":"                    resource_requests.append("},{"line_number":1913,"context_line":"                        objects.RequestGroup.from_port_request("},{"line_number":1914,"context_line":"                            context, resource_request))"},{"line_number":1915,"context_line":""},{"line_number":1916,"context_line":"            elif request_net.network_id and not request_net.auto_allocate:"},{"line_number":1917,"context_line":"                network_id \u003d request_net.network_id"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_83328fea","line":1914,"range":{"start_line":1914,"start_character":28,"end_line":1914,"end_character":35},"in_reply_to":"3f79a3b5_72a5bf01","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":1911,"context_line":"                if resource_request:"},{"line_number":1912,"context_line":"                    resource_requests.append("},{"line_number":1913,"context_line":"                        objects.RequestGroup.from_port_request("},{"line_number":1914,"context_line":"                            context, resource_request))"},{"line_number":1915,"context_line":""},{"line_number":1916,"context_line":"            elif request_net.network_id and not request_net.auto_allocate:"},{"line_number":1917,"context_line":"                network_id \u003d request_net.network_id"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_72a5bf01","line":1914,"range":{"start_line":1914,"start_character":28,"end_line":1914,"end_character":35},"in_reply_to":"3f79a3b5_fd98d419","updated":"2018-12-18 09:31:13.000000000","message":"Let\u0027s orphan it so we can see if somebody later tries to save it to the db against are intention.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/objects/request_spec.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3ca7ae66b908c2291df5f873358ff1bb32fbc9c9","unresolved":false,"context_lines":[{"line_number":852,"context_line":"            self.forbidden_traits \u003d set()"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    @classmethod"},{"line_number":855,"context_line":"    def from_port_request(cls, port_resource_request):"},{"line_number":856,"context_line":"        \"\"\"Init the group from the resource request of a neutron port"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        For example:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_0e321ff3","line":855,"range":{"start_line":855,"start_character":8,"end_line":855,"end_character":25},"updated":"2018-05-25 00:02:58.000000000","message":"This method is pretty generic.  Is it appropriate to name and doc it so port-specific?","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4195a4c30eec1d019b5ed9216b551b99cd5b4bc0","unresolved":false,"context_lines":[{"line_number":852,"context_line":"            self.forbidden_traits \u003d set()"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    @classmethod"},{"line_number":855,"context_line":"    def from_port_request(cls, port_resource_request):"},{"line_number":856,"context_line":"        \"\"\"Init the group from the resource request of a neutron port"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        For example:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_a84dfa3b","line":855,"range":{"start_line":855,"start_character":8,"end_line":855,"end_character":25},"in_reply_to":"5f7c97a3_0e321ff3","updated":"2018-05-29 15:25:33.000000000","message":"This is neutron specific. It parses the content of the resource_request field of a Neutron port.","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        self.obj_set_defaults()"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    @classmethod"},{"line_number":907,"context_line":"    def from_port_request(cls, context, port_resource_request):"},{"line_number":908,"context_line":"        \"\"\"Init the group from the resource request of a neutron port"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        :param context: the request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_ddddd812","line":907,"updated":"2018-12-17 17:49:16.000000000","message":"nit: could have split this out to make the overall change smaller. But this part is pretty trivial so leave it in if you want.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"be6b2d6911d76d48ce6bd53d13ce8e03bb48888a","unresolved":false,"context_lines":[{"line_number":904,"context_line":"        self.obj_set_defaults()"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    @classmethod"},{"line_number":907,"context_line":"    def from_port_request(cls, context, port_resource_request):"},{"line_number":908,"context_line":"        \"\"\"Init the group from the resource request of a neutron port"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"        :param context: the request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_93d0962b","line":907,"in_reply_to":"3f79a3b5_ddddd812","updated":"2018-12-18 15:58:13.000000000","message":"Splited out to https://review.openstack.org/#/c/625941/1","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":913,"context_line":"        For example:"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"            port_resource_request \u003d {"},{"line_number":916,"context_line":"                \"resources\": {"},{"line_number":917,"context_line":"                    \"NET_BW_IGR_KILOBIT_PER_SEC\": 1000,"},{"line_number":918,"context_line":"                    \"NET_BW_EGR_KILOBIT_PER_SEC\": 1000},"},{"line_number":919,"context_line":"                \"required\": [\"CUSTOM_PHYSNET_2\","},{"line_number":920,"context_line":"                             \"CUSTOM_VNIC_TYPE_NORMAL\"]"},{"line_number":921,"context_line":"            }"},{"line_number":922,"context_line":"        \"\"\""},{"line_number":923,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_1d70300f","line":920,"range":{"start_line":916,"start_character":16,"end_line":920,"end_character":55},"updated":"2018-12-17 17:49:16.000000000","message":"Ack:\n\nhttps://review.openstack.org/#/c/590363/27/neutron/services/qos/qos_plugin.py@124","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":926,"context_line":"        # * a port only specifies resources and required traits"},{"line_number":927,"context_line":"        obj \u003d cls(context\u003dcontext,"},{"line_number":928,"context_line":"                  use_same_provider\u003dTrue,"},{"line_number":929,"context_line":"                  resources\u003dport_resource_request[\u0027resources\u0027],"},{"line_number":930,"context_line":"                  required_traits\u003dset(port_resource_request.get("},{"line_number":931,"context_line":"                      \u0027required\u0027, [])))"},{"line_number":932,"context_line":"        obj.obj_set_defaults()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_7dd604c4","line":929,"updated":"2018-12-17 17:49:16.000000000","message":"nit: I\u0027m not sure why resources is required but \"required\" (traits) is optional. The qos plugin code will set both, but I\u0027m assuming you\u0027re writing this to be generic. If we were future proofing this, resources would also be optional like it is in GET /allocation_candidates:\n\nhttps://developer.openstack.org/api-ref/placement/?expanded\u003dlist-allocation-candidates-detail#list-allocation-candidates","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":926,"context_line":"        # * a port only specifies resources and required traits"},{"line_number":927,"context_line":"        obj \u003d cls(context\u003dcontext,"},{"line_number":928,"context_line":"                  use_same_provider\u003dTrue,"},{"line_number":929,"context_line":"                  resources\u003dport_resource_request[\u0027resources\u0027],"},{"line_number":930,"context_line":"                  required_traits\u003dset(port_resource_request.get("},{"line_number":931,"context_line":"                      \u0027required\u0027, [])))"},{"line_number":932,"context_line":"        obj.obj_set_defaults()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_b28fd71f","line":929,"in_reply_to":"3f79a3b5_7dd604c4","updated":"2018-12-18 09:31:13.000000000","message":"Whaaat? :) I thought \u0027resources\u0027 was required in the a_c placement API.  \n// looking up the placement code //\nOhh, when we introduced numbered groups we made resources optional in the schema. But placement still rejects an a_c request if there are required traits but no resource for a group [1]. So the resources key of each group is required while the \u0027required\u0027 key is optional. \n\nI will add a note explaining this.\n\n[1] https://github.com/openstack/placement/blob/8c85050960234c5bad0e76bc0cb904a73d71aeb2/placement/lib.py#L111","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":926,"context_line":"        # * a port only specifies resources and required traits"},{"line_number":927,"context_line":"        obj \u003d cls(context\u003dcontext,"},{"line_number":928,"context_line":"                  use_same_provider\u003dTrue,"},{"line_number":929,"context_line":"                  resources\u003dport_resource_request[\u0027resources\u0027],"},{"line_number":930,"context_line":"                  required_traits\u003dset(port_resource_request.get("},{"line_number":931,"context_line":"                      \u0027required\u0027, [])))"},{"line_number":932,"context_line":"        obj.obj_set_defaults()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e3aee381","line":929,"in_reply_to":"3f79a3b5_b28fd71f","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/scheduler/utils.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"42adde3dfd636f6a56bff4f7146ea3ce2f2ef5cb","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        :param request_group: the RequestGroup to be added"},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        ident \u003d max(int(ident) for ident in self._rg_by_id if ident) + 1"},{"line_number":72,"context_line":"        self._rg_by_id[ident] \u003d request_group"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _add_resource(self, groupid, rclass, amount):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_99de440f","line":71,"range":{"start_line":71,"start_character":16,"end_line":71,"end_character":72},"updated":"2018-05-14 08:14:22.000000000","message":"This fails when we are the first numbered group, right?","commit_id":"66317dbf425636c4eaea8d98166d49d1c6088361"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33679d0bf88c8677f967251678141dd31a0ad3d7","unresolved":false,"context_lines":[{"line_number":381,"context_line":"            grp \u003d res_req.get_request_group(None)"},{"line_number":382,"context_line":"            grp.member_of \u003d [list(ored.split(\u0027,\u0027))"},{"line_number":383,"context_line":"                             for ored in destination.aggregates]"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    return res_req"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_97c7ad64","side":"PARENT","line":384,"updated":"2018-05-16 15:59:30.000000000","message":"unnecessary change","commit_id":"9b6853bc2923cb167b9f36021c1b09d26f0f09fa"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3ca7ae66b908c2291df5f873358ff1bb32fbc9c9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Inserts the existing group with a unique integer id"},{"line_number":74,"context_line":"        :param request_group: the RequestGroup to be added"},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        group_idents \u003d [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":77,"context_line":"        if not group_idents:"},{"line_number":78,"context_line":"            ident \u003d 1"},{"line_number":79,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_eb1f9569","line":76,"range":{"start_line":76,"start_character":23,"end_line":76,"end_character":72},"updated":"2018-05-25 00:02:58.000000000","message":"if you do [0] + \u003cthis\u003e then you don\u0027t need the `if` branch below.","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4195a4c30eec1d019b5ed9216b551b99cd5b4bc0","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        \"\"\"Inserts the existing group with a unique integer id"},{"line_number":74,"context_line":"        :param request_group: the RequestGroup to be added"},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        group_idents \u003d [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":77,"context_line":"        if not group_idents:"},{"line_number":78,"context_line":"            ident \u003d 1"},{"line_number":79,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_8817deee","line":76,"range":{"start_line":76,"start_character":23,"end_line":76,"end_character":72},"in_reply_to":"5f7c97a3_eb1f9569","updated":"2018-05-29 15:25:33.000000000","message":"Done","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"055c37ee66bd9e02309c1d2012abdb464f07badc","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        # NOTE(gibi) [0] just here to always have a defined maximum"},{"line_number":80,"context_line":"        group_idents \u003d [0] + [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":81,"context_line":"        ident \u003d max(group_idents) + 1"},{"line_number":82,"context_line":"        self._rg_by_id[ident] \u003d request_group"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _add_resource(self, groupid, rclass, amount):"},{"line_number":85,"context_line":"        # Validate the class."}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_ed5fade1","line":82,"updated":"2018-11-06 01:48:25.000000000","message":"Forgive me if this is a dumb question, but is this just trying to add request groups with id of 0, 1, 2, 3, 4, etc? If so, why not just check the length of self._rg_by_id and use the next integer? For example:\n\n ident \u003d len(self._rg_by_id)\n self._rg_by_id[ident] \u003d request_group\n\n(later)\n\nLooks like it can\u0027t be that simple because get_request_group will add a new item to self._rg_by_id for a given ident passed in.","commit_id":"e3563e73f928938b98b89c85d953f71a0f9e4f39"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"de3408b7cff66fd20706b0e2c37c0f6955a8ce2f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        # NOTE(gibi) [0] just here to always have a defined maximum"},{"line_number":80,"context_line":"        group_idents \u003d [0] + [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":81,"context_line":"        ident \u003d max(group_idents) + 1"},{"line_number":82,"context_line":"        self._rg_by_id[ident] \u003d request_group"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _add_resource(self, groupid, rclass, amount):"},{"line_number":85,"context_line":"        # Validate the class."}],"source_content_type":"text/x-python","patch_set":32,"id":"3f79a3b5_3704ee6b","line":82,"in_reply_to":"3f79a3b5_ed5fade1","updated":"2018-11-07 11:27:21.000000000","message":"There is no such thing that dumb question. :)\n\nThis function is used to generate unique group number for \ngroups created from neutron ports. \n\nNothing guarantees that the request group IDs coming from the flavor extra_spec are in a form of 0, 1, 2, 3 ... The admin creating the flavor can add whatever integer IDs she wants (e.g. 13, 42). So this code finds the maximum from those manually defined IDs and starts adding bigger IDs than that. This way we can make sure the IDs are unique.\n\n\nI\u0027ve added this extra explanation to the doc","commit_id":"e3563e73f928938b98b89c85d953f71a0f9e4f39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self._rg_by_id[ident] \u003d rq_grp"},{"line_number":72,"context_line":"        return self._rg_by_id[ident]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def add_request_group(self, request_group):"},{"line_number":75,"context_line":"        \"\"\"Inserts the existing group with a unique integer id"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        The groups coming from the flavor can have arbitrary ids but every id"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3b6df4cd","line":74,"updated":"2018-12-17 17:49:16.000000000","message":"nit: the changes in this module could have probably also been split out if you wanted to make this overall change smaller, but it\u0027s up to you. Might be a chance to merge some code earlier than the big chunk.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"be6b2d6911d76d48ce6bd53d13ce8e03bb48888a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            self._rg_by_id[ident] \u003d rq_grp"},{"line_number":72,"context_line":"        return self._rg_by_id[ident]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def add_request_group(self, request_group):"},{"line_number":75,"context_line":"        \"\"\"Inserts the existing group with a unique integer id"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        The groups coming from the flavor can have arbitrary ids but every id"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_330c22de","line":74,"in_reply_to":"3f79a3b5_3b6df4cd","updated":"2018-12-18 15:58:13.000000000","message":"Splited out to https://review.openstack.org/#/c/625942/1","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        :param request_group: the RequestGroup to be added"},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # NOTE(gibi) [0] just here to always have a defined maximum"},{"line_number":84,"context_line":"        group_idents \u003d [0] + [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":85,"context_line":"        ident \u003d max(group_idents) + 1"},{"line_number":86,"context_line":"        self._rg_by_id[ident] \u003d request_group"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_5b7eb06c","line":84,"range":{"start_line":84,"start_character":69,"end_line":84,"end_character":77},"updated":"2018-12-17 17:49:16.000000000","message":"OK we need this check because ident can be None because of how get_request_group is used on L468.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        :param request_group: the RequestGroup to be added"},{"line_number":82,"context_line":"        \"\"\""},{"line_number":83,"context_line":"        # NOTE(gibi) [0] just here to always have a defined maximum"},{"line_number":84,"context_line":"        group_idents \u003d [0] + [int(ident) for ident in self._rg_by_id if ident]"},{"line_number":85,"context_line":"        ident \u003d max(group_idents) + 1"},{"line_number":86,"context_line":"        self._rg_by_id[ident] \u003d request_group"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_03d75ff5","line":84,"range":{"start_line":84,"start_character":69,"end_line":84,"end_character":77},"in_reply_to":"3f79a3b5_5b7eb06c","updated":"2018-12-18 11:46:41.000000000","message":"Yeah, None means the unnumbered group","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":467,"context_line":"    for rclass, amount in spec_resources.items():"},{"line_number":468,"context_line":"        res_req.get_request_group(None).resources[rclass] \u003d amount"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    for group in spec_obj.requested_resources:"},{"line_number":471,"context_line":"        res_req.add_request_group(group)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    if \u0027requested_destination\u0027 in spec_obj:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_7b2ccc93","line":470,"range":{"start_line":470,"start_character":26,"end_line":470,"end_character":45},"updated":"2018-12-17 17:49:16.000000000","message":"I think this is why you\u0027re setting this field to an empty list in all the move operations, yes? This field defaults to None but that would break here. So how about we remove the places I\u0027ve identified that you don\u0027t need to set the field because we don\u0027t care about it, and make this code more robust:\n\nrequested_resources \u003d spec_obj.requested_resources \\\n                      if \u0027requested_resources\u0027 in spec_obj \\\n                      and spec_obj.requested_resources else []","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":467,"context_line":"    for rclass, amount in spec_resources.items():"},{"line_number":468,"context_line":"        res_req.get_request_group(None).resources[rclass] \u003d amount"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    for group in spec_obj.requested_resources:"},{"line_number":471,"context_line":"        res_req.add_request_group(group)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    if \u0027requested_destination\u0027 in spec_obj:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_d2f93381","line":470,"range":{"start_line":470,"start_character":26,"end_line":470,"end_character":45},"in_reply_to":"3f79a3b5_7b2ccc93","updated":"2018-12-18 09:31:13.000000000","message":"I made requested_resource None to detect when the code needs it (by let the code blow up here). This led the the TODOs in the code for unshelve, resize, live migrate. Now that I have the TODOs added I can ignore None here and remove some unnecessary changes in the places you noted.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/tests/fixtures.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3ca7ae66b908c2291df5f873358ff1bb32fbc9c9","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1151,"context_line":"        \u0027resource_request\u0027: {"},{"line_number":1152,"context_line":"            \"resources\": {"},{"line_number":1153,"context_line":"                    \"CUSTOM_NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\": 1000,"},{"line_number":1154,"context_line":"                    \"CUSTOM_NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\": 1000},"},{"line_number":1155,"context_line":"            \"required\": [\"CUSTOM_PHYSNET_2\", \"CUSTOM_VNIC_TYPE_NORMAL\"]"},{"line_number":1156,"context_line":"        }"},{"line_number":1157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_aea68b0e","line":1154,"range":{"start_line":1153,"start_character":0,"end_line":1154,"end_character":77},"updated":"2018-05-25 00:02:58.000000000","message":"I thought we were standardizing these.  At least for now, resource classes live in this project, so we should propose that change (earlier) in this series.","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4195a4c30eec1d019b5ed9216b551b99cd5b4bc0","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1151,"context_line":"        \u0027resource_request\u0027: {"},{"line_number":1152,"context_line":"            \"resources\": {"},{"line_number":1153,"context_line":"                    \"CUSTOM_NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\": 1000,"},{"line_number":1154,"context_line":"                    \"CUSTOM_NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\": 1000},"},{"line_number":1155,"context_line":"            \"required\": [\"CUSTOM_PHYSNET_2\", \"CUSTOM_VNIC_TYPE_NORMAL\"]"},{"line_number":1156,"context_line":"        }"},{"line_number":1157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_e8e3f203","line":1154,"range":{"start_line":1153,"start_character":0,"end_line":1154,"end_character":77},"in_reply_to":"5f7c97a3_aea68b0e","updated":"2018-05-29 15:25:33.000000000","message":"Added a separate patch for the standard classes. Done.","commit_id":"0924b5ea3eb98693c86ab3677ffa2c7e6db91b2d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1151,"context_line":"        \u0027resource_request\u0027: {"},{"line_number":1152,"context_line":"            \"resources\": {"},{"line_number":1153,"context_line":"                    \"NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\": 1000,"},{"line_number":1154,"context_line":"                    \"NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\": 1000},"},{"line_number":1155,"context_line":"            \"required\": [\"CUSTOM_PHYSNET_2\", \"CUSTOM_VNIC_TYPE_NORMAL\"]"},{"line_number":1156,"context_line":"        }"},{"line_number":1157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_ce6fd55d","line":1154,"range":{"start_line":1153,"start_character":20,"end_line":1154,"end_character":62},"updated":"2018-06-01 20:57:54.000000000","message":"nit: These could use the symbols instead.","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1151,"context_line":"        \u0027resource_request\u0027: {"},{"line_number":1152,"context_line":"            \"resources\": {"},{"line_number":1153,"context_line":"                    \"NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\": 1000,"},{"line_number":1154,"context_line":"                    \"NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\": 1000},"},{"line_number":1155,"context_line":"            \"required\": [\"CUSTOM_PHYSNET_2\", \"CUSTOM_VNIC_TYPE_NORMAL\"]"},{"line_number":1156,"context_line":"        }"},{"line_number":1157,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_a0933c00","line":1154,"range":{"start_line":1153,"start_character":20,"end_line":1154,"end_character":62},"in_reply_to":"5f7c97a3_ce6fd55d","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1170,"context_line":"        \u0027id\u0027: \u00273cb9bc59-5699-4588-a4b1-b87f96708bc6\u0027,"},{"line_number":1171,"context_line":"        \u0027shared\u0027: False,"},{"line_number":1172,"context_line":"        \u0027provider:physical_network\u0027: \u0027physnet0\u0027,"},{"line_number":1173,"context_line":"    }"},{"line_number":1174,"context_line":"    subnet_1 \u003d {"},{"line_number":1175,"context_line":"        \u0027name\u0027: \u0027private-subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fb377cad","line":1172,"updated":"2018-12-17 17:49:16.000000000","message":"Why is this needed? I guess it\u0027s to model the QoS plugin which if there isn\u0027t a physnet we wouldn\u0027t have anything in resource_request?\n\nhttps://review.openstack.org/#/c/590363/27/neutron/services/qos/qos_plugin.py@120","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1170,"context_line":"        \u0027id\u0027: \u00273cb9bc59-5699-4588-a4b1-b87f96708bc6\u0027,"},{"line_number":1171,"context_line":"        \u0027shared\u0027: False,"},{"line_number":1172,"context_line":"        \u0027provider:physical_network\u0027: \u0027physnet0\u0027,"},{"line_number":1173,"context_line":"    }"},{"line_number":1174,"context_line":"    subnet_1 \u003d {"},{"line_number":1175,"context_line":"        \u0027name\u0027: \u0027private-subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e3bd8380","line":1172,"in_reply_to":"3f79a3b5_3218a7cc","updated":"2018-12-18 11:46:41.000000000","message":"It seems it is unnecessary for our purpose. I guess I added it why troubleshooted the neutronv2/api code where this is read.\n\nRemoved.\nDone.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"        \u0027tenant_id\u0027: tenant_id,"},{"line_number":1170,"context_line":"        \u0027id\u0027: \u00273cb9bc59-5699-4588-a4b1-b87f96708bc6\u0027,"},{"line_number":1171,"context_line":"        \u0027shared\u0027: False,"},{"line_number":1172,"context_line":"        \u0027provider:physical_network\u0027: \u0027physnet0\u0027,"},{"line_number":1173,"context_line":"    }"},{"line_number":1174,"context_line":"    subnet_1 \u003d {"},{"line_number":1175,"context_line":"        \u0027name\u0027: \u0027private-subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3218a7cc","line":1172,"in_reply_to":"3f79a3b5_fb377cad","updated":"2018-12-18 09:31:13.000000000","message":"Let me check this by running the code without it.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/tests/functional/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def get(self, url, **kwargs):"},{"line_number":30,"context_line":"        return client.APIResponse(self.fixture._fake_get(None, url, **kwargs))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def put(self, url, body\u003dNone, **kwargs):"},{"line_number":33,"context_line":"        return client.APIResponse("},{"line_number":34,"context_line":"            self.fixture._fake_put(None, url, body, **kwargs))"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_fbd3fc34","line":32,"updated":"2018-12-17 17:49:16.000000000","message":"Is this change necessary if you just use self._create_trait()?","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def get(self, url, **kwargs):"},{"line_number":30,"context_line":"        return client.APIResponse(self.fixture._fake_get(None, url, **kwargs))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def put(self, url, body\u003dNone, **kwargs):"},{"line_number":33,"context_line":"        return client.APIResponse("},{"line_number":34,"context_line":"            self.fixture._fake_put(None, url, body, **kwargs))"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_23db7beb","line":32,"in_reply_to":"3f79a3b5_b27917fb","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def get(self, url, **kwargs):"},{"line_number":30,"context_line":"        return client.APIResponse(self.fixture._fake_get(None, url, **kwargs))"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def put(self, url, body\u003dNone, **kwargs):"},{"line_number":33,"context_line":"        return client.APIResponse("},{"line_number":34,"context_line":"            self.fixture._fake_put(None, url, body, **kwargs))"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_b27917fb","line":32,"in_reply_to":"3f79a3b5_fbd3fc34","updated":"2018-12-18 09:31:13.000000000","message":"Good point. Using _create_trait helper is better.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        super(ProviderUsageBaseTestCase, self).setUp()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        self.useFixture(policy_fixture.RealPolicyFixture())"},{"line_number":370,"context_line":"        self.neutron \u003d nova_fixtures.NeutronFixture(self)"},{"line_number":371,"context_line":"        self.useFixture(self.neutron)"},{"line_number":372,"context_line":"        self.useFixture(nova_fixtures.AllServicesCurrent())"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        fake_notifier.stub_notifier(self)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3bfc14bb","line":371,"range":{"start_line":370,"start_character":8,"end_line":371,"end_character":37},"updated":"2018-12-17 17:49:16.000000000","message":"Can\u0027t this just be:\n\nself.neutron \u003d self.useFixture(nova_fixtures.NeutronFixture(self))","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":367,"context_line":"        super(ProviderUsageBaseTestCase, self).setUp()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        self.useFixture(policy_fixture.RealPolicyFixture())"},{"line_number":370,"context_line":"        self.neutron \u003d nova_fixtures.NeutronFixture(self)"},{"line_number":371,"context_line":"        self.useFixture(self.neutron)"},{"line_number":372,"context_line":"        self.useFixture(nova_fixtures.AllServicesCurrent())"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        fake_notifier.stub_notifier(self)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e342636a","line":371,"range":{"start_line":370,"start_character":8,"end_line":371,"end_character":37},"in_reply_to":"3f79a3b5_3bfc14bb","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4820c3b5c391dc2a18e0b5246d8ae5077074cb60","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_5f0d1c31","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":58},"updated":"2018-12-18 21:22:09.000000000","message":"nit: document this in the docstring","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b84f77afbdd8de73bcb53c3d50481d63f4507d","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_a7c77766","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":58},"in_reply_to":"3f79a3b5_5f0d1c31","updated":"2018-12-19 15:50:04.000000000","message":"Done","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_fa118653","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":65},"updated":"2019-01-28 19:20:27.000000000","message":"I\u0027m not sure what 1.20 has to do with this.","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_644a7084","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":65},"in_reply_to":"9fdfeff1_3bdb6c7c","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4fda0c8447836211aac63050d48a8188ddc22952","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_3bdb6c7c","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":65},"in_reply_to":"9fdfeff1_fa118653","updated":"2019-01-30 16:26:17.000000000","message":"Me neither any more :)","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5680fd315b3e2b01b0bba9887dd213d10e410722","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_da7c1e74","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":65},"updated":"2019-02-07 00:25:07.000000000","message":"I was going to ask, \"what is this for? it doesn\u0027t seem to be needed\" and now I see it\u0027s addressed (removed) in the followup patch.","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a3b9a0309b9589377708351e363c3a522c6e33e7","unresolved":false,"context_lines":[{"line_number":488,"context_line":"            url\u003d (\u0027/resource_providers/%s/inventories\u0027 % rp_uuid),"},{"line_number":489,"context_line":"            version\u003d\u00271.15\u0027, body\u003dinv_body).body"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _update_inventory(self, rp_uuid, inv_body, version\u003d\u00271.20\u0027):"},{"line_number":492,"context_line":"        \"\"\"This will update the inventory for a given resource provider."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_cb445277","line":491,"range":{"start_line":491,"start_character":51,"end_line":491,"end_character":65},"in_reply_to":"9fdfeff1_da7c1e74","updated":"2019-02-07 07:14:25.000000000","message":"Yes. I don\u0027t remember why I added it in the first place, and the FUP removes it without any problem.","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"}],"nova/tests/functional/test_servers.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":4083,"context_line":""},{"line_number":4084,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":4085,"context_line":""},{"line_number":4086,"context_line":"    NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND \u003d ("},{"line_number":4087,"context_line":"        \u0027NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\u0027)"},{"line_number":4088,"context_line":"    NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND \u003d ("},{"line_number":4089,"context_line":"        \u0027NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\u0027)"},{"line_number":4090,"context_line":"    CUSTOM_VNIC_TYPE_NORMAL \u003d \u0027CUSTOM_VNIC_TYPE_NORMAL\u0027"},{"line_number":4091,"context_line":"    CUSTOM_PHYSNET_2 \u003d \u0027CUSTOM_PHYSNET_2\u0027"},{"line_number":4092,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_6eb9e1c9","line":4089,"range":{"start_line":4086,"start_character":4,"end_line":4089,"end_character":51},"updated":"2018-06-01 20:57:54.000000000","message":"Nix these...","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":4083,"context_line":""},{"line_number":4084,"context_line":"    compute_driver \u003d \u0027fake.SmallFakeDriver\u0027"},{"line_number":4085,"context_line":""},{"line_number":4086,"context_line":"    NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND \u003d ("},{"line_number":4087,"context_line":"        \u0027NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND\u0027)"},{"line_number":4088,"context_line":"    NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND \u003d ("},{"line_number":4089,"context_line":"        \u0027NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND\u0027)"},{"line_number":4090,"context_line":"    CUSTOM_VNIC_TYPE_NORMAL \u003d \u0027CUSTOM_VNIC_TYPE_NORMAL\u0027"},{"line_number":4091,"context_line":"    CUSTOM_PHYSNET_2 \u003d \u0027CUSTOM_PHYSNET_2\u0027"},{"line_number":4092,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_a0bc9c6c","line":4089,"range":{"start_line":4086,"start_character":4,"end_line":4089,"end_character":51},"in_reply_to":"5f7c97a3_6eb9e1c9","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7acb84ad4b5150f3b977787f9d41ce31a66a8ed0","unresolved":false,"context_lines":[{"line_number":4137,"context_line":"        self._set_provider_inventories("},{"line_number":4138,"context_line":"            uuids.ovs_bridge_rp_uuid,"},{"line_number":4139,"context_line":"            {\"inventories\": {"},{"line_number":4140,"context_line":"                self.NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND:"},{"line_number":4141,"context_line":"                    {\"total\": 10000},"},{"line_number":4142,"context_line":"                self.NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND:"},{"line_number":4143,"context_line":"                    {\"total\": 10000},"},{"line_number":4144,"context_line":"            }})"},{"line_number":4145,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_2eaf697d","line":4142,"range":{"start_line":4140,"start_character":16,"end_line":4142,"end_character":62},"updated":"2018-06-01 20:57:54.000000000","message":"...and just use the ResourceClass.* symbols here instead.","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3b0c2e8c6c98ccb2ed49dbb2cc648eaef650c499","unresolved":false,"context_lines":[{"line_number":4137,"context_line":"        self._set_provider_inventories("},{"line_number":4138,"context_line":"            uuids.ovs_bridge_rp_uuid,"},{"line_number":4139,"context_line":"            {\"inventories\": {"},{"line_number":4140,"context_line":"                self.NET_BANDWIDTH_INGRESS_KILOBITS_PER_SECOND:"},{"line_number":4141,"context_line":"                    {\"total\": 10000},"},{"line_number":4142,"context_line":"                self.NET_BANDWIDTH_EGRESS_KILOBITS_PER_SECOND:"},{"line_number":4143,"context_line":"                    {\"total\": 10000},"},{"line_number":4144,"context_line":"            }})"},{"line_number":4145,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_c0bf585e","line":4142,"range":{"start_line":4140,"start_character":16,"end_line":4142,"end_character":62},"in_reply_to":"5f7c97a3_2eaf697d","updated":"2018-06-06 14:28:10.000000000","message":"Done","commit_id":"3819a7767573c38084dea0f593e96debe1d17481"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"62ded4db3f7ded365df3f0632dd4171c2416bf9d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":"import uuid"},{"line_number":19,"context_line":"import zlib"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_ffc33305","line":18,"range":{"start_line":18,"start_character":7,"end_line":18,"end_character":11},"updated":"2018-06-15 22:44:31.000000000","message":"see below - if you can use sentinels, this goes away, which resolves the last of the three pep failures.","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"62ded4db3f7ded365df3f0632dd4171c2416bf9d","unresolved":false,"context_lines":[{"line_number":3892,"context_line":""},{"line_number":3893,"context_line":"    def _create_networking_rp_tree(self, compute_rp_uuid):"},{"line_number":3894,"context_line":"        # let\u0027s simulate what the neutron ovs agent would do"},{"line_number":3895,"context_line":"        ovs_agent_rp_uuid \u003d str(uuid.uuid4())"},{"line_number":3896,"context_line":"        agent_rp_req \u003d {"},{"line_number":3897,"context_line":"            \"name\": ovs_agent_rp_uuid,"},{"line_number":3898,"context_line":"            \"uuid\": ovs_agent_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_7f52c36a","line":3895,"range":{"start_line":3895,"start_character":32,"end_line":3895,"end_character":44},"updated":"2018-06-15 22:44:31.000000000","message":"pep hates you for this.  Why can\u0027t you use a sentinel?","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0cefade5394a711a3e2d10258307b8af588689ab","unresolved":false,"context_lines":[{"line_number":3892,"context_line":""},{"line_number":3893,"context_line":"    def _create_networking_rp_tree(self, compute_rp_uuid):"},{"line_number":3894,"context_line":"        # let\u0027s simulate what the neutron ovs agent would do"},{"line_number":3895,"context_line":"        ovs_agent_rp_uuid \u003d str(uuid.uuid4())"},{"line_number":3896,"context_line":"        agent_rp_req \u003d {"},{"line_number":3897,"context_line":"            \"name\": ovs_agent_rp_uuid,"},{"line_number":3898,"context_line":"            \"uuid\": ovs_agent_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_f3a46209","line":3895,"range":{"start_line":3895,"start_character":32,"end_line":3895,"end_character":44},"in_reply_to":"5f7c97a3_69487bb2","updated":"2018-06-21 14:09:04.000000000","message":"Done","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0d2201973239be8b0ac61fd64932150c120ea790","unresolved":false,"context_lines":[{"line_number":3892,"context_line":""},{"line_number":3893,"context_line":"    def _create_networking_rp_tree(self, compute_rp_uuid):"},{"line_number":3894,"context_line":"        # let\u0027s simulate what the neutron ovs agent would do"},{"line_number":3895,"context_line":"        ovs_agent_rp_uuid \u003d str(uuid.uuid4())"},{"line_number":3896,"context_line":"        agent_rp_req \u003d {"},{"line_number":3897,"context_line":"            \"name\": ovs_agent_rp_uuid,"},{"line_number":3898,"context_line":"            \"uuid\": ovs_agent_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_69487bb2","line":3895,"range":{"start_line":3895,"start_character":32,"end_line":3895,"end_character":44},"in_reply_to":"5f7c97a3_7f52c36a","updated":"2018-06-20 13:53:24.000000000","message":"I cannot use sentinel right here as _create_networking_rp_tree needs to be called for mutliple computes and for each compute it needs to generate unique uuids for the RPs. \n\nI can solve this in many ways like get(uuidsentinel, \u0027compute_rp_uuid\u0027 + ovs_agent) or by pre-creating the uuid sentinels at the caller side of _create_networking_rp_tree()  and passing in the resulting uuid.\n\nAnyhow I will do something :) (I have bigger problems with the cells v1 test result hence the test_boot_reschedule_success case addition...)","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"62ded4db3f7ded365df3f0632dd4171c2416bf9d","unresolved":false,"context_lines":[{"line_number":3901,"context_line":"        self.placement_api.post(\u0027/resource_providers\u0027,"},{"line_number":3902,"context_line":"                                body\u003dagent_rp_req,"},{"line_number":3903,"context_line":"                                version\u003d\u00271.20\u0027)"},{"line_number":3904,"context_line":"        ovs_bridge_rp_uuid \u003d str(uuid.uuid4())"},{"line_number":3905,"context_line":"        ovs_bridge_req \u003d {"},{"line_number":3906,"context_line":"            \"name\": ovs_bridge_rp_uuid,"},{"line_number":3907,"context_line":"            \"uuid\": ovs_bridge_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_3f4c4bc7","line":3904,"range":{"start_line":3904,"start_character":33,"end_line":3904,"end_character":45},"updated":"2018-06-15 22:44:31.000000000","message":"ditto","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0cefade5394a711a3e2d10258307b8af588689ab","unresolved":false,"context_lines":[{"line_number":3901,"context_line":"        self.placement_api.post(\u0027/resource_providers\u0027,"},{"line_number":3902,"context_line":"                                body\u003dagent_rp_req,"},{"line_number":3903,"context_line":"                                version\u003d\u00271.20\u0027)"},{"line_number":3904,"context_line":"        ovs_bridge_rp_uuid \u003d str(uuid.uuid4())"},{"line_number":3905,"context_line":"        ovs_bridge_req \u003d {"},{"line_number":3906,"context_line":"            \"name\": ovs_bridge_rp_uuid,"},{"line_number":3907,"context_line":"            \"uuid\": ovs_bridge_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_93adeeeb","line":3904,"range":{"start_line":3904,"start_character":33,"end_line":3904,"end_character":45},"in_reply_to":"5f7c97a3_3f4c4bc7","updated":"2018-06-21 14:09:04.000000000","message":"Done","commit_id":"11cafe615d0e62ddd510baaa9e8b0457ae3a868d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b90b7ae3a3b64b3915642d2c7c8609d0540f9dc8","unresolved":false,"context_lines":[{"line_number":3893,"context_line":"        # let\u0027s simulate what the neutron ovs agent would do"},{"line_number":3894,"context_line":""},{"line_number":3895,"context_line":"        # we need uuid sentinel for the test to make pep8 happy but we need a"},{"line_number":3896,"context_line":"        # unique one per compute so here is some ugliness"},{"line_number":3897,"context_line":"        ovs_agent_rp_uuid \u003d getattr(uuids, compute_rp_uuid + \u0027ovs agent\u0027)"},{"line_number":3898,"context_line":"        agent_rp_req \u003d {"},{"line_number":3899,"context_line":"            \"name\": ovs_agent_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5f7c97a3_9c6bbb1d","line":3896,"range":{"start_line":3896,"start_character":49,"end_line":3896,"end_character":57},"updated":"2018-06-21 16:19:54.000000000","message":"In the eye of the beholder, I suppose.  I am entirely unoffended by this.","commit_id":"dcef1593186026cc43f461b546dbcf13fcca41e2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5371,"context_line":""},{"line_number":5372,"context_line":"        self._create_networking_rp_tree(self.compute1_rp_uuid)"},{"line_number":5373,"context_line":""},{"line_number":5374,"context_line":"    def _set_provider_inventories(self, rp_uuid, inventories):"},{"line_number":5375,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5376,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5377,"context_line":"        inventories[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_bb74a439","line":5374,"range":{"start_line":5374,"start_character":8,"end_line":5374,"end_character":33},"updated":"2018-12-17 17:49:16.000000000","message":"We also have self._update_inventory() but it doesn\u0027t deal with generations, so I guess this is OK. Or you could just update the _update_inventory method.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":5371,"context_line":""},{"line_number":5372,"context_line":"        self._create_networking_rp_tree(self.compute1_rp_uuid)"},{"line_number":5373,"context_line":""},{"line_number":5374,"context_line":"    def _set_provider_inventories(self, rp_uuid, inventories):"},{"line_number":5375,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5376,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5377,"context_line":"        inventories[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_f258ef8c","line":5374,"range":{"start_line":5374,"start_character":8,"end_line":5374,"end_character":33},"in_reply_to":"3f79a3b5_bb74a439","updated":"2018-12-18 09:31:13.000000000","message":"Good point, lets\u0027 enhance the helper","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":5371,"context_line":""},{"line_number":5372,"context_line":"        self._create_networking_rp_tree(self.compute1_rp_uuid)"},{"line_number":5373,"context_line":""},{"line_number":5374,"context_line":"    def _set_provider_inventories(self, rp_uuid, inventories):"},{"line_number":5375,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5376,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5377,"context_line":"        inventories[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_9e3744af","line":5374,"range":{"start_line":5374,"start_character":8,"end_line":5374,"end_character":33},"in_reply_to":"3f79a3b5_f258ef8c","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5379,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 %"},{"line_number":5380,"context_line":"            rp_uuid, inventories, version\u003d\u00271.20\u0027).body"},{"line_number":5381,"context_line":""},{"line_number":5382,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":5383,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5384,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5385,"context_line":"        traits[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3b98947a","line":5382,"range":{"start_line":5382,"start_character":8,"end_line":5382,"end_character":28},"updated":"2018-12-17 17:49:16.000000000","message":"This is already in ProviderUsageBaseTestCase so can we just use that?","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":5379,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 %"},{"line_number":5380,"context_line":"            rp_uuid, inventories, version\u003d\u00271.20\u0027).body"},{"line_number":5381,"context_line":""},{"line_number":5382,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":5383,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5384,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5385,"context_line":"        traits[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_b2527769","line":5382,"range":{"start_line":5382,"start_character":8,"end_line":5382,"end_character":28},"in_reply_to":"3f79a3b5_3b98947a","updated":"2018-12-18 09:31:13.000000000","message":"Good point","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":5379,"context_line":"            \u0027/resource_providers/%s/inventories\u0027 %"},{"line_number":5380,"context_line":"            rp_uuid, inventories, version\u003d\u00271.20\u0027).body"},{"line_number":5381,"context_line":""},{"line_number":5382,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":5383,"context_line":"        rp \u003d self.placement_api.get("},{"line_number":5384,"context_line":"            \u0027/resource_providers/%s\u0027 % rp_uuid).body"},{"line_number":5385,"context_line":"        traits[\u0027resource_provider_generation\u0027] \u003d rp[\u0027generation\u0027]"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_9e8f4420","line":5382,"range":{"start_line":5382,"start_character":8,"end_line":5382,"end_character":28},"in_reply_to":"3f79a3b5_b2527769","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5421,"context_line":"                    {\"total\": 10000},"},{"line_number":5422,"context_line":"            }})"},{"line_number":5423,"context_line":""},{"line_number":5424,"context_line":"        self.placement_api.put("},{"line_number":5425,"context_line":"            \u0027/traits/\u0027 +"},{"line_number":5426,"context_line":"            self.CUSTOM_VNIC_TYPE_NORMAL,"},{"line_number":5427,"context_line":"            version\u003d\u00271.20\u0027)"},{"line_number":5428,"context_line":""},{"line_number":5429,"context_line":"        self.placement_api.put("},{"line_number":5430,"context_line":"            \u0027/traits/\u0027 +"},{"line_number":5431,"context_line":"            self.CUSTOM_PHYSNET_2,"},{"line_number":5432,"context_line":"            version\u003d\u00271.20\u0027)"},{"line_number":5433,"context_line":""},{"line_number":5434,"context_line":"        self._set_provider_traits("},{"line_number":5435,"context_line":"            ovs_bridge_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3bcad47a","line":5432,"range":{"start_line":5424,"start_character":8,"end_line":5432,"end_character":27},"updated":"2018-12-17 17:49:16.000000000","message":"Why not just use the self._create_trait method for these?","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":5421,"context_line":"                    {\"total\": 10000},"},{"line_number":5422,"context_line":"            }})"},{"line_number":5423,"context_line":""},{"line_number":5424,"context_line":"        self.placement_api.put("},{"line_number":5425,"context_line":"            \u0027/traits/\u0027 +"},{"line_number":5426,"context_line":"            self.CUSTOM_VNIC_TYPE_NORMAL,"},{"line_number":5427,"context_line":"            version\u003d\u00271.20\u0027)"},{"line_number":5428,"context_line":""},{"line_number":5429,"context_line":"        self.placement_api.put("},{"line_number":5430,"context_line":"            \u0027/traits/\u0027 +"},{"line_number":5431,"context_line":"            self.CUSTOM_PHYSNET_2,"},{"line_number":5432,"context_line":"            version\u003d\u00271.20\u0027)"},{"line_number":5433,"context_line":""},{"line_number":5434,"context_line":"        self._set_provider_traits("},{"line_number":5435,"context_line":"            ovs_bridge_rp_uuid,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_be1b206c","line":5432,"range":{"start_line":5424,"start_character":8,"end_line":5432,"end_character":27},"in_reply_to":"3f79a3b5_3bcad47a","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5473,"context_line":"        network_allocations \u003d allocations["},{"line_number":5474,"context_line":"            self.ovs_bridge_rp_per_host[self.compute1_rp_uuid]][\u0027resources\u0027]"},{"line_number":5475,"context_line":""},{"line_number":5476,"context_line":"        self.assertEqual(self._resources_from_flavor(self.flavor),"},{"line_number":5477,"context_line":"                         compute_allocations)"},{"line_number":5478,"context_line":"        self.assertPortMatchesAllocation(port, network_allocations)"},{"line_number":5479,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_7bd12cf9","line":5476,"updated":"2018-12-17 17:49:16.000000000","message":"I guess we can\u0027t use self.assertFlavorMatchesAllocation here because that method assumes all of the allocations are on the single root compute node provider. Got it.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":5473,"context_line":"        network_allocations \u003d allocations["},{"line_number":5474,"context_line":"            self.ovs_bridge_rp_per_host[self.compute1_rp_uuid]][\u0027resources\u0027]"},{"line_number":5475,"context_line":""},{"line_number":5476,"context_line":"        self.assertEqual(self._resources_from_flavor(self.flavor),"},{"line_number":5477,"context_line":"                         compute_allocations)"},{"line_number":5478,"context_line":"        self.assertPortMatchesAllocation(port, network_allocations)"},{"line_number":5479,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_328987c7","line":5476,"in_reply_to":"3f79a3b5_7bd12cf9","updated":"2018-12-18 09:31:13.000000000","message":"I think assertFlavorMatchesAllocation handles nested but by flattening the allocation. Here I would like to explicitly check the compute part and the network part of the allocation structure hence the two separate asserts.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5483,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5484,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5485,"context_line":""},{"line_number":5486,"context_line":"    def test_boot_server_with_two_ports_one_having_resource_request(self):"},{"line_number":5487,"context_line":"        non_qos_port \u003d self.neutron.port_1"},{"line_number":5488,"context_line":"        qos_port \u003d self.neutron.port_with_resource_request"},{"line_number":5489,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_9be528d2","line":5486,"range":{"start_line":5486,"start_character":8,"end_line":5486,"end_character":67},"updated":"2018-12-17 17:49:16.000000000","message":"This seems a bit redundant, it\u0027s just a superset of the test coverage from the previous test. You could just merge these two tests I would think. The point is the allocations are the same and nothing comes from non_qos_port.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":5483,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5484,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5485,"context_line":""},{"line_number":5486,"context_line":"    def test_boot_server_with_two_ports_one_having_resource_request(self):"},{"line_number":5487,"context_line":"        non_qos_port \u003d self.neutron.port_1"},{"line_number":5488,"context_line":"        qos_port \u003d self.neutron.port_with_resource_request"},{"line_number":5489,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_9ef66492","line":5486,"range":{"start_line":5486,"start_character":8,"end_line":5486,"end_character":67},"in_reply_to":"3f79a3b5_32a2e741","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":5483,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5484,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5485,"context_line":""},{"line_number":5486,"context_line":"    def test_boot_server_with_two_ports_one_having_resource_request(self):"},{"line_number":5487,"context_line":"        non_qos_port \u003d self.neutron.port_1"},{"line_number":5488,"context_line":"        qos_port \u003d self.neutron.port_with_resource_request"},{"line_number":5489,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_32a2e741","line":5486,"range":{"start_line":5486,"start_character":8,"end_line":5486,"end_character":67},"in_reply_to":"3f79a3b5_9be528d2","updated":"2018-12-18 09:31:13.000000000","message":"Good point.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a72735d584af6800684e2153fbe486e83972fef0","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_db4720a5","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"updated":"2018-12-17 17:49:16.000000000","message":"Hmm, I think this is missing something. The scheduler is going to claim port resources on the first host selected, right? The FakeRescheduleDriver driver will fail the spawn() call on the first host and reschedule to the other alternate host. You\u0027re asserting the port allocations are on the host the server ultimately ends up on, but I\u0027m not sure how that\u0027s working since there is nothing in the conductor (or compute) code as of this change that is allocating the port resources on the alternate host, right? In addition, the test isn\u0027t asserting that the allocations created by the scheduler on the first host are properly cleaned up as part of the reschedule. In other words, I\u0027d expect a wrinkle in this test to assert that the *other* resource provider that is not dest_compute_rp_uuid has no allocations in its tree after the server is ACTIVE but before the server is deleted.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a0cf4a095fe0dcf44434ea9f35a20ea010a442c0","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_3250a72d","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"in_reply_to":"3f79a3b5_1b3598f5","updated":"2018-12-18 09:31:13.000000000","message":"You are right, Selection object are smart enough to transparently handle new resource (even nested) in the alternate allocations.\n\nI will add the extra assert about the cleaned up allocaton on the failed host.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1d972c9ce05b4524dcc487b8d63a5f4a1ad33afb","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_e424aab3","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"in_reply_to":"3f79a3b5_3250a72d","updated":"2018-12-18 11:46:41.000000000","message":"Done","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77a9d3c5a0c251b36248d57efe82ea5a27b14a5f","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_d82e2d5a","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"in_reply_to":"3f79a3b5_3250a72d","updated":"2018-12-18 14:57:17.000000000","message":"In looking at the compute manager code again I remember that we cleanup allocations for the instance *before* rescheduling back to the cell conductor:\n\nhttps://github.com/openstack/nova/blob/5d748001c2ffb1197ff991ca69a95865087f1010/nova/compute/manager.py#L1850\n\nThat\u0027s what would remove the allocations from the source host\u0027s provider tree. Then the cell conductor will use the allocation request in the Selection object from the host_lists list of alternates and claim those before trying to build on the next host:\n\nhttps://github.com/openstack/nova/blob/5d748001c2ffb1197ff991ca69a95865087f1010/nova/conductor/manager.py#L656","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"19f8d895caa78f8b3680b8c6e7fe081d3b18a8b2","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_13b9e6c4","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"in_reply_to":"3f79a3b5_d82e2d5a","updated":"2018-12-18 16:04:22.000000000","message":"Yes, that is what happens. It works as we fixed the cleanup of nested allocation handling in https://review.openstack.org/#/c/606050/","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0ef6cac69f43c8fb67933279e01f33e593650e92","unresolved":false,"context_lines":[{"line_number":5524,"context_line":"        self.compute2_rp_uuid \u003d self._get_provider_uuid_by_host(\u0027host2\u0027)"},{"line_number":5525,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5526,"context_line":""},{"line_number":5527,"context_line":"    def test_boot_reschedule_success(self):"},{"line_number":5528,"context_line":"        port \u003d self.neutron.port_with_resource_request"},{"line_number":5529,"context_line":""},{"line_number":5530,"context_line":"        server \u003d self._create_server(networks\u003d[{\u0027port\u0027: port[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3f79a3b5_1b3598f5","line":5527,"range":{"start_line":5527,"start_character":8,"end_line":5527,"end_character":36},"in_reply_to":"3f79a3b5_db4720a5","updated":"2018-12-17 17:56:36.000000000","message":"\u003e but I\u0027m not sure how that\u0027s working since there is nothing in the conductor (or compute) code as of this change that is allocating the port resources on the alternate host, right?\n\nOK I think I at least figured out how the allocations are getting to the alternate host - the Selection objects returned from the scheduler have the allocation requests in them, which are then used in conductor to claim those resources on the alternate:\n\nhttps://review.openstack.org/#/c/567268/36/nova/conductor/manager.py@661\n\nWe should still have an assertion that there are no allocations on the failed host RP tree.","commit_id":"4d795c54d8363d6c7cd23da307dce77879e8e79b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4820c3b5c391dc2a18e0b5246d8ae5077074cb60","unresolved":false,"context_lines":[{"line_number":5508,"context_line":"                         compute_allocations)"},{"line_number":5509,"context_line":"        self.assertPortMatchesAllocation(port, network_allocations)"},{"line_number":5510,"context_line":""},{"line_number":5511,"context_line":"        # assert that the host where the spawn failed are cleaned up properly"},{"line_number":5512,"context_line":"        self.assertEqual("},{"line_number":5513,"context_line":"            {\u0027VCPU\u0027: 0, \u0027MEMORY_MB\u0027: 0, \u0027DISK_GB\u0027: 0},"},{"line_number":5514,"context_line":"            self._get_provider_usages(failed_compute_rp))"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_7f3818cb","line":5511,"updated":"2018-12-18 21:22:09.000000000","message":"nit: seems like this comment is missing the word \"allocations\" somewhere?\n\n\"assert that the allocations against the host where the spawn failed are cleaned up properly\"?","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"61b84f77afbdd8de73bcb53c3d50481d63f4507d","unresolved":false,"context_lines":[{"line_number":5508,"context_line":"                         compute_allocations)"},{"line_number":5509,"context_line":"        self.assertPortMatchesAllocation(port, network_allocations)"},{"line_number":5510,"context_line":""},{"line_number":5511,"context_line":"        # assert that the host where the spawn failed are cleaned up properly"},{"line_number":5512,"context_line":"        self.assertEqual("},{"line_number":5513,"context_line":"            {\u0027VCPU\u0027: 0, \u0027MEMORY_MB\u0027: 0, \u0027DISK_GB\u0027: 0},"},{"line_number":5514,"context_line":"            self._get_provider_usages(failed_compute_rp))"}],"source_content_type":"text/x-python","patch_set":39,"id":"3f79a3b5_27828703","line":5511,"in_reply_to":"3f79a3b5_7f3818cb","updated":"2018-12-19 15:50:04.000000000","message":"Done","commit_id":"835f63f1d876ea8a380f6b57913d3493e35e44db"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5694,"context_line":"        self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":5695,"context_line":""},{"line_number":5696,"context_line":""},{"line_number":5697,"context_line":"class PortResourceRequestBasedSchedulingTestIgnoreMicroversionCheck("},{"line_number":5698,"context_line":"    PortResourceRequestBasedSchedulingTestBase):"},{"line_number":5699,"context_line":""},{"line_number":5700,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_9a615ad6","line":5697,"range":{"start_line":5697,"start_character":6,"end_line":5697,"end_character":67},"updated":"2019-01-28 19:20:27.000000000","message":"nit: docstring for this could be nice to differentiate it from PortResourceRequestBasedSchedulingTest above.","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5694,"context_line":"        self._wait_for_state_change(self.admin_api, server, \u0027ACTIVE\u0027)"},{"line_number":5695,"context_line":""},{"line_number":5696,"context_line":""},{"line_number":5697,"context_line":"class PortResourceRequestBasedSchedulingTestIgnoreMicroversionCheck("},{"line_number":5698,"context_line":"    PortResourceRequestBasedSchedulingTestBase):"},{"line_number":5699,"context_line":""},{"line_number":5700,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_443e4cdb","line":5697,"range":{"start_line":5697,"start_character":6,"end_line":5697,"end_character":67},"in_reply_to":"9fdfeff1_9a615ad6","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5703,"context_line":"            self).setUp()"},{"line_number":5704,"context_line":""},{"line_number":5705,"context_line":"        # NOTE(gibi): This mock turns off the api microversion that prevents"},{"line_number":5706,"context_line":"        # handling of instances operations if the request involves port\u0027s with"},{"line_number":5707,"context_line":"        # resource request with old microversion. The new microversion does not"},{"line_number":5708,"context_line":"        # exists yet as the whole feature is not read for end user consumption."},{"line_number":5709,"context_line":"        # This functional tests however would like to prove that some use cases"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_ba5e9e0f","line":5706,"range":{"start_line":5706,"start_character":67,"end_line":5706,"end_character":73},"updated":"2019-01-28 19:20:27.000000000","message":"ports","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5703,"context_line":"            self).setUp()"},{"line_number":5704,"context_line":""},{"line_number":5705,"context_line":"        # NOTE(gibi): This mock turns off the api microversion that prevents"},{"line_number":5706,"context_line":"        # handling of instances operations if the request involves port\u0027s with"},{"line_number":5707,"context_line":"        # resource request with old microversion. The new microversion does not"},{"line_number":5708,"context_line":"        # exists yet as the whole feature is not read for end user consumption."},{"line_number":5709,"context_line":"        # This functional tests however would like to prove that some use cases"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_a42cd8ac","line":5706,"range":{"start_line":5706,"start_character":67,"end_line":5706,"end_character":73},"in_reply_to":"9fdfeff1_ba5e9e0f","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5739,"context_line":"                         compute_allocations)"},{"line_number":5740,"context_line":"        self.assertPortMatchesAllocation(qos_port, network_allocations)"},{"line_number":5741,"context_line":""},{"line_number":5742,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":5743,"context_line":"        self._wait_until_deleted(server)"},{"line_number":5744,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.delete.end\u0027)"},{"line_number":5745,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5746,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5747,"context_line":""},{"line_number":5748,"context_line":""},{"line_number":5749,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_fa966693","line":5746,"range":{"start_line":5742,"start_character":8,"end_line":5746,"end_character":45},"updated":"2019-01-28 19:20:27.000000000","message":"You can re-use self._delete_and_check_allocations here.","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5739,"context_line":"                         compute_allocations)"},{"line_number":5740,"context_line":"        self.assertPortMatchesAllocation(qos_port, network_allocations)"},{"line_number":5741,"context_line":""},{"line_number":5742,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":5743,"context_line":"        self._wait_until_deleted(server)"},{"line_number":5744,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.delete.end\u0027)"},{"line_number":5745,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5746,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5747,"context_line":""},{"line_number":5748,"context_line":""},{"line_number":5749,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_c4023c0c","line":5746,"range":{"start_line":5742,"start_character":8,"end_line":5746,"end_character":45},"in_reply_to":"9fdfeff1_bbd8bc7a","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4fda0c8447836211aac63050d48a8188ddc22952","unresolved":false,"context_lines":[{"line_number":5739,"context_line":"                         compute_allocations)"},{"line_number":5740,"context_line":"        self.assertPortMatchesAllocation(qos_port, network_allocations)"},{"line_number":5741,"context_line":""},{"line_number":5742,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":5743,"context_line":"        self._wait_until_deleted(server)"},{"line_number":5744,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.delete.end\u0027)"},{"line_number":5745,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5746,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5747,"context_line":""},{"line_number":5748,"context_line":""},{"line_number":5749,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_bbd8bc7a","line":5746,"range":{"start_line":5742,"start_character":8,"end_line":5746,"end_character":45},"in_reply_to":"9fdfeff1_fa966693","updated":"2019-01-30 16:26:17.000000000","message":"good point","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5746,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5747,"context_line":""},{"line_number":5748,"context_line":""},{"line_number":5749,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("},{"line_number":5750,"context_line":"        PortResourceRequestBasedSchedulingTestBase):"},{"line_number":5751,"context_line":""},{"line_number":5752,"context_line":"    compute_driver \u003d \u0027fake.FakeRescheduleDriver\u0027"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_3aa86ed9","line":5749,"range":{"start_line":5749,"start_character":6,"end_line":5749,"end_character":64},"updated":"2019-01-28 19:20:27.000000000","message":"same nit about a docstring","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5746,"context_line":"        self.assertEqual(0, len(allocations))"},{"line_number":5747,"context_line":""},{"line_number":5748,"context_line":""},{"line_number":5749,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("},{"line_number":5750,"context_line":"        PortResourceRequestBasedSchedulingTestBase):"},{"line_number":5751,"context_line":""},{"line_number":5752,"context_line":"    compute_driver \u003d \u0027fake.FakeRescheduleDriver\u0027"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_78fd3007","line":5749,"range":{"start_line":5749,"start_character":6,"end_line":5749,"end_character":64},"in_reply_to":"9fdfeff1_3aa86ed9","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5760,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5761,"context_line":""},{"line_number":5762,"context_line":"        # NOTE(gibi): This mock turns off the api microversion that prevents"},{"line_number":5763,"context_line":"        # handling of instances operations if the request involves port\u0027s with"},{"line_number":5764,"context_line":"        # resource request with old microversion. The new microversion does not"},{"line_number":5765,"context_line":"        # exists yet as the whole feature is not read for end user consumption."},{"line_number":5766,"context_line":"        # This functional tests however would like to prove that some use cases"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_bab3fe4c","line":5763,"range":{"start_line":5763,"start_character":67,"end_line":5763,"end_character":73},"updated":"2019-01-28 19:20:27.000000000","message":"ports","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5760,"context_line":"        self._create_networking_rp_tree(self.compute2_rp_uuid)"},{"line_number":5761,"context_line":""},{"line_number":5762,"context_line":"        # NOTE(gibi): This mock turns off the api microversion that prevents"},{"line_number":5763,"context_line":"        # handling of instances operations if the request involves port\u0027s with"},{"line_number":5764,"context_line":"        # resource request with old microversion. The new microversion does not"},{"line_number":5765,"context_line":"        # exists yet as the whole feature is not read for end user consumption."},{"line_number":5766,"context_line":"        # This functional tests however would like to prove that some use cases"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_982b3481","line":5763,"range":{"start_line":5763,"start_character":67,"end_line":5763,"end_character":73},"in_reply_to":"9fdfeff1_bab3fe4c","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"616da48847a8da8ac5107901015f3b223a26813e","unresolved":false,"context_lines":[{"line_number":5811,"context_line":"            self._get_provider_usages("},{"line_number":5812,"context_line":"                self.ovs_bridge_rp_per_host[failed_compute_rp]))"},{"line_number":5813,"context_line":""},{"line_number":5814,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":5815,"context_line":"        self._wait_until_deleted(server)"},{"line_number":5816,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.delete.end\u0027)"},{"line_number":5817,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5818,"context_line":"        self.assertEqual(0, len(allocations))"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_dade026c","line":5818,"range":{"start_line":5814,"start_character":8,"end_line":5818,"end_character":45},"updated":"2019-01-28 19:20:27.000000000","message":"same","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3f3052f81508d175c16ae30ad33b4a98aa1e90fe","unresolved":false,"context_lines":[{"line_number":5811,"context_line":"            self._get_provider_usages("},{"line_number":5812,"context_line":"                self.ovs_bridge_rp_per_host[failed_compute_rp]))"},{"line_number":5813,"context_line":""},{"line_number":5814,"context_line":"        self.api.delete_server(server[\u0027id\u0027])"},{"line_number":5815,"context_line":"        self._wait_until_deleted(server)"},{"line_number":5816,"context_line":"        fake_notifier.wait_for_versioned_notifications(\u0027instance.delete.end\u0027)"},{"line_number":5817,"context_line":"        allocations \u003d self._get_allocations_by_server_uuid(server[\u0027id\u0027])"},{"line_number":5818,"context_line":"        self.assertEqual(0, len(allocations))"}],"source_content_type":"text/x-python","patch_set":46,"id":"9fdfeff1_5825ccaa","line":5818,"range":{"start_line":5814,"start_character":8,"end_line":5818,"end_character":45},"in_reply_to":"9fdfeff1_dade026c","updated":"2019-02-04 18:07:46.000000000","message":"Done","commit_id":"f2983a49f8be40b5f6f5572988fdb22f2d423c8b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5680fd315b3e2b01b0bba9887dd213d10e410722","unresolved":false,"context_lines":[{"line_number":5770,"context_line":"class PortResourceRequestReSchedulingTestIgnoreMicroversionCheck("},{"line_number":5771,"context_line":"        PortResourceRequestBasedSchedulingTestBase):"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"    compute_driver \u003d \u0027fake.FakeRescheduleDriver\u0027"},{"line_number":5774,"context_line":""},{"line_number":5775,"context_line":"    def setUp(self):"},{"line_number":5776,"context_line":"        super("}],"source_content_type":"text/x-python","patch_set":47,"id":"9fdfeff1_da55fefb","line":5773,"range":{"start_line":5773,"start_character":22,"end_line":5773,"end_character":47},"updated":"2019-02-07 00:25:07.000000000","message":"TIL","commit_id":"27202ff41ea8a89af077346c1bb1ed5465f1e391"}]}
