)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4a9fd96a5c2ba1cff2d5a3b3124b8b3c86f2beae","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider_id()"},{"line_number":16,"context_line":"@classmethod that matches similar items like"},{"line_number":17,"context_line":"UsageList.get_all_by_resource_provider_uuid() and"},{"line_number":18,"context_line":"AllocationList.get_all_by_resource_provider_uuid(). Note that instead of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f515b1d_20a76f52","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":63},"updated":"2017-10-04 21:46:53.000000000","message":"get_all_by_resource_provider_id","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ffa5cc1806f0ac3d3b3bf9ccbfe91c2e80ddcf44","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider_id()"},{"line_number":16,"context_line":"@classmethod that matches similar items like"},{"line_number":17,"context_line":"UsageList.get_all_by_resource_provider_uuid() and"},{"line_number":18,"context_line":"AllocationList.get_all_by_resource_provider_uuid(). Note that instead of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f515b1d_d5fe0304","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":63},"in_reply_to":"7f515b1d_20a76f52","updated":"2017-10-05 14:46:44.000000000","message":"Done","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"25623dff6a41c40c2740f858d89a9b92650f5115","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider()"},{"line_number":16,"context_line":"@classmethod that accepts a ResourceProvider object and returns a"},{"line_number":17,"context_line":"TraitList containing traits associated with the resource provider."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7f515b1d_8b3aaae4","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":60},"updated":"2017-10-05 15:36:01.000000000","message":"get_all_by_resource_provider_id","commit_id":"446448c513e26e4e2325d1af90a94f34a713ab4a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"190c4d83953e7d43a6dc598fb9b670e190c3ecde","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider()"},{"line_number":16,"context_line":"@classmethod that accepts a ResourceProvider object and returns a"},{"line_number":17,"context_line":"TraitList containing traits associated with the resource provider."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7f515b1d_6e0bfc23","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":60},"in_reply_to":"7f515b1d_8b3aaae4","updated":"2017-10-05 15:36:49.000000000","message":"it\u0027s actually get_all_by_resource_provider(), but yeah, I\u0027ll fix up.","commit_id":"446448c513e26e4e2325d1af90a94f34a713ab4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e93ea79a3cd1ee8a4b7a5bdbec106c5e0f85af88","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider()"},{"line_number":16,"context_line":"@classmethod that accepts a ResourceProvider object and returns a"},{"line_number":17,"context_line":"TraitList containing traits associated with the resource provider."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7f515b1d_b4d35ed5","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":60},"updated":"2017-10-06 19:43:45.000000000","message":"get_all_by_resource_provider","commit_id":"d4c91140e216e12511c9e8a7d0f004e2cd0e8f5a"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4c2cd347d7aa9f13fcda1c693e52c809aacd55dd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"ResourceProvider.get_traits() instance method."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch makes the getting of resource provider traits follow a"},{"line_number":15,"context_line":"consistent pattern and makes a TraitList.get_all_by_provider()"},{"line_number":16,"context_line":"@classmethod that accepts a ResourceProvider object and returns a"},{"line_number":17,"context_line":"TraitList containing traits associated with the resource provider."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7f515b1d_34a64e55","line":15,"range":{"start_line":15,"start_character":41,"end_line":15,"end_character":60},"in_reply_to":"7f515b1d_b4d35ed5","updated":"2017-10-06 19:47:48.000000000","message":"damn it. will fix if need to push another.","commit_id":"d4c91140e216e12511c9e8a7d0f004e2cd0e8f5a"}],"nova/api/openstack/placement/handlers/trait.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b269f85121dccaf4bfeb743194f2a5cc2e757749","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":199,"context_line":"    uuid \u003d util.wsgi_path_item(req.environ, \u0027uuid\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    # Resource provider object needed for two things: If it is"},{"line_number":202,"context_line":"    # NotFound we\u0027ll get a 404 here, which needs to happen because"},{"line_number":203,"context_line":"    # get_all_by_resource_provider_id can return an empty list."},{"line_number":204,"context_line":"    # It is also needed for the generation, used in the outgoing"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_8a752fcf","line":201,"range":{"start_line":201,"start_character":31,"end_line":201,"end_character":37},"updated":"2017-10-04 14:18:58.000000000","message":"is needed?","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ffa5cc1806f0ac3d3b3bf9ccbfe91c2e80ddcf44","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":199,"context_line":"    uuid \u003d util.wsgi_path_item(req.environ, \u0027uuid\u0027)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    # Resource provider object needed for two things: If it is"},{"line_number":202,"context_line":"    # NotFound we\u0027ll get a 404 here, which needs to happen because"},{"line_number":203,"context_line":"    # get_all_by_resource_provider_id can return an empty list."},{"line_number":204,"context_line":"    # It is also needed for the generation, used in the outgoing"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_350d5735","line":201,"range":{"start_line":201,"start_character":31,"end_line":201,"end_character":37},"in_reply_to":"7f515b1d_8a752fcf","updated":"2017-10-05 14:46:44.000000000","message":"Done","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"dface5917cfad73f1a455c21e418135279cca95c","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    # representation."},{"line_number":206,"context_line":"    try:"},{"line_number":207,"context_line":"        rp \u003d rp_obj.ResourceProvider.get_by_uuid(context, uuid)"},{"line_number":208,"context_line":"    except exception.NotFound as exc:"},{"line_number":209,"context_line":"        raise webob.exc.HTTPNotFound("},{"line_number":210,"context_line":"            _(\"No resource provider with uuid %(uuid)s found: %(error)s\") %"},{"line_number":211,"context_line":"             {\u0027uuid\u0027: uuid, \u0027error\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_e3fca8b6","line":208,"updated":"2017-10-05 14:16:19.000000000","message":"Note that this isn\u0027t strictly necessary. Because NotFound is fairly common throughout the handlers there\u0027s an app level catch at https://github.com/openstack/nova/blob/e4f89ed5dd4259188d020749fa8fb1c77be2c03a/nova/api/openstack/placement/handler.py#L218-L222\n\nExplicit is nice though.","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b269f85121dccaf4bfeb743194f2a5cc2e757749","unresolved":false,"context_lines":[{"line_number":627,"context_line":"            )).all()"},{"line_number":628,"context_line":"        return db_traits"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"    @base.remotable"},{"line_number":631,"context_line":"    def get_traits(self):"},{"line_number":632,"context_line":"        db_traits \u003d self._get_traits_from_db(self._context, self.id)"},{"line_number":633,"context_line":"        return base.obj_make_list(self._context, TraitList(self._context),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_0dfef904","side":"PARENT","line":630,"updated":"2017-10-04 14:18:58.000000000","message":"I guess we missed this when we de-remoted all the objects.","commit_id":"9d2af127588384727e6d0dd4538a0ace250d4f6e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4a9fd96a5c2ba1cff2d5a3b3124b8b3c86f2beae","unresolved":false,"context_lines":[{"line_number":638,"context_line":"            trait[\u0027name\u0027]: trait for trait in existing_traits"},{"line_number":639,"context_line":"        }"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":642,"context_line":"            set(existing_traits_dict.keys()))"},{"line_number":643,"context_line":"        to_delete_names \u003d (set(existing_traits_dict.keys()) -"},{"line_number":644,"context_line":"            set(traits_dict.keys()))"},{"line_number":645,"context_line":"        to_delete_ids \u003d [existing_traits_dict[name][\u0027id\u0027]"},{"line_number":646,"context_line":"                            for name in to_delete_names]"},{"line_number":647,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_7b119c53","line":644,"range":{"start_line":641,"start_character":23,"end_line":644,"end_character":36},"updated":"2017-10-04 21:46:53.000000000","message":".keys() redundant here","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c6c33932d6a78a3e613d2ac5560265f5a8be66a1","unresolved":false,"context_lines":[{"line_number":638,"context_line":"            trait[\u0027name\u0027]: trait for trait in existing_traits"},{"line_number":639,"context_line":"        }"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":642,"context_line":"            set(existing_traits_dict.keys()))"},{"line_number":643,"context_line":"        to_delete_names \u003d (set(existing_traits_dict.keys()) -"},{"line_number":644,"context_line":"            set(traits_dict.keys()))"},{"line_number":645,"context_line":"        to_delete_ids \u003d [existing_traits_dict[name][\u0027id\u0027]"},{"line_number":646,"context_line":"                            for name in to_delete_names]"},{"line_number":647,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_5bc14080","line":644,"range":{"start_line":641,"start_character":23,"end_line":644,"end_character":36},"in_reply_to":"7f515b1d_7b119c53","updated":"2017-10-04 21:51:57.000000000","message":"Tried to change as little existing code as possible in the patch. Will do in a later patch.","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4a9fd96a5c2ba1cff2d5a3b3124b8b3c86f2beae","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            if to_add_names:"},{"line_number":660,"context_line":"                for name in to_add_names:"},{"line_number":661,"context_line":"                    rp_trait \u003d models.ResourceProviderTrait()"},{"line_number":662,"context_line":"                    rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":663,"context_line":"                    rp_trait.resource_provider_id \u003d _id"},{"line_number":664,"context_line":"                    context.session.add(rp_trait)"},{"line_number":665,"context_line":"            rp.generation \u003d _increment_provider_generation(conn, rp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_db9e50b7","line":662,"range":{"start_line":662,"start_character":57,"end_line":662,"end_character":60},"updated":"2017-10-04 21:46:53.000000000","message":"[\u0027id\u0027] ?  (or why was it done that way on L645?)\n\nMay imply missing test case.","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c6c33932d6a78a3e613d2ac5560265f5a8be66a1","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            if to_add_names:"},{"line_number":660,"context_line":"                for name in to_add_names:"},{"line_number":661,"context_line":"                    rp_trait \u003d models.ResourceProviderTrait()"},{"line_number":662,"context_line":"                    rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":663,"context_line":"                    rp_trait.resource_provider_id \u003d _id"},{"line_number":664,"context_line":"                    context.session.add(rp_trait)"},{"line_number":665,"context_line":"            rp.generation \u003d _increment_provider_generation(conn, rp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_fb5eace7","line":662,"range":{"start_line":662,"start_character":57,"end_line":662,"end_character":60},"in_reply_to":"7f515b1d_db9e50b7","updated":"2017-10-04 21:51:57.000000000","message":"645 is because existing_traits is now a list of dicts, not a list of SQLAlchemy ORM model objects.\n\ntraits_dict, on the other hand, is a dict of nova.objects.resource_provider.Trait objects.","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c2fc931b77d79a231dc1f6d43565d1ff7ad73976","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            if to_add_names:"},{"line_number":660,"context_line":"                for name in to_add_names:"},{"line_number":661,"context_line":"                    rp_trait \u003d models.ResourceProviderTrait()"},{"line_number":662,"context_line":"                    rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":663,"context_line":"                    rp_trait.resource_provider_id \u003d _id"},{"line_number":664,"context_line":"                    context.session.add(rp_trait)"},{"line_number":665,"context_line":"            rp.generation \u003d _increment_provider_generation(conn, rp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_5bcca060","line":662,"range":{"start_line":662,"start_character":57,"end_line":662,"end_character":60},"in_reply_to":"7f515b1d_fb5eace7","updated":"2017-10-04 22:03:56.000000000","message":"Okay, yeah, just figured that out in the subsequent patch.  This is pretty confusing; would be more readable/maintainable if those guys were normalized to look the same.","commit_id":"c28b0117b74c447e1d841b4cc74fefea97b4edd5"}]}
