)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"208cb39f32dcd3668babf9e6d3d79a587bd7e941","unresolved":false,"context_lines":[{"line_number":11,"context_line":"moves the ResourceProvider._set_traits() @staticmethod to the module"},{"line_number":12,"context_line":"scope. In addition to this move, we also remove the @remotable"},{"line_number":13,"context_line":"decoration on the ResourceProvider.set_traits() instance method (since"},{"line_number":14,"context_line":"no resource provider objects are sent over RPC) and we ensure that the"},{"line_number":15,"context_line":"resource provider object itself after setting traits (since the"},{"line_number":16,"context_line":"provider generation is incremented)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I7667a6a4cedfe8cc4abb0785530e0859fb0c8bcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7f515b1d_3bbe84ff","line":15,"range":{"start_line":14,"start_character":48,"end_line":15,"end_character":52},"updated":"2017-10-04 22:16:23.000000000","message":"Is this missing a verb clause?","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"642c308ae8f6b47a19c7d942a931875caf7811e5","unresolved":false,"context_lines":[{"line_number":11,"context_line":"moves the ResourceProvider._set_traits() @staticmethod to the module"},{"line_number":12,"context_line":"scope. In addition to this move, we also remove the @remotable"},{"line_number":13,"context_line":"decoration on the ResourceProvider.set_traits() instance method (since"},{"line_number":14,"context_line":"no resource provider objects are sent over RPC) and we ensure that the"},{"line_number":15,"context_line":"resource provider object itself after setting traits (since the"},{"line_number":16,"context_line":"provider generation is incremented)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I7667a6a4cedfe8cc4abb0785530e0859fb0c8bcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7f515b1d_5588d3c4","line":15,"range":{"start_line":14,"start_character":48,"end_line":15,"end_character":52},"in_reply_to":"7f515b1d_3bbe84ff","updated":"2017-10-05 15:00:56.000000000","message":"Done","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"92cd49f9485dd9158a9df1601a66d50f86a823ea","unresolved":false,"context_lines":[{"line_number":11,"context_line":"moves the ResourceProvider._set_traits() @staticmethod to the module"},{"line_number":12,"context_line":"scope. In addition to this move, we also remove the @remotable"},{"line_number":13,"context_line":"decoration on the ResourceProvider.set_traits() instance method (since"},{"line_number":14,"context_line":"no resource provider objects are sent over RPC) and we ensure that the"},{"line_number":15,"context_line":"resource provider object itself after setting traits (since the"},{"line_number":16,"context_line":"provider generation is incremented)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I7667a6a4cedfe8cc4abb0785530e0859fb0c8bcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7f515b1d_23676054","line":15,"range":{"start_line":14,"start_character":48,"end_line":15,"end_character":52},"in_reply_to":"7f515b1d_3bbe84ff","updated":"2017-10-05 14:27:08.000000000","message":"yes, don\u0027t know what it is","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7a613649688cbf6e23818f859c93a16158486c7c","unresolved":false,"context_lines":[{"line_number":12,"context_line":"scope. In addition to this move, we also remove the @remotable"},{"line_number":13,"context_line":"decoration on the ResourceProvider.set_traits() instance method (since"},{"line_number":14,"context_line":"no resource provider objects are sent over RPC) and we ensure that the"},{"line_number":15,"context_line":"resource provider object itself resets changes after setting traits (since the"},{"line_number":16,"context_line":"provider generation is incremented)."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I7667a6a4cedfe8cc4abb0785530e0859fb0c8bcf"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7f515b1d_c9d54a1d","line":15,"range":{"start_line":15,"start_character":72,"end_line":15,"end_character":78},"updated":"2017-10-05 16:10:09.000000000","message":"tsk","commit_id":"d954112d3752f44af975317304957496833cba1d"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f8bf0a944506884d54d6ea93f9f8bdf40b06fb5c","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                       associate with the provider."},{"line_number":625,"context_line":"        \"\"\""},{"line_number":626,"context_line":"        _set_traits(self._context, self, traits)"},{"line_number":627,"context_line":"        self.obj_reset_changes()"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    @staticmethod"},{"line_number":630,"context_line":"    @db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_2de2d530","line":627,"updated":"2017-10-04 14:21:21.000000000","message":"It was a bug that we weren\u0027t doing this before I guess. Surely we could add an assertion to a test to make sure we\u0027re doing this now right?","commit_id":"f3bee3c933d38363877cc17a0bf941917c934976"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"13b34658d2121e6afdf8decf42d2e80fdfddbef3","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                       associate with the provider."},{"line_number":625,"context_line":"        \"\"\""},{"line_number":626,"context_line":"        _set_traits(self._context, self, traits)"},{"line_number":627,"context_line":"        self.obj_reset_changes()"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    @staticmethod"},{"line_number":630,"context_line":"    @db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_33d6b6f3","line":627,"in_reply_to":"7f515b1d_2de2d530","updated":"2017-10-04 18:09:53.000000000","message":"Done","commit_id":"f3bee3c933d38363877cc17a0bf941917c934976"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b6be645b1646de032013a537e04c2d70093fc3ef","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                       associate with the provider."},{"line_number":625,"context_line":"        \"\"\""},{"line_number":626,"context_line":"        _set_traits(self._context, self, traits)"},{"line_number":627,"context_line":"        self.obj_reset_changes()"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    @staticmethod"},{"line_number":630,"context_line":"    @db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f515b1d_73c78e47","line":627,"in_reply_to":"7f515b1d_2de2d530","updated":"2017-10-04 15:41:06.000000000","message":"ack.","commit_id":"f3bee3c933d38363877cc17a0bf941917c934976"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"208cb39f32dcd3668babf9e6d3d79a587bd7e941","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"@db_api.api_context_manager.writer"},{"line_number":500,"context_line":"def _set_traits(context, rp, traits):"},{"line_number":501,"context_line":"    existing_traits \u003d _get_traits_by_provider_id(context, rp.id)"},{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_bbb034df","line":500,"range":{"start_line":500,"start_character":4,"end_line":500,"end_character":15},"updated":"2017-10-04 22:16:23.000000000","message":"Man, this could use a docstring.  Took me like 20 minutes to figure out that `traits` is a TraitList, while the result from _get_traits_by_provider_id is a list of {\u0027id\u0027: ..., \u0027name\u0027: ...}","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"642c308ae8f6b47a19c7d942a931875caf7811e5","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"@db_api.api_context_manager.writer"},{"line_number":500,"context_line":"def _set_traits(context, rp, traits):"},{"line_number":501,"context_line":"    existing_traits \u003d _get_traits_by_provider_id(context, rp.id)"},{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_d5196388","line":500,"range":{"start_line":500,"start_character":4,"end_line":500,"end_character":15},"in_reply_to":"7f515b1d_bbb034df","updated":"2017-10-05 15:00:56.000000000","message":"Done","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4538455eca22ae18672230357ffb284f6a2ea8af","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"@db_api.api_context_manager.writer"},{"line_number":500,"context_line":"def _set_traits(context, rp, traits):"},{"line_number":501,"context_line":"    existing_traits \u003d _get_traits_by_provider_id(context, rp.id)"},{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_3b068422","line":500,"range":{"start_line":500,"start_character":4,"end_line":500,"end_character":15},"in_reply_to":"7f515b1d_bbb034df","updated":"2017-10-04 22:24:34.000000000","message":"agreed. will add.","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"208cb39f32dcd3668babf9e6d3d79a587bd7e941","unresolved":false,"context_lines":[{"line_number":499,"context_line":"@db_api.api_context_manager.writer"},{"line_number":500,"context_line":"def _set_traits(context, rp, traits):"},{"line_number":501,"context_line":"    existing_traits \u003d _get_traits_by_provider_id(context, rp.id)"},{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":506,"context_line":"        set(existing_traits_dict.keys()))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_7b02bc40","line":503,"range":{"start_line":502,"start_character":0,"end_line":503,"end_character":78},"updated":"2017-10-04 22:16:23.000000000","message":"Why are we doing this whole business by names rather than IDs?  Is it possible that the Traits in the `traits` parameter don\u0027t have their IDs populated?","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4538455eca22ae18672230357ffb284f6a2ea8af","unresolved":false,"context_lines":[{"line_number":499,"context_line":"@db_api.api_context_manager.writer"},{"line_number":500,"context_line":"def _set_traits(context, rp, traits):"},{"line_number":501,"context_line":"    existing_traits \u003d _get_traits_by_provider_id(context, rp.id)"},{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":506,"context_line":"        set(existing_traits_dict.keys()))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_d602a509","line":503,"range":{"start_line":502,"start_character":0,"end_line":503,"end_character":78},"in_reply_to":"7f515b1d_7b02bc40","updated":"2017-10-04 22:24:34.000000000","message":"that\u0027s exactly why we are doing this, yes. Remember that IDs are not known outside of the DB...","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"208cb39f32dcd3668babf9e6d3d79a587bd7e941","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":506,"context_line":"        set(existing_traits_dict.keys()))"},{"line_number":507,"context_line":"    to_delete_names \u003d (set(existing_traits_dict.keys()) -"},{"line_number":508,"context_line":"        set(traits_dict.keys()))"},{"line_number":509,"context_line":"    to_delete_ids \u003d [existing_traits_dict[name][\u0027id\u0027]"},{"line_number":510,"context_line":"                        for name in to_delete_names]"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_bb5834fa","line":508,"range":{"start_line":505,"start_character":0,"end_line":508,"end_character":32},"updated":"2017-10-04 22:16:23.000000000","message":"Okay, .keys() redundant *here* :)","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"642c308ae8f6b47a19c7d942a931875caf7811e5","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":506,"context_line":"        set(existing_traits_dict.keys()))"},{"line_number":507,"context_line":"    to_delete_names \u003d (set(existing_traits_dict.keys()) -"},{"line_number":508,"context_line":"        set(traits_dict.keys()))"},{"line_number":509,"context_line":"    to_delete_ids \u003d [existing_traits_dict[name][\u0027id\u0027]"},{"line_number":510,"context_line":"                        for name in to_delete_names]"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_1507fb1e","line":508,"range":{"start_line":505,"start_character":0,"end_line":508,"end_character":32},"in_reply_to":"7f515b1d_bb5834fa","updated":"2017-10-05 15:00:56.000000000","message":"Done","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4538455eca22ae18672230357ffb284f6a2ea8af","unresolved":false,"context_lines":[{"line_number":502,"context_line":"    traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":503,"context_line":"    existing_traits_dict \u003d {trait[\u0027name\u0027]: trait for trait in existing_traits}"},{"line_number":504,"context_line":""},{"line_number":505,"context_line":"    to_add_names \u003d (set(traits_dict.keys()) -"},{"line_number":506,"context_line":"        set(existing_traits_dict.keys()))"},{"line_number":507,"context_line":"    to_delete_names \u003d (set(existing_traits_dict.keys()) -"},{"line_number":508,"context_line":"        set(traits_dict.keys()))"},{"line_number":509,"context_line":"    to_delete_ids \u003d [existing_traits_dict[name][\u0027id\u0027]"},{"line_number":510,"context_line":"                        for name in to_delete_names]"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_960c2d3c","line":508,"range":{"start_line":505,"start_character":0,"end_line":508,"end_character":32},"in_reply_to":"7f515b1d_bb5834fa","updated":"2017-10-04 22:24:34.000000000","message":"yes, understood.","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"92cd49f9485dd9158a9df1601a66d50f86a823ea","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                        for name in to_delete_names]"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    conn \u003d context.session.connection()"},{"line_number":513,"context_line":"    with conn.begin():"},{"line_number":514,"context_line":"        if to_delete_names:"},{"line_number":515,"context_line":"            context.session.query(models.ResourceProviderTrait).filter("},{"line_number":516,"context_line":"                sa.and_("},{"line_number":517,"context_line":"                    models.ResourceProviderTrait.trait_id.in_("},{"line_number":518,"context_line":"                        to_delete_ids),"},{"line_number":519,"context_line":"                    (models.ResourceProviderTrait.resource_provider_id \u003d\u003d"},{"line_number":520,"context_line":"                     rp.id)"},{"line_number":521,"context_line":"                )"},{"line_number":522,"context_line":"            ).delete(synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":523,"context_line":"        if to_add_names:"},{"line_number":524,"context_line":"            for name in to_add_names:"},{"line_number":525,"context_line":"                rp_trait \u003d models.ResourceProviderTrait()"},{"line_number":526,"context_line":"                rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":527,"context_line":"                rp_trait.resource_provider_id \u003d rp.id"},{"line_number":528,"context_line":"                context.session.add(rp_trait)"},{"line_number":529,"context_line":"        rp.generation \u003d _increment_provider_generation(conn, rp)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"@base.NovaObjectRegistry.register_if(False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_2383e0ab","line":529,"range":{"start_line":513,"start_character":0,"end_line":529,"end_character":64},"updated":"2017-10-05 14:27:08.000000000","message":"I know it is probably overkill, but I would be inclined to extract this to two separate methods","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"642c308ae8f6b47a19c7d942a931875caf7811e5","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                        for name in to_delete_names]"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    conn \u003d context.session.connection()"},{"line_number":513,"context_line":"    with conn.begin():"},{"line_number":514,"context_line":"        if to_delete_names:"},{"line_number":515,"context_line":"            context.session.query(models.ResourceProviderTrait).filter("},{"line_number":516,"context_line":"                sa.and_("},{"line_number":517,"context_line":"                    models.ResourceProviderTrait.trait_id.in_("},{"line_number":518,"context_line":"                        to_delete_ids),"},{"line_number":519,"context_line":"                    (models.ResourceProviderTrait.resource_provider_id \u003d\u003d"},{"line_number":520,"context_line":"                     rp.id)"},{"line_number":521,"context_line":"                )"},{"line_number":522,"context_line":"            ).delete(synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":523,"context_line":"        if to_add_names:"},{"line_number":524,"context_line":"            for name in to_add_names:"},{"line_number":525,"context_line":"                rp_trait \u003d models.ResourceProviderTrait()"},{"line_number":526,"context_line":"                rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":527,"context_line":"                rp_trait.resource_provider_id \u003d rp.id"},{"line_number":528,"context_line":"                context.session.add(rp_trait)"},{"line_number":529,"context_line":"        rp.generation \u003d _increment_provider_generation(conn, rp)"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"@base.NovaObjectRegistry.register_if(False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_753d0fdc","line":529,"range":{"start_line":513,"start_character":0,"end_line":529,"end_character":64},"in_reply_to":"7f515b1d_2383e0ab","updated":"2017-10-05 15:00:56.000000000","message":"can do in a follow up patch.","commit_id":"0507fd7d596ad1b1df0c24b87f6dad8c7ce48417"}]}
