)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"91fad0e01888da494beadf0ee074557716930b71","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tetsuro Nakamura \u003cnakamura.tetsuro@lab.ntt.co.jp\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-05-14 08:51:36 +0900"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add traits check in nested provider cadidates"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds trait check in the path used in getting allocation"},{"line_number":10,"context_line":"candidates with nested providers creating a trait check helper"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_1ba7760d","line":7,"range":{"start_line":7,"start_character":36,"end_line":7,"end_character":45},"updated":"2018-05-14 22:10:31.000000000","message":"candidates","commit_id":"5914bcd8940e21d4723c073ee3d6cb4480526aba"}],"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":3483,"context_line":"            anchor_root_provider_uuid\u003dprovider.root_provider_uuid)"},{"line_number":3484,"context_line":""},{"line_number":3485,"context_line":""},{"line_number":3486,"context_line":"def _check_traits_for_alloc_request(res_requests, summaries, prov_traits,"},{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_c2a86a8d","line":3487,"range":{"start_line":3486,"start_character":36,"end_line":3487,"end_character":69},"updated":"2018-05-10 22:36:07.000000000","message":"doc\u0027ing these params would be handy, as it\u0027s not immediately obvious what scope this method handles.  (I.e. \u0027summaries\u0027 and \u0027prov_traits\u0027 only contain entries for resource providers in a single allocation request, right?  I mean, I guess the method name implies that, sort of.  But still.)","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"0f6c474ff7eff166f69270376b51176b1eacacd2","unresolved":false,"context_lines":[{"line_number":3483,"context_line":"            anchor_root_provider_uuid\u003dprovider.root_provider_uuid)"},{"line_number":3484,"context_line":""},{"line_number":3485,"context_line":""},{"line_number":3486,"context_line":"def _check_traits_for_alloc_request(res_requests, summaries, prov_traits,"},{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_dc0cce42","line":3487,"range":{"start_line":3486,"start_character":36,"end_line":3487,"end_character":69},"in_reply_to":"5f7c97a3_c2a86a8d","updated":"2018-05-11 04:45:16.000000000","message":"Done","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":3486,"context_line":"def _check_traits_for_alloc_request(res_requests, summaries, prov_traits,"},{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."},{"line_number":3491,"context_line":"    \"\"\""},{"line_number":3492,"context_line":"    all_prov_ids \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a293ee5a","line":3489,"updated":"2018-05-10 22:36:07.000000000","message":"We should have a TODO here to move this logic into the SQL.","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"0f6c474ff7eff166f69270376b51176b1eacacd2","unresolved":false,"context_lines":[{"line_number":3486,"context_line":"def _check_traits_for_alloc_request(res_requests, summaries, prov_traits,"},{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."},{"line_number":3491,"context_line":"    \"\"\""},{"line_number":3492,"context_line":"    all_prov_ids \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_7c057a13","line":3489,"in_reply_to":"5f7c97a3_a293ee5a","updated":"2018-05-11 04:45:16.000000000","message":"Done","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."},{"line_number":3491,"context_line":"    \"\"\""},{"line_number":3492,"context_line":"    all_prov_ids \u003d set()"},{"line_number":3493,"context_line":"    all_traits \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_82fa72ba","line":3490,"range":{"start_line":3490,"start_character":56,"end_line":3490,"end_character":61},"updated":"2018-05-10 22:36:07.000000000","message":"None or the empty set would be more appropriate","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"0f6c474ff7eff166f69270376b51176b1eacacd2","unresolved":false,"context_lines":[{"line_number":3487,"context_line":"                                    forbidden_traits, required_traits):"},{"line_number":3488,"context_line":"    \"\"\"Given a list of AllocationRequestResource objects, check if that"},{"line_number":3489,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3490,"context_line":"    resource provider internal IDs in play, else return False."},{"line_number":3491,"context_line":"    \"\"\""},{"line_number":3492,"context_line":"    all_prov_ids \u003d set()"},{"line_number":3493,"context_line":"    all_traits \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_9c02d60a","line":3490,"range":{"start_line":3490,"start_character":56,"end_line":3490,"end_character":61},"in_reply_to":"5f7c97a3_82fa72ba","updated":"2018-05-11 04:45:16.000000000","message":"Empty list is consistent. Done.","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":3493,"context_line":"    all_traits \u003d set()"},{"line_number":3494,"context_line":"    for res_req in res_requests:"},{"line_number":3495,"context_line":"        rp_uuid \u003d res_req.resource_provider.uuid"},{"line_number":3496,"context_line":"        rp_id \u003d None"},{"line_number":3497,"context_line":"        for id, summary in summaries.items():"},{"line_number":3498,"context_line":"            if summary.resource_provider.uuid \u003d\u003d rp_uuid:"},{"line_number":3499,"context_line":"                rp_id \u003d id"},{"line_number":3500,"context_line":"                break"},{"line_number":3501,"context_line":"        rp_traits \u003d set(prov_traits.get(rp_id, []))"},{"line_number":3502,"context_line":""},{"line_number":3503,"context_line":"        # Check if there are forbidden_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_02d5021c","line":3500,"range":{"start_line":3496,"start_character":0,"end_line":3500,"end_character":21},"updated":"2018-05-10 22:36:07.000000000","message":"This is awkward.  for/else was designed to handle this more elegantly:\n\n for rp_id, summary in summaries.items():\n     if summary.resource_provider.uuid \u003d\u003d rp_uuid:\n         break\n else:\n     rp_id \u003d None\n\n...but aren\u0027t we guaranteed that rp_id will be somewhere in summaries?  If so, it should probably be more like:\n\n for rp_id, summary in summaries.items():\n     if summary.resource_provider.uuid \u003d\u003d rp_uuid:\n         break\n else:\n     raise ...\n\n...because the rest of the loop doesn\u0027t make sense with rp_id \u003d\u003d None.","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"0f6c474ff7eff166f69270376b51176b1eacacd2","unresolved":false,"context_lines":[{"line_number":3493,"context_line":"    all_traits \u003d set()"},{"line_number":3494,"context_line":"    for res_req in res_requests:"},{"line_number":3495,"context_line":"        rp_uuid \u003d res_req.resource_provider.uuid"},{"line_number":3496,"context_line":"        rp_id \u003d None"},{"line_number":3497,"context_line":"        for id, summary in summaries.items():"},{"line_number":3498,"context_line":"            if summary.resource_provider.uuid \u003d\u003d rp_uuid:"},{"line_number":3499,"context_line":"                rp_id \u003d id"},{"line_number":3500,"context_line":"                break"},{"line_number":3501,"context_line":"        rp_traits \u003d set(prov_traits.get(rp_id, []))"},{"line_number":3502,"context_line":""},{"line_number":3503,"context_line":"        # Check if there are forbidden_traits"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_3f013406","line":3500,"range":{"start_line":3496,"start_character":0,"end_line":3500,"end_character":21},"in_reply_to":"5f7c97a3_02d5021c","updated":"2018-05-11 04:45:16.000000000","message":"Done","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f695f1e0a0d71ffe6783568f23883efbd573729","unresolved":false,"context_lines":[{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    :param res_requests: a list of AllocationRequestResource objects that have"},{"line_number":3501,"context_line":"                         resource providers to be checked if they collectively"},{"line_number":3502,"context_line":"                         satisfy trait constrains in this function."},{"line_number":3503,"context_line":"    :param summaries: dict, keyed by resource provider ID, of ProviderSummary"},{"line_number":3504,"context_line":"                      objects containing usage and trait information for"},{"line_number":3505,"context_line":"                      resource providers involved in the overall request"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_69de1112","line":3502,"range":{"start_line":3502,"start_character":39,"end_line":3502,"end_character":49},"updated":"2018-05-11 13:30:48.000000000","message":"constraints","commit_id":"4464c0d952d6bc09ec48fd5599532f2ab15adfc2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4f695f1e0a0d71ffe6783568f23883efbd573729","unresolved":false,"context_lines":[{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    :param res_requests: a list of AllocationRequestResource objects that have"},{"line_number":3501,"context_line":"                         resource providers to be checked if they collectively"},{"line_number":3502,"context_line":"                         satisfy trait constrains in this function."},{"line_number":3503,"context_line":"    :param summaries: dict, keyed by resource provider ID, of ProviderSummary"},{"line_number":3504,"context_line":"                      objects containing usage and trait information for"},{"line_number":3505,"context_line":"                      resource providers involved in the overall request"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_89e36dd9","line":3502,"range":{"start_line":3502,"start_character":53,"end_line":3502,"end_character":66},"updated":"2018-05-11 13:30:48.000000000","message":"the required_traits and forbidden_traits parameters","commit_id":"4464c0d952d6bc09ec48fd5599532f2ab15adfc2"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"86ef495f58d80fd4561e18a950ecf75544b067f2","unresolved":false,"context_lines":[{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    :param res_requests: a list of AllocationRequestResource objects that have"},{"line_number":3501,"context_line":"                         resource providers to be checked if they collectively"},{"line_number":3502,"context_line":"                         satisfy trait constrains in this function."},{"line_number":3503,"context_line":"    :param summaries: dict, keyed by resource provider ID, of ProviderSummary"},{"line_number":3504,"context_line":"                      objects containing usage and trait information for"},{"line_number":3505,"context_line":"                      resource providers involved in the overall request"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_dcc6f89a","line":3502,"range":{"start_line":3502,"start_character":39,"end_line":3502,"end_character":49},"in_reply_to":"5f7c97a3_69de1112","updated":"2018-05-12 07:23:39.000000000","message":"Done","commit_id":"4464c0d952d6bc09ec48fd5599532f2ab15adfc2"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"86ef495f58d80fd4561e18a950ecf75544b067f2","unresolved":false,"context_lines":[{"line_number":3499,"context_line":""},{"line_number":3500,"context_line":"    :param res_requests: a list of AllocationRequestResource objects that have"},{"line_number":3501,"context_line":"                         resource providers to be checked if they collectively"},{"line_number":3502,"context_line":"                         satisfy trait constrains in this function."},{"line_number":3503,"context_line":"    :param summaries: dict, keyed by resource provider ID, of ProviderSummary"},{"line_number":3504,"context_line":"                      objects containing usage and trait information for"},{"line_number":3505,"context_line":"                      resource providers involved in the overall request"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7c97a3_fcc3b487","line":3502,"range":{"start_line":3502,"start_character":53,"end_line":3502,"end_character":66},"in_reply_to":"5f7c97a3_89e36dd9","updated":"2018-05-12 07:23:39.000000000","message":"Done","commit_id":"4464c0d952d6bc09ec48fd5599532f2ab15adfc2"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"79c86fc741379250c045e237843bd0ea9e2d026d","unresolved":false,"context_lines":[{"line_number":3276,"context_line":"    #"},{"line_number":3277,"context_line":"    # The SQL we want looks like this:"},{"line_number":3278,"context_line":"    #"},{"line_number":3279,"context_line":"    # SELECT outer_rp.id, outer_rp.root_provider_id"},{"line_number":3280,"context_line":"    # FROM resource_providers AS outer_rp"},{"line_number":3281,"context_line":"    # JOIN ("},{"line_number":3282,"context_line":"    #   SELECT rp.root_provider_id"},{"line_number":3283,"context_line":"    #   FROM resource_providers AS rp"},{"line_number":3284,"context_line":"    #   LEFT JOIN resource_provider_traits AS rptt"},{"line_number":3285,"context_line":"    #   ON rp.id \u003d rptt.resource_provider_id"},{"line_number":3286,"context_line":"    #   WHERE rp.id IN ($RP_IDS_WITH_INV)"},{"line_number":3287,"context_line":"    #   AND rptt.trait_id IN ($REQUIRED_TRAIT_IDS)"},{"line_number":3288,"context_line":"    #   GROUP BY rp.root_provider_id"},{"line_number":3289,"context_line":"    #   HAVING COUNT(DISTINCT rptt.trait_id) \u003d\u003d $NUM_REQUIRED_TRAITS"},{"line_number":3290,"context_line":"    # ) AS trees_with_traits"},{"line_number":3291,"context_line":"    #  ON outer_rp.root_provider_id \u003d trees_with_traits.root_provider_id"},{"line_number":3292,"context_line":"    rp_ids_with_inv \u003d set(p[0] for p in provs_with_inv)"},{"line_number":3293,"context_line":""},{"line_number":3294,"context_line":"    # Build our inner subquery"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_b4d44249","line":3291,"range":{"start_line":3279,"start_character":0,"end_line":3291,"end_character":72},"updated":"2018-05-15 14:06:34.000000000","message":"This is just getting trees with traits. This doesn\u0027t provide any information  which combination of the rps in that tree satisfies requested traits,which means we should look into this more closely later. And that process is done in this patch.","commit_id":"5914bcd8940e21d4723c073ee3d6cb4480526aba"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"040a27520b59b02eab11260090062c0b010d00c6","unresolved":false,"context_lines":[{"line_number":4309,"context_line":"                    context, resources, required_trait_map,"},{"line_number":4310,"context_line":"                    forbidden_trait_map, rp_ids, sharing_providers)"},{"line_number":4311,"context_line":"            else:"},{"line_number":4312,"context_line":"                rp_tuples \u003d _get_trees_matching_all(context, resources,"},{"line_number":4313,"context_line":"                    required_trait_map, forbidden_trait_map, member_of)"},{"line_number":4314,"context_line":"                return _alloc_candidates_nested_no_shared(context, resources,"},{"line_number":4315,"context_line":"                    required_trait_map, forbidden_trait_map, rp_tuples)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_cecdacb7","line":4312,"range":{"start_line":4312,"start_character":28,"end_line":4312,"end_character":51},"updated":"2018-05-15 12:10:32.000000000","message":"_get_trees_matching_all() already checks for required traits and forbidden traits...","commit_id":"5914bcd8940e21d4723c073ee3d6cb4480526aba"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"68be154001b05e2bc40c87b58cf750ee6719f951","unresolved":false,"context_lines":[{"line_number":3760,"context_line":"        for res_requests in itertools.product(*request_groups):"},{"line_number":3761,"context_line":"            # Before we add the allocation request to our list, we first need"},{"line_number":3762,"context_line":"            # to ensure that the resource providers involved in this allocation"},{"line_number":3763,"context_line":"            # request have all of the traits"},{"line_number":3764,"context_line":"            all_prov_ids \u003d set()"},{"line_number":3765,"context_line":"            all_traits \u003d set()"},{"line_number":3766,"context_line":"            for res_req in res_requests:"},{"line_number":3767,"context_line":"                rp_uuid \u003d res_req.resource_provider.uuid"},{"line_number":3768,"context_line":"                rp_id \u003d None"},{"line_number":3769,"context_line":"                for id, summary in summaries.items():"},{"line_number":3770,"context_line":"                    if summary.resource_provider.uuid \u003d\u003d rp_uuid:"},{"line_number":3771,"context_line":"                        rp_id \u003d id"},{"line_number":3772,"context_line":"                        break"},{"line_number":3773,"context_line":""},{"line_number":3774,"context_line":"                rp_traits \u003d set(prov_traits.get(rp_id, []))"},{"line_number":3775,"context_line":"                conflict_traits \u003d set(forbidden_traits) \u0026 set(rp_traits)"},{"line_number":3776,"context_line":"                if conflict_traits:"},{"line_number":3777,"context_line":"                    LOG.debug(\u0027Excluding sharing provider %s, it has \u0027"},{"line_number":3778,"context_line":"                              \u0027forbidden traits: (%s).\u0027,"},{"line_number":3779,"context_line":"                              rp_id, \u0027, \u0027.join(conflict_traits))"},{"line_number":3780,"context_line":"                    continue"},{"line_number":3781,"context_line":""},{"line_number":3782,"context_line":"                all_prov_ids.add(rp_id)"},{"line_number":3783,"context_line":"                all_traits |\u003d rp_traits"},{"line_number":3784,"context_line":""},{"line_number":3785,"context_line":"            # Check if there are missing traits"},{"line_number":3786,"context_line":"            missing_traits \u003d set(required_traits) - all_traits"},{"line_number":3787,"context_line":"            if missing_traits:"},{"line_number":3788,"context_line":"                LOG.debug(\u0027Excluding a set of allocation candidate %s : \u0027"},{"line_number":3789,"context_line":"                          \u0027missing traits %s are not satisfied.\u0027,"},{"line_number":3790,"context_line":"                          all_prov_ids, \u0027,\u0027.join(missing_traits))"},{"line_number":3791,"context_line":"                continue"},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"            # Check if we already have this combination in alloc_requests"},{"line_number":3794,"context_line":"            if all_prov_ids in alloc_prov_ids:"},{"line_number":3795,"context_line":"                continue"},{"line_number":3796,"context_line":""},{"line_number":3797,"context_line":"            alloc_prov_ids.append(all_prov_ids)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_ce5b6cf3","side":"PARENT","line":3794,"range":{"start_line":3763,"start_character":0,"end_line":3794,"end_character":46},"updated":"2018-05-15 12:13:47.000000000","message":"I actually don\u0027t see why we need any of this code. As noted below, _get_trees_matching_all() already filters out trees that meet the required and forbidden trait constraints.","commit_id":"92258ce4ffe7007476b6945528169d849d6509a6"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"79c86fc741379250c045e237843bd0ea9e2d026d","unresolved":false,"context_lines":[{"line_number":3760,"context_line":"        for res_requests in itertools.product(*request_groups):"},{"line_number":3761,"context_line":"            # Before we add the allocation request to our list, we first need"},{"line_number":3762,"context_line":"            # to ensure that the resource providers involved in this allocation"},{"line_number":3763,"context_line":"            # request have all of the traits"},{"line_number":3764,"context_line":"            all_prov_ids \u003d set()"},{"line_number":3765,"context_line":"            all_traits \u003d set()"},{"line_number":3766,"context_line":"            for res_req in res_requests:"},{"line_number":3767,"context_line":"                rp_uuid \u003d res_req.resource_provider.uuid"},{"line_number":3768,"context_line":"                rp_id \u003d None"},{"line_number":3769,"context_line":"                for id, summary in summaries.items():"},{"line_number":3770,"context_line":"                    if summary.resource_provider.uuid \u003d\u003d rp_uuid:"},{"line_number":3771,"context_line":"                        rp_id \u003d id"},{"line_number":3772,"context_line":"                        break"},{"line_number":3773,"context_line":""},{"line_number":3774,"context_line":"                rp_traits \u003d set(prov_traits.get(rp_id, []))"},{"line_number":3775,"context_line":"                conflict_traits \u003d set(forbidden_traits) \u0026 set(rp_traits)"},{"line_number":3776,"context_line":"                if conflict_traits:"},{"line_number":3777,"context_line":"                    LOG.debug(\u0027Excluding sharing provider %s, it has \u0027"},{"line_number":3778,"context_line":"                              \u0027forbidden traits: (%s).\u0027,"},{"line_number":3779,"context_line":"                              rp_id, \u0027, \u0027.join(conflict_traits))"},{"line_number":3780,"context_line":"                    continue"},{"line_number":3781,"context_line":""},{"line_number":3782,"context_line":"                all_prov_ids.add(rp_id)"},{"line_number":3783,"context_line":"                all_traits |\u003d rp_traits"},{"line_number":3784,"context_line":""},{"line_number":3785,"context_line":"            # Check if there are missing traits"},{"line_number":3786,"context_line":"            missing_traits \u003d set(required_traits) - all_traits"},{"line_number":3787,"context_line":"            if missing_traits:"},{"line_number":3788,"context_line":"                LOG.debug(\u0027Excluding a set of allocation candidate %s : \u0027"},{"line_number":3789,"context_line":"                          \u0027missing traits %s are not satisfied.\u0027,"},{"line_number":3790,"context_line":"                          all_prov_ids, \u0027,\u0027.join(missing_traits))"},{"line_number":3791,"context_line":"                continue"},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"            # Check if we already have this combination in alloc_requests"},{"line_number":3794,"context_line":"            if all_prov_ids in alloc_prov_ids:"},{"line_number":3795,"context_line":"                continue"},{"line_number":3796,"context_line":""},{"line_number":3797,"context_line":"            alloc_prov_ids.append(all_prov_ids)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_3476f271","side":"PARENT","line":3794,"range":{"start_line":3763,"start_character":0,"end_line":3794,"end_character":46},"in_reply_to":"5f7c97a3_ce5b6cf3","updated":"2018-05-15 14:06:34.000000000","message":"Could you see my comment @L3291?","commit_id":"92258ce4ffe7007476b6945528169d849d6509a6"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d0f8449546840c154f91bfd05c4bc2779a238da1","unresolved":false,"context_lines":[{"line_number":3484,"context_line":"    combination can provide trait constraints. If it can, returns all"},{"line_number":3485,"context_line":"    resource provider internal IDs in play, else return an empty list."},{"line_number":3486,"context_line":""},{"line_number":3487,"context_line":"    TODO(tetsuro): For optimization, we should move this logic to SQL in"},{"line_number":3488,"context_line":"                   _get_trees_matching_all()."},{"line_number":3489,"context_line":""},{"line_number":3490,"context_line":"    :param res_requests: a list of AllocationRequestResource objects that have"},{"line_number":3491,"context_line":"                         resource providers to be checked if they collectively"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_114e6837","line":3488,"range":{"start_line":3487,"start_character":0,"end_line":3488,"end_character":45},"updated":"2018-05-15 13:33:06.000000000","message":"I\u0027m not sure how we can fix it within SQL so far. so I put a note here.","commit_id":"b68a9159385bedf7791019f6583d5101f0bd69c6"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"68be154001b05e2bc40c87b58cf750ee6719f951","unresolved":false,"context_lines":[{"line_number":4309,"context_line":"                    context, resources, required_trait_map,"},{"line_number":4310,"context_line":"                    forbidden_trait_map, rp_ids, sharing_providers)"},{"line_number":4311,"context_line":"            else:"},{"line_number":4312,"context_line":"                rp_tuples \u003d _get_trees_matching_all(context, resources,"},{"line_number":4313,"context_line":"                    required_trait_map, forbidden_trait_map, member_of)"},{"line_number":4314,"context_line":"                return _alloc_candidates_nested_no_shared(context, resources,"},{"line_number":4315,"context_line":"                    required_trait_map, forbidden_trait_map, rp_tuples)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_0e3de48d","line":4312,"range":{"start_line":4312,"start_character":27,"end_line":4312,"end_character":51},"updated":"2018-05-15 12:13:47.000000000","message":"_get_trees_matching_all() already filters out trees that don\u0027t meet the required and forbidden trait constraints.","commit_id":"b68a9159385bedf7791019f6583d5101f0bd69c6"}],"nova/tests/functional/api/openstack/placement/db/test_allocation_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"            # TODO(tetsuro): Return all resource providers in the tree"},{"line_number":1692,"context_line":"            #  \u0027cn_numa0\u0027: set([]),"},{"line_number":1693,"context_line":"            #  \u0027cn_numa1\u0027: set([]),"},{"line_number":1694,"context_line":"            #  \u0027cn_numa0_pf0\u0027: set(["},{"line_number":1695,"context_line":"            #      (fields.ResourceClass.SRIOV_NET_VF, 8, 0),"},{"line_number":1696,"context_line":"            #  ]),"},{"line_number":1697,"context_line":"            \u0027cn_numa1_pf1\u0027: set(["},{"line_number":1698,"context_line":"                (fields.ResourceClass.SRIOV_NET_VF, 8, 0),"},{"line_number":1699,"context_line":"            ]),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_02be62d4","line":1696,"range":{"start_line":1694,"start_character":0,"end_line":1696,"end_character":18},"updated":"2018-05-10 22:36:07.000000000","message":"just delete these now, yah?","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"0f6c474ff7eff166f69270376b51176b1eacacd2","unresolved":false,"context_lines":[{"line_number":1691,"context_line":"            # TODO(tetsuro): Return all resource providers in the tree"},{"line_number":1692,"context_line":"            #  \u0027cn_numa0\u0027: set([]),"},{"line_number":1693,"context_line":"            #  \u0027cn_numa1\u0027: set([]),"},{"line_number":1694,"context_line":"            #  \u0027cn_numa0_pf0\u0027: set(["},{"line_number":1695,"context_line":"            #      (fields.ResourceClass.SRIOV_NET_VF, 8, 0),"},{"line_number":1696,"context_line":"            #  ]),"},{"line_number":1697,"context_line":"            \u0027cn_numa1_pf1\u0027: set(["},{"line_number":1698,"context_line":"                (fields.ResourceClass.SRIOV_NET_VF, 8, 0),"},{"line_number":1699,"context_line":"            ]),"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_6871350c","line":1696,"range":{"start_line":1694,"start_character":0,"end_line":1696,"end_character":18},"in_reply_to":"5f7c97a3_02be62d4","updated":"2018-05-11 04:45:16.000000000","message":"With \"Return all resource providers in the tree\" spec, we should return all resource provider in an involved tree, so it is okay to be still here.","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"05d6dca31ba837da5e411e4d514be538dc5ccf14","unresolved":false,"context_lines":[{"line_number":1705,"context_line":"            # TODO(tetsuro): Return all resource providers in the tree"},{"line_number":1706,"context_line":"            #  \u0027cn_numa0\u0027: set([]),"},{"line_number":1707,"context_line":"            #  \u0027cn_numa1\u0027: set([]),"},{"line_number":1708,"context_line":"            #  \u0027cn_numa0_pf0\u0027: set([]),"},{"line_number":1709,"context_line":"            \u0027cn_numa1_pf1\u0027: set([os_traits.HW_NIC_OFFLOAD_GENEVE]),"},{"line_number":1710,"context_line":"        }"},{"line_number":1711,"context_line":"        self._validate_provider_summary_traits(expected, alloc_cands)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_e2b806e6","line":1708,"range":{"start_line":1708,"start_character":0,"end_line":1708,"end_character":39},"updated":"2018-05-10 22:36:07.000000000","message":"ditto.","commit_id":"13cc17eb2fe02fba36aecebcd0ce8c27c2819b9c"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d89ad94949678df4d7aa287b320e305eb1e78df0","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        )"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"        expected \u003d ["},{"line_number":1671,"context_line":"            # FIXME(tetsuro): If a tree has one combination of resource"},{"line_number":1672,"context_line":"            # providers that satisfies required traits, the combinations"},{"line_number":1673,"context_line":"            # without required traits in that tree are also returned."},{"line_number":1674,"context_line":"            # We should\u0027t get the following first combination since"},{"line_number":1675,"context_line":"            # \u0027cn_numa0_pf0\u0027 has no traits"},{"line_number":1676,"context_line":"            [(\u0027cn\u0027, fields.ResourceClass.VCPU, 2),"},{"line_number":1677,"context_line":"             (\u0027cn\u0027, fields.ResourceClass.MEMORY_MB, 256),"},{"line_number":1678,"context_line":"             (\u0027cn_numa0_pf0\u0027, fields.ResourceClass.SRIOV_NET_VF, 1)],"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_5195c085","side":"PARENT","line":1675,"range":{"start_line":1671,"start_character":0,"end_line":1675,"end_character":42},"updated":"2018-05-15 13:29:24.000000000","message":"@Jay It does filter traits in accuracy of trees. But it doesn\u0027t filter in accuracy of combinations in a tree (Shall we can call it a branch?).","commit_id":"92258ce4ffe7007476b6945528169d849d6509a6"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"af46b7f9089514eb8ce648bbdc08194242522f88","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        )"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"        expected \u003d ["},{"line_number":1671,"context_line":"            # FIXME(tetsuro): If a tree has one combination of resource"},{"line_number":1672,"context_line":"            # providers that satisfies required traits, the combinations"},{"line_number":1673,"context_line":"            # without required traits in that tree are also returned."},{"line_number":1674,"context_line":"            # We should\u0027t get the following first combination since"},{"line_number":1675,"context_line":"            # \u0027cn_numa0_pf0\u0027 has no traits"},{"line_number":1676,"context_line":"            [(\u0027cn\u0027, fields.ResourceClass.VCPU, 2),"},{"line_number":1677,"context_line":"             (\u0027cn\u0027, fields.ResourceClass.MEMORY_MB, 256),"},{"line_number":1678,"context_line":"             (\u0027cn_numa0_pf0\u0027, fields.ResourceClass.SRIOV_NET_VF, 1)],"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_bfcc0e35","side":"PARENT","line":1675,"range":{"start_line":1671,"start_character":0,"end_line":1675,"end_character":42},"in_reply_to":"5f7c97a3_34a592a2","updated":"2018-05-16 04:15:44.000000000","message":"The test doesn\u0027t fail because that test validates only returned trees and doesn\u0027t test rps are in that returned tree.\n\nAdded tests in https://review.openstack.org/#/c/568737/.","commit_id":"92258ce4ffe7007476b6945528169d849d6509a6"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a56df593275c1dca9626b1d5f18eb53aa0767a9f","unresolved":false,"context_lines":[{"line_number":1668,"context_line":"        )"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"        expected \u003d ["},{"line_number":1671,"context_line":"            # FIXME(tetsuro): If a tree has one combination of resource"},{"line_number":1672,"context_line":"            # providers that satisfies required traits, the combinations"},{"line_number":1673,"context_line":"            # without required traits in that tree are also returned."},{"line_number":1674,"context_line":"            # We should\u0027t get the following first combination since"},{"line_number":1675,"context_line":"            # \u0027cn_numa0_pf0\u0027 has no traits"},{"line_number":1676,"context_line":"            [(\u0027cn\u0027, fields.ResourceClass.VCPU, 2),"},{"line_number":1677,"context_line":"             (\u0027cn\u0027, fields.ResourceClass.MEMORY_MB, 256),"},{"line_number":1678,"context_line":"             (\u0027cn_numa0_pf0\u0027, fields.ResourceClass.SRIOV_NET_VF, 1)],"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_34a592a2","side":"PARENT","line":1675,"range":{"start_line":1671,"start_character":0,"end_line":1675,"end_character":42},"in_reply_to":"5f7c97a3_5195c085","updated":"2018-05-15 14:12:57.000000000","message":"I\u0027m sorry, Tetsuro, but that\u0027s not true.\n\nIf that were true, then this test would fail:\n\nhttps://github.com/openstack/nova/blob/ae131868f71700d69053b65a0a37f9c2d65c3770/nova/tests/functional/api/openstack/placement/db/test_allocation_candidates.py#L1854-L1867","commit_id":"92258ce4ffe7007476b6945528169d849d6509a6"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2600659fdd6558bd82350fd331b32d1368b733a3","unresolved":false,"context_lines":[{"line_number":2099,"context_line":"        # fixed out of this _get_trees_matching_all() function by checking"},{"line_number":2100,"context_line":"        # traits later again in _check_traits_for_alloc_request()."},{"line_number":2101,"context_line":"        # But ideally, we\u0027d like to have only pf1 from cn3 here using SQL"},{"line_number":2102,"context_line":"        # query in _get_trees_matching_all() function for optimization."},{"line_number":2103,"context_line":"        # provider_names \u003d cn_names + [\u0027cn3_numa1_pf1\u0027]"},{"line_number":2104,"context_line":"        provider_names \u003d cn_names + [\u0027cn3_numa0_pf0\u0027, \u0027cn3_numa1_pf1\u0027]"},{"line_number":2105,"context_line":"        expect_provider_ids \u003d self._get_rp_ids_matching_names(provider_names)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_3bc68d18","line":2102,"updated":"2018-05-18 20:29:13.000000000","message":"++","commit_id":"5e0f9c8c39326a445b70c8be4d9c350344410244"}]}
