)]}'
{"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":3901,"context_line":""},{"line_number":3902,"context_line":"        :param context: Nova RequestContext."},{"line_number":3903,"context_line":"        :param requests: Dict, keyed by suffix, of"},{"line_number":3904,"context_line":"                         nova.api.openstack.placement.util.RequestGroup"},{"line_number":3905,"context_line":"        :param limit: An integer, N, representing the maximum number of"},{"line_number":3906,"context_line":"                      allocation candidates to return. If"},{"line_number":3907,"context_line":"                      CONF.placement.randomize_allocation_candidates is True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_95f970c9","line":3904,"range":{"start_line":3904,"start_character":54,"end_line":3904,"end_character":58},"updated":"2018-08-09 16:02:46.000000000","message":"lib\n\n(I know, unrelated, but just noticed it)","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cb61c4c625346ab502b1ad9bd53cf6706bbaf761","unresolved":false,"context_lines":[{"line_number":3901,"context_line":""},{"line_number":3902,"context_line":"        :param context: Nova RequestContext."},{"line_number":3903,"context_line":"        :param requests: Dict, keyed by suffix, of"},{"line_number":3904,"context_line":"                         nova.api.openstack.placement.util.RequestGroup"},{"line_number":3905,"context_line":"        :param limit: An integer, N, representing the maximum number of"},{"line_number":3906,"context_line":"                      allocation candidates to return. If"},{"line_number":3907,"context_line":"                      CONF.placement.randomize_allocation_candidates is True"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_615f360e","line":3904,"range":{"start_line":3904,"start_character":54,"end_line":3904,"end_character":58},"in_reply_to":"3f79a3b5_95f970c9","updated":"2018-08-09 18:05:03.000000000","message":"I might fix in another patch, but as you said, it\u0027s unrelated","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":3935,"context_line":"        (or writer) context."},{"line_number":3936,"context_line":""},{"line_number":3937,"context_line":"        :param context: Nova RequestContext."},{"line_number":3938,"context_line":"        :param request: One nova.api.openstack.placement.util.RequestGroup"},{"line_number":3939,"context_line":"        :param sharing_providers: dict, keyed by resource class internal ID, of"},{"line_number":3940,"context_line":"                                  the set of provider IDs containing shared"},{"line_number":3941,"context_line":"                                  inventory of that resource class"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_f5e0e4fc","line":3938,"range":{"start_line":3938,"start_character":57,"end_line":3938,"end_character":61},"updated":"2018-08-09 16:02:46.000000000","message":"lib","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":3964,"context_line":"                    missing \u003d traits - set(trait_map)"},{"line_number":3965,"context_line":"                    raise exception.TraitNotFound(names\u003d\u0027, \u0027.join(missing))"},{"line_number":3966,"context_line":""},{"line_number":3967,"context_line":"        # Microversions prior to 1.21 will not have \u0027member_of\u0027 in the groups."},{"line_number":3968,"context_line":"        # This allows earlier microversions to continue to work."},{"line_number":3969,"context_line":"        member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":3970,"context_line":""},{"line_number":3971,"context_line":"        if not request.use_same_provider and (has_trees or sharing_providers):"},{"line_number":3972,"context_line":"            # TODO(jaypipes): The check/callout to handle trees goes here."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_35889c6f","line":3969,"range":{"start_line":3967,"start_character":0,"end_line":3969,"end_character":55},"updated":"2018-08-09 16:02:46.000000000","message":"This can be\n\n member_of \u003d request.member_of\n\nwhich will be [] if it wasn\u0027t specified in the querystring, which works correctly in the (three) methods where it\u0027s used, which just check for truthiness.\n\nThe comment looks like it was actually never correct. In the same patch where it was added, RequestGroup.member_of was added, defaulting to [] if not specified to __init__.\n\n...all of which would be good for a separate patch, except this is reused below.","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cb61c4c625346ab502b1ad9bd53cf6706bbaf761","unresolved":false,"context_lines":[{"line_number":3964,"context_line":"                    missing \u003d traits - set(trait_map)"},{"line_number":3965,"context_line":"                    raise exception.TraitNotFound(names\u003d\u0027, \u0027.join(missing))"},{"line_number":3966,"context_line":""},{"line_number":3967,"context_line":"        # Microversions prior to 1.21 will not have \u0027member_of\u0027 in the groups."},{"line_number":3968,"context_line":"        # This allows earlier microversions to continue to work."},{"line_number":3969,"context_line":"        member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":3970,"context_line":""},{"line_number":3971,"context_line":"        if not request.use_same_provider and (has_trees or sharing_providers):"},{"line_number":3972,"context_line":"            # TODO(jaypipes): The check/callout to handle trees goes here."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_e17346b0","line":3969,"range":{"start_line":3967,"start_character":0,"end_line":3969,"end_character":55},"in_reply_to":"3f79a3b5_35889c6f","updated":"2018-08-09 18:05:03.000000000","message":"Done","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"457b51d1f1caf3787af8d397c56f96fe63922963","unresolved":false,"context_lines":[{"line_number":3964,"context_line":"                    missing \u003d traits - set(trait_map)"},{"line_number":3965,"context_line":"                    raise exception.TraitNotFound(names\u003d\u0027, \u0027.join(missing))"},{"line_number":3966,"context_line":""},{"line_number":3967,"context_line":"        # Microversions prior to 1.21 will not have \u0027member_of\u0027 in the groups."},{"line_number":3968,"context_line":"        # This allows earlier microversions to continue to work."},{"line_number":3969,"context_line":"        member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":3970,"context_line":""},{"line_number":3971,"context_line":"        if not request.use_same_provider and (has_trees or sharing_providers):"},{"line_number":3972,"context_line":"            # TODO(jaypipes): The check/callout to handle trees goes here."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_01bd22d7","line":3969,"range":{"start_line":3967,"start_character":0,"end_line":3969,"end_character":55},"in_reply_to":"3f79a3b5_e17346b0","updated":"2018-08-09 18:10:22.000000000","message":"actually, no, I won\u0027t do this in this patch, since it\u0027s unrelated. will do in another one.","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":4011,"context_line":"    @db_api.placement_context_manager.writer"},{"line_number":4012,"context_line":"    def _get_by_requests(cls, context, requests, limit\u003dNone,"},{"line_number":4013,"context_line":"                         group_policy\u003dNone):"},{"line_number":4014,"context_line":"        # TODO(jaypipes): Make a RequestGroupContext object and put these"},{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_15d32062","line":4014,"range":{"start_line":4014,"start_character":33,"end_line":4014,"end_character":52},"updated":"2018-08-09 16:02:46.000000000","message":"Okay, but if you do, let\u0027s name it something other than (Request.*)Context, which makes me think it has something to do with oslo_context.RequestContext.","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cb61c4c625346ab502b1ad9bd53cf6706bbaf761","unresolved":false,"context_lines":[{"line_number":4011,"context_line":"    @db_api.placement_context_manager.writer"},{"line_number":4012,"context_line":"    def _get_by_requests(cls, context, requests, limit\u003dNone,"},{"line_number":4013,"context_line":"                         group_policy\u003dNone):"},{"line_number":4014,"context_line":"        # TODO(jaypipes): Make a RequestGroupContext object and put these"},{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_217a9e87","line":4014,"range":{"start_line":4014,"start_character":33,"end_line":4014,"end_character":52},"in_reply_to":"3f79a3b5_15d32062","updated":"2018-08-09 18:05:03.000000000","message":"I called it CandidateSearchContext actually in my patch series that tried doing this:\n\nhttps://review.openstack.org/#/c/566166/5/nova/api/openstack/placement/objects/resource_provider.py@4025","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2b7478440c83b79d6e53f33104986d3ee77bbd7a","unresolved":false,"context_lines":[{"line_number":4011,"context_line":"    @db_api.placement_context_manager.writer"},{"line_number":4012,"context_line":"    def _get_by_requests(cls, context, requests, limit\u003dNone,"},{"line_number":4013,"context_line":"                         group_policy\u003dNone):"},{"line_number":4014,"context_line":"        # TODO(jaypipes): Make a RequestGroupContext object and put these"},{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_cc09a12c","line":4014,"range":{"start_line":4014,"start_character":33,"end_line":4014,"end_character":52},"in_reply_to":"3f79a3b5_217a9e87","updated":"2018-08-09 18:27:24.000000000","message":"\u0027Context\u0027 is the part I mainly object to, but I guess it\u0027s not so bad without \u0027Request\u0027 in it.","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"},{"line_number":4018,"context_line":"        for _ignore, request in requests.items():"},{"line_number":4019,"context_line":"            member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":4020,"context_line":"            for rc_name, amount in request.resources.items():"},{"line_number":4021,"context_line":"                rc_id \u003d _RC_CACHE.id_from_string(rc_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_92dbc6eb","line":4018,"range":{"start_line":4018,"start_character":12,"end_line":4018,"end_character":19},"updated":"2018-08-09 16:02:46.000000000","message":"It\u0027s pythonic to use \u0027_\u0027 for ignores. But...","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"},{"line_number":4018,"context_line":"        for _ignore, request in requests.items():"},{"line_number":4019,"context_line":"            member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":4020,"context_line":"            for rc_name, amount in request.resources.items():"},{"line_number":4021,"context_line":"                rc_id \u003d _RC_CACHE.id_from_string(rc_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_b2d602c3","line":4018,"range":{"start_line":4018,"start_character":32,"end_line":4018,"end_character":48},"updated":"2018-08-09 16:02:46.000000000","message":"Why not just use requests.values() instead?","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cb61c4c625346ab502b1ad9bd53cf6706bbaf761","unresolved":false,"context_lines":[{"line_number":4015,"context_line":"        # pieces of information in there, passing the context to the various"},{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"},{"line_number":4018,"context_line":"        for _ignore, request in requests.items():"},{"line_number":4019,"context_line":"            member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":4020,"context_line":"            for rc_name, amount in request.resources.items():"},{"line_number":4021,"context_line":"                rc_id \u003d _RC_CACHE.id_from_string(rc_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_613176ec","line":4018,"range":{"start_line":4018,"start_character":32,"end_line":4018,"end_character":48},"in_reply_to":"3f79a3b5_b2d602c3","updated":"2018-08-09 18:05:03.000000000","message":"cuz i\u0027m stoopid. :)","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d25931c5e410ed9145181f2abef45b472c18c2a4","unresolved":false,"context_lines":[{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"},{"line_number":4018,"context_line":"        for _ignore, request in requests.items():"},{"line_number":4019,"context_line":"            member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":4020,"context_line":"            for rc_name, amount in request.resources.items():"},{"line_number":4021,"context_line":"                rc_id \u003d _RC_CACHE.id_from_string(rc_name)"},{"line_number":4022,"context_line":"                if rc_id not in sharing:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_75461452","line":4019,"range":{"start_line":4019,"start_character":12,"end_line":4019,"end_character":59},"updated":"2018-08-09 16:02:46.000000000","message":"This can be\n\n member_of \u003d request.member_of\n\nper above\n\n(or just inline it on L4024)","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cb61c4c625346ab502b1ad9bd53cf6706bbaf761","unresolved":false,"context_lines":[{"line_number":4016,"context_line":"        # internal functions handling that part of the request."},{"line_number":4017,"context_line":"        sharing \u003d {}"},{"line_number":4018,"context_line":"        for _ignore, request in requests.items():"},{"line_number":4019,"context_line":"            member_of \u003d getattr(request, \"member_of\", None)"},{"line_number":4020,"context_line":"            for rc_name, amount in request.resources.items():"},{"line_number":4021,"context_line":"                rc_id \u003d _RC_CACHE.id_from_string(rc_name)"},{"line_number":4022,"context_line":"                if rc_id not in sharing:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_014e826e","line":4019,"range":{"start_line":4019,"start_character":12,"end_line":4019,"end_character":59},"in_reply_to":"3f79a3b5_75461452","updated":"2018-08-09 18:05:03.000000000","message":"Done","commit_id":"a922894f0e64d70bb1fb8744f0a3818aae066402"}]}
