)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bc70a772c8448baa41318878309772c7d19676cc","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Use the previously introduced map_requested_resources_to_providers()"},{"line_number":10,"context_line":"function in the RequestSpec during the scheduling of a new server. This"},{"line_number":11,"context_line":"is done in the conductor becase later when placement will return such mapping"},{"line_number":12,"context_line":"this will be the place when that mapping can be moved form the Selection"},{"line_number":13,"context_line":"object returned by the scheduler to the RequestSpec."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"blueprint bandwidth-resource-provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9fdfeff1_924a04aa","line":12,"range":{"start_line":12,"start_character":54,"end_line":12,"end_character":58},"updated":"2019-02-20 17:53:46.000000000","message":"from","commit_id":"91c6e0cc0194f16e579dfa38d29b19da4671c413"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Use the previously introduced map_requested_resources_to_providers()"},{"line_number":10,"context_line":"function in the RequestSpec during the scheduling of a new server. This"},{"line_number":11,"context_line":"is done in the conductor becase later when placement will return such mapping"},{"line_number":12,"context_line":"this will be the place when that mapping can be moved form the Selection"},{"line_number":13,"context_line":"object returned by the scheduler to the RequestSpec."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"9fdfeff1_c248a2b4","line":11,"range":{"start_line":11,"start_character":25,"end_line":11,"end_character":31},"updated":"2019-02-21 20:29:54.000000000","message":"because","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Use the previously introduced map_requested_resources_to_providers()"},{"line_number":10,"context_line":"function in the RequestSpec during the scheduling of a new server. This"},{"line_number":11,"context_line":"is done in the conductor becase later when placement will return such mapping"},{"line_number":12,"context_line":"this will be the place when that mapping can be moved form the Selection"},{"line_number":13,"context_line":"object returned by the scheduler to the RequestSpec."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"blueprint bandwidth-resource-provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"9fdfeff1_82c85a21","line":12,"range":{"start_line":12,"start_character":54,"end_line":12,"end_character":58},"updated":"2019-02-21 20:29:54.000000000","message":"from","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"}],"nova/conductor/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8f05a6086260bc5968d40553bdd1c1a9e84040e8","unresolved":false,"context_lines":[{"line_number":1409,"context_line":"                    context, instance.uuid, request_spec)"},{"line_number":1410,"context_line":"            except Exception as exc:"},{"line_number":1411,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1412,"context_line":"                    self._cleanup_build_artifacts(context, exc, instances,"},{"line_number":1413,"context_line":"                                                  build_requests,"},{"line_number":1414,"context_line":"                                                  request_specs,"},{"line_number":1415,"context_line":"                                                  cell_mapping_cache)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_676e7566","line":1412,"range":{"start_line":1412,"start_character":25,"end_line":1412,"end_character":49},"updated":"2018-12-17 15:22:39.000000000","message":"This seems wrong as the signature of _cleanup_build_artifacts() should contain tags. I guess this problem was introduced in a rebase","commit_id":"9b153ac1cb5616c39d2bd0ec3626e18c3710e31f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e863dc195087f4916a596a1b30e511a697f5ac44","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        \"\"\"Fills out the request group - resource provider mapping in the"},{"line_number":1250,"context_line":"        request spec."},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        This is a workaround as placement does not return which PR"},{"line_number":1253,"context_line":"        fulfills which granular request group in the allocation candidate"},{"line_number":1254,"context_line":"        request. There is a spec proposing a solution in placement:"},{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fdfeff1_864eea35","line":1252,"range":{"start_line":1252,"start_character":64,"end_line":1252,"end_character":66},"updated":"2019-02-12 20:56:16.000000000","message":"RP","commit_id":"2db2839be9864f054a430b2013fdc3ba09a4eb69"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e863dc195087f4916a596a1b30e511a697f5ac44","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fdfeff1_26c85e20","line":1262,"range":{"start_line":1261,"start_character":17,"end_line":1262,"end_character":35},"updated":"2019-02-12 20:56:16.000000000","message":"Gross, we don\u0027t already have the allocations in the Selection object?\n\n jsonutils.loads(host.allocation_request)\n\nOr is that not guaranteed to be there?","commit_id":"2db2839be9864f054a430b2013fdc3ba09a4eb69"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e863dc195087f4916a596a1b30e511a697f5ac44","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"},{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("},{"line_number":1268,"context_line":"            allocs, provider_traits)"},{"line_number":1269,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9fdfeff1_c674f2d1","line":1266,"range":{"start_line":1263,"start_character":0,"end_line":1266,"end_character":34},"updated":"2019-02-12 20:56:16.000000000","message":"Yeah, so as noted in the previous patch, I wonder if it would be worth using a ProviderTree [1] here instead.\n\n[1] ...possibly gleaned via get_provider_tree_and_ensure_root. Though we shouldn\u0027t allow that guy to be cached on the conductor at all. Maybe pass in a flag to switch off caching.","commit_id":"2db2839be9864f054a430b2013fdc3ba09a4eb69"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bc70a772c8448baa41318878309772c7d19676cc","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        \"\"\"Fills out the request group - resource provider mapping in the"},{"line_number":1250,"context_line":"        request spec."},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        This is a workaround as placement does not return which PR"},{"line_number":1253,"context_line":"        fulfills which granular request group in the allocation candidate"},{"line_number":1254,"context_line":"        request. There is a spec proposing a solution in placement:"},{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_d2d5ecb8","line":1252,"range":{"start_line":1252,"start_character":64,"end_line":1252,"end_character":66},"updated":"2019-02-20 17:53:46.000000000","message":"RP","commit_id":"91c6e0cc0194f16e579dfa38d29b19da4671c413"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bc70a772c8448baa41318878309772c7d19676cc","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_92a68453","line":1262,"range":{"start_line":1261,"start_character":0,"end_line":1262,"end_character":35},"updated":"2019-02-20 17:53:46.000000000","message":"hmm, is this call to placement necessary? don\u0027t we already have all the allocation information in the Selection object?\n\n[Later] Hmm, I see we\u0027re just storing the allocation_request as a serialized string in the Selection object:\n\nhttps://github.com/openstack/nova/blob/af78b13c24d4abf393d17ac57e9135204ef12b73/nova/objects/selection.py#L40\n\nWe really should pass the actual allocations information that were consumed in claim_resources() instead of requiring the conductor to re-fetch that information... but, future work I guess. :)","commit_id":"91c6e0cc0194f16e579dfa38d29b19da4671c413"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4d2bd7ba7548f8046ddca0d7c928635107df1cd3","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_e15292de","line":1262,"range":{"start_line":1261,"start_character":0,"end_line":1262,"end_character":35},"in_reply_to":"9fdfeff1_92a68453","updated":"2019-02-21 10:12:46.000000000","message":"Yeah. I think this problem will re-appear when I have to re-do the mapping for each server move operations. Those will be  also after a new scheduling and new allocation. So it will help me seeing the pattern and formulate a proper solution.","commit_id":"91c6e0cc0194f16e579dfa38d29b19da4671c413"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        \"\"\"Fills out the request group - resource provider mapping in the"},{"line_number":1250,"context_line":"        request spec."},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        This is a workaround as placement does not return which PR"},{"line_number":1253,"context_line":"        fulfills which granular request group in the allocation candidate"},{"line_number":1254,"context_line":"        request. There is a spec proposing a solution in placement:"},{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_a290feee","line":1252,"range":{"start_line":1252,"start_character":64,"end_line":1252,"end_character":66},"updated":"2019-02-21 20:29:54.000000000","message":"RP","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        \"\"\"Fills out the request group - resource provider mapping in the"},{"line_number":1250,"context_line":"        request spec."},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        This is a workaround as placement does not return which PR"},{"line_number":1253,"context_line":"        fulfills which granular request group in the allocation candidate"},{"line_number":1254,"context_line":"        request. There is a spec proposing a solution in placement:"},{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_08cfa929","line":1252,"range":{"start_line":1252,"start_character":64,"end_line":1252,"end_character":66},"in_reply_to":"9fdfeff1_a290feee","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"},{"line_number":1256,"context_line":"        When that spec is implemented then this function can be"},{"line_number":1257,"context_line":"        replaced with a simpler code that copies the group - RP"},{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_02ab0a1e","line":1258,"range":{"start_line":1258,"start_character":7,"end_line":1258,"end_character":45},"updated":"2019-02-21 20:29:54.000000000","message":"You mean store the allocations in the Selection object, right? Because the Selection object already has allocation_request but that\u0027s a json string of the allocation_requests dict entry from the GET /allocation_candidates response.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"91c3e0966bb1764ff5fe5b390446a81208e129cf","unresolved":false,"context_lines":[{"line_number":1255,"context_line":"        https://review.openstack.org/#/c/597601/"},{"line_number":1256,"context_line":"        When that spec is implemented then this function can be"},{"line_number":1257,"context_line":"        replaced with a simpler code that copies the group - RP"},{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_6c93e001","line":1258,"range":{"start_line":1258,"start_character":7,"end_line":1258,"end_character":45},"in_reply_to":"9fdfeff1_02ab0a1e","updated":"2019-02-22 09:43:05.000000000","message":"My intention is to store the mapping we got back from placement in the Selection object. This part of the information is directly for nova use so I would add it to a top level field instead of a json blob. But this is future work.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_c27982c5","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"updated":"2019-02-21 20:29:54.000000000","message":"Also, there is a TODO on get_allocations_for_consumer to use get_allocs_for_consumer instead - why aren\u0027t you?","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_e274c6d2","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"updated":"2019-02-21 20:29:54.000000000","message":"So for each instance being created, we\u0027re going to make this same call and then potentially turn around and ignore it because of this:\n\nhttps://review.openstack.org/#/c/616239/33/nova/objects/request_spec.py@781\n\nIt would be really nice if we can make https://review.openstack.org/#/c/616239/33/nova/objects/request_spec.py@781 a property on the RequestSpec so we can do something like:\n\nif request_spec.maps_requested_resources:\n   ...\n\nOr something because for the majority of server create requests that don\u0027t need bandwidth-aware port scheduling, this is going to add to the overall time it takes to build the instance(s), especially in the multi-create scenario if I\u0027m creating 10, 50 or 100 instances in a single request.\n\nThat could arguably be optimized in a follow up though.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"52af2581d8ed2bcf2242fc887278bce99cc76c6e","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_1da11747","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"in_reply_to":"9fdfeff1_2c44f873","updated":"2019-02-22 16:39:42.000000000","message":"replaced the GET /allocations/\u003cuuid\u003e call with the use of Selection.allocation_request json blob in https://review.openstack.org/#/c/638711","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"91c3e0966bb1764ff5fe5b390446a81208e129cf","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_2c44f873","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"in_reply_to":"9fdfeff1_6d8be71d","updated":"2019-02-22 09:43:05.000000000","message":"Good point about mutli-create. I still have to read your follow up but re-using the info from the Selection object seems clever.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_68c8b520","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"in_reply_to":"9fdfeff1_6d8be71d","updated":"2019-02-21 22:04:50.000000000","message":"I\u0027ll leave a TODO in the code in a follow up.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_e8d345d2","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"in_reply_to":"9fdfeff1_e274c6d2","updated":"2019-02-21 22:04:50.000000000","message":"\u003e It would be really nice if we can make https://review.openstack.org/#/c/616239/33/nova/objects/request_spec.py@781 a property on the RequestSpec so we can do something like:\n\nDone in a follow up.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a1d23aa4e69fcbef79878b681574dfa6bd4d4546","unresolved":false,"context_lines":[{"line_number":1258,"context_line":"        mapping out from the Selection object returned by the scheduler\u0027s"},{"line_number":1259,"context_line":"        select_destinations call."},{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_6d8be71d","line":1261,"range":{"start_line":1261,"start_character":36,"end_line":1261,"end_character":64},"in_reply_to":"9fdfeff1_e274c6d2","updated":"2019-02-21 20:46:44.000000000","message":"I see Jay also commented on this - can the results of this GET /allocations/{consumer_id} be different from what\u0027s in the Selection.allocation_request? I realize the latter is serialized, but it would have the resource provider uuids on it right? Seems that would be much faster to deserialize those than make an API call to placement for every instance being built.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_a22c7eac","line":1263,"updated":"2019-02-21 20:29:54.000000000","message":"Seems we should definitely cache this for the lifetime of a single build server operation because again, if I\u0027m creating 100 servers in a single request, and 50 of those are served by the same compute node resource provider, we\u0027re going to be looking up the traits on each provider 100 times when we don\u0027t really need to. Your cache would have to be passed by reference from schedule_and_build_instances to this method.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_a848ddb2","line":1263,"in_reply_to":"9fdfeff1_0d333b64","updated":"2019-02-21 22:04:50.000000000","message":"I\u0027ll leave a TODO in the code (in a follow up).","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"91c3e0966bb1764ff5fe5b390446a81208e129cf","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_aca9c824","line":1263,"in_reply_to":"9fdfeff1_0d333b64","updated":"2019-02-22 09:43:05.000000000","message":"We can remove this code when https://review.openstack.org/#/c/597601/ is implemented.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4363c46c969a44fe89352a876c3826394e0865c8","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_0d333b64","line":1263,"in_reply_to":"9fdfeff1_a22c7eac","updated":"2019-02-21 20:53:10.000000000","message":"In the future, we could also avoid this entirely by stashing the traits for each resource provider on the Selection object itself, right? We have that information from the provider_summaries in the GET /allocation_candidates response.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"841f5b97d1abd892cf49b64010b04a97f8d455c3","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        \"\"\""},{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_fbdbf11d","line":1263,"in_reply_to":"9fdfeff1_aca9c824","updated":"2019-02-23 14:25:32.000000000","message":"I implemented a trait cache in https://review.openstack.org/#/c/638847/1//COMMIT_MSG but I don\u0027t think it will be hit as we don\u0027t support multi-create with pre created Neutron ports.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"},{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_4247d278","line":1264,"range":{"start_line":1264,"start_character":40,"end_line":1264,"end_character":60},"updated":"2019-02-21 20:29:54.000000000","message":"We should make this a public method now yeah?","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1261,"context_line":"        allocs \u003d self.report_client.get_allocations_for_consumer("},{"line_number":1262,"context_line":"            context, instance_uuid)"},{"line_number":1263,"context_line":"        provider_traits \u003d {"},{"line_number":1264,"context_line":"            rp_uuid: self.report_client._get_provider_traits("},{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"},{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_e84ee5c0","line":1264,"range":{"start_line":1264,"start_character":40,"end_line":1264,"end_character":60},"in_reply_to":"9fdfeff1_4247d278","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"},{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("},{"line_number":1268,"context_line":"            allocs, provider_traits)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def schedule_and_build_instances(self, context, build_requests,"},{"line_number":1271,"context_line":"                                     request_specs, image,"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_6d29a787","line":1268,"range":{"start_line":1268,"start_character":12,"end_line":1268,"end_character":18},"updated":"2019-02-21 20:29:54.000000000","message":"We removed the CachingScheduler:\n\nI1832da2190be5ef2b04953938860a56a43e8cddf\n\nBut technically there could be out-of-tree scheduler drivers that don\u0027t use placement which means the scheduler driver doesn\u0027t actually create allocations, so it might be prudent to have a condition on allocs actually having something in it before we get this far.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1265,"context_line":"                context, rp_uuid).traits"},{"line_number":1266,"context_line":"            for rp_uuid in allocs}"},{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("},{"line_number":1268,"context_line":"            allocs, provider_traits)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def schedule_and_build_instances(self, context, build_requests,"},{"line_number":1271,"context_line":"                                     request_specs, image,"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_c853e16b","line":1268,"range":{"start_line":1268,"start_character":12,"end_line":1268,"end_character":18},"in_reply_to":"9fdfeff1_6d29a787","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"        request_spec.map_requested_resources_to_providers("},{"line_number":1268,"context_line":"            allocs, provider_traits)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def schedule_and_build_instances(self, context, build_requests,"},{"line_number":1271,"context_line":"                                     request_specs, image,"},{"line_number":1272,"context_line":"                                     admin_password, injected_files,"},{"line_number":1273,"context_line":"                                     requested_networks, block_device_mapping,"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_22cf2e2a","line":1270,"range":{"start_line":1270,"start_character":8,"end_line":1270,"end_character":36},"updated":"2019-02-21 20:29:54.000000000","message":"Christ almighty this is a big method and we should break it up or condense somehow. I remember it was a single for loop before the counting quotas check introduced in Pike, and I had ideas on how to re-converge to a single for loop for sanity:\n\nhttps://review.openstack.org/#/c/501408/2/nova/conductor/manager.py@1020\n\nBut haven\u0027t done that work.\n\nAnyway, unrelated grumbling.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":1382,"context_line":"            scheduler_utils.populate_filter_properties(filter_props,"},{"line_number":1383,"context_line":"                                                       host)"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"            try:"},{"line_number":1386,"context_line":"                self._fill_provider_mapping("},{"line_number":1387,"context_line":"                    context, instance.uuid, request_spec)"},{"line_number":1388,"context_line":"            except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_6d4e876f","line":1385,"updated":"2019-02-21 20:29:54.000000000","message":"Given the size of this method overall, it would be good to have a comment here about what this is doing any why it\u0027s doing it here.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":1382,"context_line":"            scheduler_utils.populate_filter_properties(filter_props,"},{"line_number":1383,"context_line":"                                                       host)"},{"line_number":1384,"context_line":""},{"line_number":1385,"context_line":"            try:"},{"line_number":1386,"context_line":"                self._fill_provider_mapping("},{"line_number":1387,"context_line":"                    context, instance.uuid, request_spec)"},{"line_number":1388,"context_line":"            except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_88e2b99f","line":1385,"in_reply_to":"9fdfeff1_6d4e876f","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"}],"nova/tests/unit/conductor/test_conductor.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"9f44aff154e78ecb85a4cefaa3a37e09c9e53dc7","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"        mock_map.assert_called_once_with({uuids.rp1: mock.sentinel.rp1_allocs},"},{"line_number":2093,"context_line":"                                         {uuids.rp1: [\u0027TRAIT1\u0027]})"},{"line_number":2094,"context_line":"        mock_get_allocs.assert_called_once_with(mock.ANY, instance_uuid)"},{"line_number":2095,"context_line":"        mock_traits.assert_called_once_with(mock.ANY, uuids.rp1)"},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"    @mock.patch(\u0027nova.objects.CellMapping.get_by_uuid\u0027)"},{"line_number":2098,"context_line":"    def test_bury_in_cell0_no_cell0(self, mock_cm_get):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_b9d5031e","line":2095,"updated":"2019-02-01 05:15:55.000000000","message":"A test case that _fill_provider_mapping raises an exception is missing.","commit_id":"ab3c01e883a8db5a2d8843552261f18053f4d678"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58094b47e17aff4e72fce8cbeffd85f0e9099e74","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"        mock_map.assert_called_once_with({uuids.rp1: mock.sentinel.rp1_allocs},"},{"line_number":2093,"context_line":"                                         {uuids.rp1: [\u0027TRAIT1\u0027]})"},{"line_number":2094,"context_line":"        mock_get_allocs.assert_called_once_with(mock.ANY, instance_uuid)"},{"line_number":2095,"context_line":"        mock_traits.assert_called_once_with(mock.ANY, uuids.rp1)"},{"line_number":2096,"context_line":""},{"line_number":2097,"context_line":"    @mock.patch(\u0027nova.objects.CellMapping.get_by_uuid\u0027)"},{"line_number":2098,"context_line":"    def test_bury_in_cell0_no_cell0(self, mock_cm_get):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_70877c11","line":2095,"in_reply_to":"9fdfeff1_b9d5031e","updated":"2019-02-05 10:56:00.000000000","message":"Done.","commit_id":"ab3c01e883a8db5a2d8843552261f18053f4d678"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"        self.params[\u0027request_specs\u0027][0].requested_resources \u003d ["},{"line_number":2093,"context_line":"            objects.RequestGroup()]"},{"line_number":2094,"context_line":""},{"line_number":2095,"context_line":"        mock_get_allocs.side_effect \u003d exc.ConsumerAllocationRetrievalFailed("},{"line_number":2096,"context_line":"            consumer_uuid\u003duuids.inst, error\u003d\u0027some error\u0027)"},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_2da63f11","line":2095,"range":{"start_line":2095,"start_character":42,"end_line":2095,"end_character":75},"updated":"2019-02-21 20:29:54.000000000","message":"This wouldn\u0027t actually get raised from that method:\n\nhttps://github.com/openstack/nova/blob/ffc07a689c1584db9128b2f3a86114f1f0f3a523/nova/scheduler/client/report.py#L1477\n\nI guess you\u0027re just looking to trigger an error for handling but then why not just mock _fill_provider_mapping and not deal with stuff inside that method? In other words, you\u0027re mocking too deep, can just mock _fill_provider_mapping and have it raise test.TestingException.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":2092,"context_line":"        self.params[\u0027request_specs\u0027][0].requested_resources \u003d ["},{"line_number":2093,"context_line":"            objects.RequestGroup()]"},{"line_number":2094,"context_line":""},{"line_number":2095,"context_line":"        mock_get_allocs.side_effect \u003d exc.ConsumerAllocationRetrievalFailed("},{"line_number":2096,"context_line":"            consumer_uuid\u003duuids.inst, error\u003d\u0027some error\u0027)"},{"line_number":2097,"context_line":""},{"line_number":2098,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_a8dd3dde","line":2095,"range":{"start_line":2095,"start_character":42,"end_line":2095,"end_character":75},"in_reply_to":"9fdfeff1_2da63f11","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2c69faf3de40201c585ff53f9503a4007021c77","unresolved":false,"context_lines":[{"line_number":2099,"context_line":"            exc.ConsumerAllocationRetrievalFailed,"},{"line_number":2100,"context_line":"            self._do_schedule_and_build_instances_test, self.params)"},{"line_number":2101,"context_line":""},{"line_number":2102,"context_line":"        self.assertFalse(mock_map.called)"},{"line_number":2103,"context_line":"        self.assertFalse(mock_traits.called)"},{"line_number":2104,"context_line":"        self.assertTrue(mock_cleanup.called)"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"    @mock.patch(\u0027nova.objects.CellMapping.get_by_uuid\u0027)"},{"line_number":2107,"context_line":"    def test_bury_in_cell0_no_cell0(self, mock_cm_get):"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_6d9c47bf","line":2104,"range":{"start_line":2102,"start_character":8,"end_line":2104,"end_character":44},"updated":"2019-02-21 20:29:54.000000000","message":"These would be better as Mock.assert_not_called() and Mock.assert_called_once() because if they fail they\u0027ll give better error messages than \"False is not True\" etc.","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f3c4573d3df4b742f9c9843e07af696714e735f5","unresolved":false,"context_lines":[{"line_number":2099,"context_line":"            exc.ConsumerAllocationRetrievalFailed,"},{"line_number":2100,"context_line":"            self._do_schedule_and_build_instances_test, self.params)"},{"line_number":2101,"context_line":""},{"line_number":2102,"context_line":"        self.assertFalse(mock_map.called)"},{"line_number":2103,"context_line":"        self.assertFalse(mock_traits.called)"},{"line_number":2104,"context_line":"        self.assertTrue(mock_cleanup.called)"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"    @mock.patch(\u0027nova.objects.CellMapping.get_by_uuid\u0027)"},{"line_number":2107,"context_line":"    def test_bury_in_cell0_no_cell0(self, mock_cm_get):"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_48ee118c","line":2104,"range":{"start_line":2102,"start_character":8,"end_line":2104,"end_character":44},"in_reply_to":"9fdfeff1_6d9c47bf","updated":"2019-02-21 22:04:50.000000000","message":"Done","commit_id":"f5d236f868a598f8f241df759c516ec49e3779b0"}]}
