)]}'
{"placement/objects/allocation_candidate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                    return [], []"},{"line_number":124,"context_line":"            rp_candidates \u003d rp_obj.get_trees_matching_all(context, rg_ctx)"},{"line_number":125,"context_line":"            return _alloc_candidates_multiple_providers("},{"line_number":126,"context_line":"                context, rg_ctx.resources, rg_ctx.required_trait_map,"},{"line_number":127,"context_line":"                rg_ctx.forbidden_trait_map, rp_candidates)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        # Either we are processing a single-RP request group, or there are no"},{"line_number":130,"context_line":"        # sharing providers that (help) satisfy the request.  Get a list of"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_7902e5b6","line":127,"range":{"start_line":126,"start_character":16,"end_line":127,"end_character":42},"updated":"2019-05-20 19:40:13.000000000","message":"maybe you\u0027ve done it later in the series, but this looks like a good opportunity to collapse these down into just rg_ctx.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ccf18565da691caf7175c9ddc21d272afbbd178","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        )"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @staticmethod"},{"line_number":98,"context_line":"    def _get_by_one_request(context, rg_ctx):"},{"line_number":99,"context_line":"        \"\"\"Get allocation candidates for one RequestGroup."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        Must be called from within an placement_context_manager.reader"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_368468b1","line":98,"range":{"start_line":98,"start_character":28,"end_line":98,"end_character":43},"updated":"2019-05-21 15:11:41.000000000","message":"Sorry I didn\u0027t notice this before, but you could eliminate the \u0027context\u0027 param and use rg_ctx.context instead. Same applies elsewhere.","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ccf18565da691caf7175c9ddc21d272afbbd178","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        self.max_unit \u003d max_unit"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"def _alloc_candidates_multiple_providers(ctx, rg_ctx, rp_candidates):"},{"line_number":294,"context_line":"    \"\"\"Returns a tuple of (allocation requests, provider summaries) for a"},{"line_number":295,"context_line":"    supplied set of requested resource amounts and tuples of"},{"line_number":296,"context_line":"    (rp_id, root_id, rc_id). The supplied resource provider trees have"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_7670a0dd","line":293,"range":{"start_line":293,"start_character":41,"end_line":293,"end_character":44},"updated":"2019-05-21 15:11:41.000000000","message":"here","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"276c2529a3329d166de1b07cc842f63178d32d23","unresolved":false,"context_lines":[{"line_number":397,"context_line":"    AllocationRequest and ProviderSummary objects due to not having to"},{"line_number":398,"context_line":"    determine requests across multiple providers."},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    :param rg_ctx: placement.context.RequestContext object"},{"line_number":401,"context_line":"    :param rp_tuples: List of two-tuples of (provider ID, root provider ID)s"},{"line_number":402,"context_line":"                      for providers that matched the requested resources"},{"line_number":403,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_f78318a8","line":400,"updated":"2019-05-22 13:23:54.000000000","message":"It\u0027s a search context, yes?","commit_id":"0a2bb72a35cfed65d8342f7f9cff56eb2b5257f1"}],"placement/objects/research_context.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        }"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # A lists of lists of aggregate UUIDs that the providers matching for"},{"line_number":39,"context_line":"        # that request group must be members of"},{"line_number":40,"context_line":"        self.member_of \u003d request.member_of"},{"line_number":41,"context_line":"        self.forbidden_aggs \u003d request.forbidden_aggs"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_791c256a","line":39,"range":{"start_line":39,"start_character":29,"end_line":39,"end_character":34},"updated":"2019-05-20 19:40:13.000000000","message":"(or must not)","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # a dict, keyed by resource class ID, of the set of resource"},{"line_number":64,"context_line":"        # provider IDs that share some inventory for each resource class"},{"line_number":65,"context_line":"        self.sharing_providers \u003d {}"},{"line_number":66,"context_line":"        if not self.use_same_provider:"},{"line_number":67,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":68,"context_line":"                self.sharing_providers[rc_id] \u003d \\"},{"line_number":69,"context_line":"                    rp_obj.get_providers_with_shared_capacity("}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_593cc192","line":66,"range":{"start_line":66,"start_character":20,"end_line":66,"end_character":37},"updated":"2019-05-20 19:40:13.000000000","message":"This is new... and I don\u0027t think it\u0027s correct.\n\nIIUC you\u0027re saying \"we can only associate sharing providers with the unnumbered group\". But that\u0027s not true. We should be able to say:\n\n ?resources\u003dVCPU,MEMORY_MB\n \u0026resources1\u003dDISK_GB\n\nand have the DISK_GB come from a sharing provider. It\u0027s still coming from *one* provider, so it satisfies `use_same_provider`. But we need to use `get_providers_with_shared_capacity` - or at least store the provider information in `sharing_providers` - to ensure it\u0027s properly considered as being allowed to be associated with non-sharing portions of the request.\n\nIf we didn\u0027t fail any tests because of this, I assume it\u0027s either because we don\u0027t have coverage for these scenarios, or because we\u0027re compensating elsewhere. The latter may be okay functionally, but it would be nice if the code flowed intuitively...","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"829cb4958a78ce754afb91583d517492213cb54f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # a dict, keyed by resource class ID, of the set of resource"},{"line_number":64,"context_line":"        # provider IDs that share some inventory for each resource class"},{"line_number":65,"context_line":"        self.sharing_providers \u003d {}"},{"line_number":66,"context_line":"        if not self.use_same_provider:"},{"line_number":67,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":68,"context_line":"                self.sharing_providers[rc_id] \u003d \\"},{"line_number":69,"context_line":"                    rp_obj.get_providers_with_shared_capacity("}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_16be0b65","line":66,"range":{"start_line":66,"start_character":20,"end_line":66,"end_character":37},"in_reply_to":"bfb3d3c7_593cc192","updated":"2019-05-21 11:16:52.000000000","message":"We don\u0027t at all use sharing providers in use_same_provider path [1] or in _merge_candidates().\n\n[1] https://github.com/openstack/placement/blob/73b29cd6e474882380b19c0fc0217cc47434de59/placement/objects/allocation_candidate.py#L166-L174\n\nWe merge candidates being based on anchor_root_providers, which is retrieved if the trait has sharing traits. \n\n[2] https://github.com/openstack/placement/blob/73b29cd6e474882380b19c0fc0217cc47434de59/placement/objects/allocation_candidate.py#L492-L501\n\nso I think it is the latter.\n\n\u003e it would be nice if the code flowed intuitively.\n\nYes, but I don\u0027t think retrieving them anyway and not using it is intuitive either...I\u0027ll add more comments on this. Looks like we just need to keep moving forward for better ways.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if not self.use_same_provider:"},{"line_number":67,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":68,"context_line":"                self.sharing_providers[rc_id] \u003d \\"},{"line_number":69,"context_line":"                    rp_obj.get_providers_with_shared_capacity("},{"line_number":70,"context_line":"                        context, rc_id, amount, self.member_of)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.has_trees \u003d has_trees"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_39e9cd19","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":61},"updated":"2019-05-20 19:40:13.000000000","message":"Before, we were doing this once per resource class. Now we\u0027re doing it once per resource class per request group. Seems like the sharing_providers dict should be cached at a higher level than a single RequestGroupSearchContext.\n\n(I\u0027ll concede that IRL this is likely not to matter.)","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"829cb4958a78ce754afb91583d517492213cb54f","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if not self.use_same_provider:"},{"line_number":67,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":68,"context_line":"                self.sharing_providers[rc_id] \u003d \\"},{"line_number":69,"context_line":"                    rp_obj.get_providers_with_shared_capacity("},{"line_number":70,"context_line":"                        context, rc_id, amount, self.member_of)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.has_trees \u003d has_trees"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_73a8b91e","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":61},"in_reply_to":"bfb3d3c7_39e9cd19","updated":"2019-05-21 11:16:52.000000000","message":"It is ridiculous that we call this function twice for a request like\n\n   ?resources1\u003dSRIOV_VF:2\u0026resources2\u003dSRIOV_VF:1\n\nto see if there is a sharing provider, but we need to call it twice since the requested amount is different between the two request groups which can lead the different results. \n\nRather than that, the ridiculousness comes from that we know the SR-IOV VF is not sharable and we can skip calling this function.\nTherefore what should be more optimized here IMO is to consider DISK_GB is only the sharable resource internally and skip the others.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"b73bbefbc0c4a7cda8693d3053553a46d0ea861c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if not self.use_same_provider:"},{"line_number":67,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":68,"context_line":"                self.sharing_providers[rc_id] \u003d \\"},{"line_number":69,"context_line":"                    rp_obj.get_providers_with_shared_capacity("},{"line_number":70,"context_line":"                        context, rc_id, amount, self.member_of)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.has_trees \u003d has_trees"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_674c73c7","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":61},"in_reply_to":"bfb3d3c7_73a8b91e","updated":"2019-05-21 11:54:23.000000000","message":"\u003e Rather than that, the ridiculousness comes from that we know the\n \u003e SR-IOV VF is not sharable and we can skip calling this function.\n \u003e Therefore what should be more optimized here IMO is to consider\n \u003e DISK_GB is only the sharable resource internally and skip the\n \u003e others.\n\nWe don\u0027t want placement to be aware of the meaning of any resource classes, so doing any conditionals based on \u0027DISK_GB\u0027 would be a bad idea.\n\nHowever, might it be possible to preheat a view of resource providers which have the misc_shares_via_aggregate trait?\n\nWhether that view is an actual SQL VIEW or a cached set, I\u0027m not sure, but it is yet another idea that might fit in here somewhere.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"3c694115c510044beac76e3707a4cf972b9ef002","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    \"\"\"An adapter object that represents the search for allocation candidates"},{"line_number":27,"context_line":"    for a single request group."},{"line_number":28,"context_line":"    \"\"\""},{"line_number":29,"context_line":"    def __init__(self, context, request, has_trees):"},{"line_number":30,"context_line":"        self.context \u003d context"},{"line_number":31,"context_line":"        # A dict, keyed by resource class internal ID, of the amounts of that"},{"line_number":32,"context_line":"        # resource class being requested by the group."}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_87cf277e","line":29,"updated":"2019-05-21 11:42:31.000000000","message":"good to have comment here especially that this can raise ResourceProviderNotFound()","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"3c694115c510044beac76e3707a4cf972b9ef002","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        # provider IDs that share some inventory for each resource class"},{"line_number":67,"context_line":"        # This is only used for unnumbered request group path where"},{"line_number":68,"context_line":"        # use_same_provider is set to False"},{"line_number":69,"context_line":"        self.sharing_providers \u003d {}"},{"line_number":70,"context_line":"        if not self.use_same_provider:"},{"line_number":71,"context_line":"            for rc_id, amount in self.resources.items():"},{"line_number":72,"context_line":"                # We may want to have a concept of \"sharable resource class\""}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_27a67bc3","line":69,"updated":"2019-05-21 11:42:31.000000000","message":"Maybe we want to have some function to get sharing providers and make this attribute private?","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"}],"placement/objects/resource_provider.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":679,"context_line":"    return ret"},{"line_number":680,"context_line":""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"@db_api.placement_context_manager.reader"},{"line_number":683,"context_line":"def provider_ids_from_uuid(context, uuid):"},{"line_number":684,"context_line":"    \"\"\"Given the UUID of a resource provider, returns a namedtuple"},{"line_number":685,"context_line":"    (ProviderIds) with the internal ID, the UUID, the parent provider\u0027s"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_b9213d50","line":682,"range":{"start_line":682,"start_character":0,"end_line":682,"end_character":40},"updated":"2019-05-20 19:40:13.000000000","message":"✔\n\nThis used to be wrapped in the writer context from _get_by_requests.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":1568,"context_line":"    :param ctx: Session context to use"},{"line_number":1569,"context_line":"    :param rg_ctx: RequestGroupSearchContext"},{"line_number":1570,"context_line":"    \"\"\""},{"line_number":1571,"context_line":"    resources \u003d rg_ctx.resources"},{"line_number":1572,"context_line":"    required_traits \u003d rg_ctx.required_trait_map"},{"line_number":1573,"context_line":"    forbidden_traits \u003d rg_ctx.forbidden_trait_map"},{"line_number":1574,"context_line":"    member_of \u003d rg_ctx.member_of"},{"line_number":1575,"context_line":"    forbidden_aggs \u003d rg_ctx.forbidden_aggs"},{"line_number":1576,"context_line":"    tree_root_id \u003d rg_ctx.tree_root_id"},{"line_number":1577,"context_line":""},{"line_number":1578,"context_line":"    filtered_rps, forbidden_rp_ids \u003d get_provider_ids_for_traits_and_aggs("},{"line_number":1579,"context_line":"        ctx, required_traits, forbidden_traits, member_of, forbidden_aggs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_39d30d3b","line":1576,"range":{"start_line":1571,"start_character":0,"end_line":1576,"end_character":38},"updated":"2019-05-20 19:40:13.000000000","message":"are you going to inline these at some point?","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"829cb4958a78ce754afb91583d517492213cb54f","unresolved":false,"context_lines":[{"line_number":1568,"context_line":"    :param ctx: Session context to use"},{"line_number":1569,"context_line":"    :param rg_ctx: RequestGroupSearchContext"},{"line_number":1570,"context_line":"    \"\"\""},{"line_number":1571,"context_line":"    resources \u003d rg_ctx.resources"},{"line_number":1572,"context_line":"    required_traits \u003d rg_ctx.required_trait_map"},{"line_number":1573,"context_line":"    forbidden_traits \u003d rg_ctx.forbidden_trait_map"},{"line_number":1574,"context_line":"    member_of \u003d rg_ctx.member_of"},{"line_number":1575,"context_line":"    forbidden_aggs \u003d rg_ctx.forbidden_aggs"},{"line_number":1576,"context_line":"    tree_root_id \u003d rg_ctx.tree_root_id"},{"line_number":1577,"context_line":""},{"line_number":1578,"context_line":"    filtered_rps, forbidden_rp_ids \u003d get_provider_ids_for_traits_and_aggs("},{"line_number":1579,"context_line":"        ctx, required_traits, forbidden_traits, member_of, forbidden_aggs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_312d5995","line":1576,"range":{"start_line":1571,"start_character":0,"end_line":1576,"end_character":38},"in_reply_to":"bfb3d3c7_39d30d3b","updated":"2019-05-21 11:16:52.000000000","message":"Well, not right now in the series, but will do in a fup if you want.","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d73badd87e3c3d2731d4f10f07927eb11b63f29e","unresolved":false,"context_lines":[{"line_number":1827,"context_line":"    :param ctx: Session context to use"},{"line_number":1828,"context_line":"    :param rg_ctx: RequestGroupSearchContext"},{"line_number":1829,"context_line":"    \"\"\""},{"line_number":1830,"context_line":"    resources \u003d rg_ctx.resources"},{"line_number":1831,"context_line":"    required_traits \u003d rg_ctx.required_trait_map"},{"line_number":1832,"context_line":"    forbidden_traits \u003d rg_ctx.forbidden_trait_map"},{"line_number":1833,"context_line":"    member_of \u003d rg_ctx.member_of"},{"line_number":1834,"context_line":"    forbidden_aggs \u003d rg_ctx.forbidden_aggs"},{"line_number":1835,"context_line":"    tree_root_id \u003d rg_ctx.tree_root_id"},{"line_number":1836,"context_line":"    sharing \u003d rg_ctx.sharing_providers"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"    # If \u0027member_of\u0027 has values, do a separate lookup to identify the"},{"line_number":1839,"context_line":"    # resource providers that meet the member_of constraints."}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_59d84152","line":1836,"range":{"start_line":1830,"start_character":0,"end_line":1836,"end_character":38},"updated":"2019-05-20 19:40:13.000000000","message":"ditto","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ccf18565da691caf7175c9ddc21d272afbbd178","unresolved":false,"context_lines":[{"line_number":1550,"context_line":""},{"line_number":1551,"context_line":""},{"line_number":1552,"context_line":"@db_api.placement_context_manager.reader"},{"line_number":1553,"context_line":"def get_provider_ids_matching(ctx, rg_ctx):"},{"line_number":1554,"context_line":"    \"\"\"Returns a list of tuples of (internal provider ID, root provider ID)"},{"line_number":1555,"context_line":"    that have available inventory to satisfy all the supplied requests for"},{"line_number":1556,"context_line":"    resources. If no providers match, the empty list is returned."}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_d6806c8e","line":1553,"range":{"start_line":1553,"start_character":30,"end_line":1553,"end_character":33},"updated":"2019-05-21 15:11:41.000000000","message":"here","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7ccf18565da691caf7175c9ddc21d272afbbd178","unresolved":false,"context_lines":[{"line_number":1798,"context_line":""},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"@db_api.placement_context_manager.reader"},{"line_number":1801,"context_line":"def get_trees_matching_all(ctx, rg_ctx):"},{"line_number":1802,"context_line":"    \"\"\"Returns a RPCandidates object representing the providers that satisfy"},{"line_number":1803,"context_line":"    the request for resources."},{"line_number":1804,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_f67b30bb","line":1801,"range":{"start_line":1801,"start_character":27,"end_line":1801,"end_character":30},"updated":"2019-05-21 15:11:41.000000000","message":"here","commit_id":"9cadc36e5c32c76f6397df01f8a8f2c6e92b8bdb"}],"placement/tests/functional/db/test_allocation_candidates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ae33d67e05eef207347c0f738acad973d434e874","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from placement import exception"},{"line_number":20,"context_line":"from placement import lib as placement_lib"},{"line_number":21,"context_line":"from placement.objects import allocation_candidate as ac_obj"},{"line_number":22,"context_line":"from placement.objects import research_context as req_ctx"},{"line_number":23,"context_line":"from placement.objects import resource_class as rc_obj"},{"line_number":24,"context_line":"from placement.objects import resource_provider as rp_obj"},{"line_number":25,"context_line":"from placement.objects import trait as trait_obj"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_f96c9509","line":22,"range":{"start_line":22,"start_character":52,"end_line":22,"end_character":53},"updated":"2019-05-20 20:08:44.000000000","message":"might as well call this res_ctx here (and not have to rename it in the next patch)","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"829cb4958a78ce754afb91583d517492213cb54f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from placement import exception"},{"line_number":20,"context_line":"from placement import lib as placement_lib"},{"line_number":21,"context_line":"from placement.objects import allocation_candidate as ac_obj"},{"line_number":22,"context_line":"from placement.objects import research_context as req_ctx"},{"line_number":23,"context_line":"from placement.objects import resource_class as rc_obj"},{"line_number":24,"context_line":"from placement.objects import resource_provider as rp_obj"},{"line_number":25,"context_line":"from placement.objects import trait as trait_obj"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ddb73686","line":22,"range":{"start_line":22,"start_character":52,"end_line":22,"end_character":53},"in_reply_to":"bfb3d3c7_f96c9509","updated":"2019-05-21 11:16:52.000000000","message":"good catch","commit_id":"c1815531f46b4295529782bbe722068b3a5d13df"}]}
