)]}'
{"nova/compute/provider_tree.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1fd5bc66cf32765800cb04a27abb0ccf5f521d01","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _update_generation(self, generation):"},{"line_number":109,"context_line":"        if generation is not None and generation !\u003d self.generation:"},{"line_number":110,"context_line":"            msg_args \u003d {"},{"line_number":111,"context_line":"                \u0027rp_uuid\u0027: self.uuid,"},{"line_number":112,"context_line":"                \u0027old\u0027: self.generation,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_4510d1a8","line":109,"range":{"start_line":109,"start_character":22,"end_line":109,"end_character":34},"updated":"2017-12-08 14:12:07.000000000","message":"nit: this necessary?","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _update_generation(self, generation):"},{"line_number":109,"context_line":"        if generation is not None and generation !\u003d self.generation:"},{"line_number":110,"context_line":"            msg_args \u003d {"},{"line_number":111,"context_line":"                \u0027rp_uuid\u0027: self.uuid,"},{"line_number":112,"context_line":"                \u0027old\u0027: self.generation,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_ecd5e044","line":109,"range":{"start_line":109,"start_character":22,"end_line":109,"end_character":34},"in_reply_to":"df87a7cf_4510d1a8","updated":"2017-12-13 16:19:02.000000000","message":"I think it may be because generation \u003d 0 is a valid value","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return False"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _update_generation(self, generation):"},{"line_number":109,"context_line":"        if generation is not None and generation !\u003d self.generation:"},{"line_number":110,"context_line":"            msg_args \u003d {"},{"line_number":111,"context_line":"                \u0027rp_uuid\u0027: self.uuid,"},{"line_number":112,"context_line":"                \u0027old\u0027: self.generation,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_df23c904","line":109,"range":{"start_line":109,"start_character":22,"end_line":109,"end_character":34},"in_reply_to":"df87a7cf_ecd5e044","updated":"2017-12-14 13:05:53.000000000","message":"Correct; and \u0027None\u0027 is how we signify that we don\u0027t want to update the generation.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"759c55116d947cefcd911d78331aaa23bcb9b87f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            return True"},{"line_number":128,"context_line":"        return False"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def have_traits_changed(self, new):"},{"line_number":131,"context_line":"        \"\"\"Returns whether the provider\u0027s traits have changed.\"\"\""},{"line_number":132,"context_line":"        return set(new) !\u003d self.traits"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_e06d5332","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":27},"updated":"2017-12-08 14:51:11.000000000","message":"Since you have \u0027has_traits\u0027, a more consistent name here might be something like \u0027matches_traits\u0027. Or even better, change has_traits() signature to:\n\n  def has_traits(self, traits, exact\u003dFalse):\n\nThen this method is no longer needed.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            return True"},{"line_number":128,"context_line":"        return False"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def have_traits_changed(self, new):"},{"line_number":131,"context_line":"        \"\"\"Returns whether the provider\u0027s traits have changed.\"\"\""},{"line_number":132,"context_line":"        return set(new) !\u003d self.traits"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_112061f7","line":130,"range":{"start_line":130,"start_character":8,"end_line":130,"end_character":27},"in_reply_to":"df87a7cf_e06d5332","updated":"2017-12-13 16:19:02.000000000","message":"Done","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ef43b7a69eeaf0d8d64f87babfcfaf9b58bb55f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        self._update_generation(generation)"},{"line_number":140,"context_line":"        if self.have_traits_changed(new):"},{"line_number":141,"context_line":"            self.traits \u003d copy.copy(set(new))"},{"line_number":142,"context_line":"            return True"},{"line_number":143,"context_line":"        return False"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_65007502","line":141,"range":{"start_line":141,"start_character":26,"end_line":141,"end_character":45},"updated":"2017-12-08 14:19:11.000000000","message":"The set() constructor already creates a copy of the iterable so you don\u0027t have to copy it explicitly.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        self._update_generation(generation)"},{"line_number":140,"context_line":"        if self.have_traits_changed(new):"},{"line_number":141,"context_line":"            self.traits \u003d copy.copy(set(new))"},{"line_number":142,"context_line":"            return True"},{"line_number":143,"context_line":"        return False"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_517589cb","line":141,"range":{"start_line":141,"start_character":26,"end_line":141,"end_character":45},"in_reply_to":"df87a7cf_65007502","updated":"2017-12-13 16:19:02.000000000","message":"Done","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1fd5bc66cf32765800cb04a27abb0ccf5f521d01","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        return set(new) !\u003d self.traits"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def update_traits(self, new, generation\u003dNone):"},{"line_number":135,"context_line":"        \"\"\"Update the stored traits for the provider along with a resource"},{"line_number":136,"context_line":"        provider generation to set the provider to. The method returns whether"},{"line_number":137,"context_line":"        the traits have changed."},{"line_number":138,"context_line":"        \"\"\""},{"line_number":139,"context_line":"        self._update_generation(generation)"},{"line_number":140,"context_line":"        if self.have_traits_changed(new):"},{"line_number":141,"context_line":"            self.traits \u003d copy.copy(set(new))"},{"line_number":142,"context_line":"            return True"},{"line_number":143,"context_line":"        return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def has_traits(self, traits):"},{"line_number":146,"context_line":"        \"\"\"Query whether the provider has certain traits."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_65639543","line":143,"range":{"start_line":135,"start_character":0,"end_line":143,"end_character":20},"updated":"2017-12-08 14:12:07.000000000","message":"What\u0027s the rationale for splitting this out from \u0027update_inventory\u0027?","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1fd5bc66cf32765800cb04a27abb0ccf5f521d01","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            return True"},{"line_number":143,"context_line":"        return False"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def has_traits(self, traits):"},{"line_number":146,"context_line":"        \"\"\"Query whether the provider has certain traits."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param traits: Iterable of string trait names to look for."}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_455e9176","line":145,"range":{"start_line":145,"start_character":25,"end_line":145,"end_character":31},"updated":"2017-12-08 14:12:07.000000000","message":"Same nit:\n\n  *traits","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1fd5bc66cf32765800cb04a27abb0ccf5f521d01","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        :returns: True if the traits list has changed."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        :note: The provider\u0027s generation is always set to the supplied"},{"line_number":342,"context_line":"               generation, even if there were no changes to the traits."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :raises: ValueError if a provider with name_or_uuid was not found in"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_05d969f1","line":341,"range":{"start_line":341,"start_character":8,"end_line":341,"end_character":14},"updated":"2017-12-08 14:12:07.000000000","message":"Did you mean\n\n  .. note::\n\nYou can use field lists for this but it\u0027s atypical","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        :returns: True if the traits list has changed."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        :note: The provider\u0027s generation is always set to the supplied"},{"line_number":342,"context_line":"               generation, even if there were no changes to the traits."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :raises: ValueError if a provider with name_or_uuid was not found in"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_3155651e","line":341,"range":{"start_line":341,"start_character":8,"end_line":341,"end_character":14},"in_reply_to":"df87a7cf_05d969f1","updated":"2017-12-13 16:19:02.000000000","message":"I didn\u0027t touch this to keep changes minimal","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        :returns: True if the traits list has changed."},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        :note: The provider\u0027s generation is always set to the supplied"},{"line_number":342,"context_line":"               generation, even if there were no changes to the traits."},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        :raises: ValueError if a provider with name_or_uuid was not found in"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_dfd669c4","line":341,"range":{"start_line":341,"start_character":8,"end_line":341,"end_character":14},"in_reply_to":"df87a7cf_3155651e","updated":"2017-12-14 13:05:53.000000000","message":"Just a copy/paste from update_inventory.  If necessary, we can fix \u0027em all in a followup.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            return True"},{"line_number":130,"context_line":"        return False"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def matches_traits(self, new):"},{"line_number":133,"context_line":"        \"\"\"Returns whether the provider\u0027s traits have changed.\"\"\""},{"line_number":134,"context_line":"        return set(new) !\u003d self.traits"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_9f722111","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":22},"updated":"2017-12-14 13:05:53.000000000","message":"With this rename, we should reverse the logic.\n\nBut Ed, why do you say `matches_traits` is a more consistent name?  I modeled this after `has_inventory_changed`.","commit_id":"296fc0295ff81814ed874107cac3a663ac2f3270"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"788a35628d2ea2a63d4e21ff8ea161f51c94cb57","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            return True"},{"line_number":130,"context_line":"        return False"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def matches_traits(self, new):"},{"line_number":133,"context_line":"        \"\"\"Returns whether the provider\u0027s traits have changed.\"\"\""},{"line_number":134,"context_line":"        return set(new) !\u003d self.traits"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_944443b9","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":22},"in_reply_to":"df87a7cf_9f722111","updated":"2017-12-14 16:02:36.000000000","message":"Yup, in hindsight \u0027has_traits_changed\u0027 is a more correct name given what we\u0027re using this for","commit_id":"296fc0295ff81814ed874107cac3a663ac2f3270"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        \"\"\""},{"line_number":141,"context_line":"        self._update_generation(generation)"},{"line_number":142,"context_line":"        if self.matches_traits(new):"},{"line_number":143,"context_line":"            self.traits \u003d set(new)"},{"line_number":144,"context_line":"            return True"},{"line_number":145,"context_line":"        return False"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_5fcb391d","line":143,"range":{"start_line":143,"start_character":26,"end_line":143,"end_character":34},"updated":"2017-12-14 13:05:53.000000000","message":"If we\u0027re going to take out the copy(), I\u0027d like a comment here to make it clear that set() is making a copy.","commit_id":"296fc0295ff81814ed874107cac3a663ac2f3270"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"788a35628d2ea2a63d4e21ff8ea161f51c94cb57","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        \"\"\""},{"line_number":141,"context_line":"        self._update_generation(generation)"},{"line_number":142,"context_line":"        if self.matches_traits(new):"},{"line_number":143,"context_line":"            self.traits \u003d set(new)"},{"line_number":144,"context_line":"            return True"},{"line_number":145,"context_line":"        return False"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3413f7ba","line":143,"range":{"start_line":143,"start_character":26,"end_line":143,"end_character":34},"in_reply_to":"df87a7cf_5fcb391d","updated":"2017-12-14 16:02:36.000000000","message":"Done","commit_id":"296fc0295ff81814ed874107cac3a663ac2f3270"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"788a35628d2ea2a63d4e21ff8ea161f51c94cb57","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        \"\"\""},{"line_number":155,"context_line":"        return not bool(set(traits) - self.traits)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def have_aggregates_changed(self, new):"},{"line_number":158,"context_line":"        \"\"\"Returns whether the provider\u0027s aggregates have changed.\"\"\""},{"line_number":159,"context_line":"        return set(new) !\u003d self.aggregates"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_941d23bf","line":157,"range":{"start_line":157,"start_character":8,"end_line":157,"end_character":31},"updated":"2017-12-14 16:02:36.000000000","message":"Looks like I screwed up the rebase here","commit_id":"296fc0295ff81814ed874107cac3a663ac2f3270"}],"nova/tests/unit/compute/test_provider_tree.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ef43b7a69eeaf0d8d64f87babfcfaf9b58bb55f","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            \"HW_CPU_X86_AVX\","},{"line_number":223,"context_line":"        ]"},{"line_number":224,"context_line":"        self.assertTrue(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":225,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, []))"},{"line_number":226,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits))"},{"line_number":227,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits[:1]))"},{"line_number":228,"context_line":"        self.assertTrue(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_c5a621ac","line":225,"updated":"2017-12-08 14:19:11.000000000","message":"That looks strange but I seem correct. Every possible RP will have the \u0027nothing\u0027 as part of its traits list.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            \"HW_CPU_X86_AVX\","},{"line_number":223,"context_line":"        ]"},{"line_number":224,"context_line":"        self.assertTrue(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":225,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, []))"},{"line_number":226,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits))"},{"line_number":227,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits[:1]))"},{"line_number":228,"context_line":"        self.assertTrue(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5ff4995b","line":225,"in_reply_to":"df87a7cf_c5a621ac","updated":"2017-12-14 13:05:53.000000000","message":"Yeah, later I started using have_traits_changed to do an exact match, which is probably what we should do here (and throughout)","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ef43b7a69eeaf0d8d64f87babfcfaf9b58bb55f","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits))"},{"line_number":230,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[:1]))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # Updating with the same traits info should return False"},{"line_number":233,"context_line":"        self.assertFalse(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":234,"context_line":"        # But the generation should get updated"},{"line_number":235,"context_line":"        rp_gen \u003d 2"},{"line_number":236,"context_line":"        self.assertFalse(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_65bf1561","line":233,"range":{"start_line":232,"start_character":0,"end_line":233,"end_character":65},"updated":"2017-12-08 14:19:11.000000000","message":"The comment and the assert are not in sync or I\u0027m missing something","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits))"},{"line_number":230,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[:1]))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # Updating with the same traits info should return False"},{"line_number":233,"context_line":"        self.assertFalse(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":234,"context_line":"        # But the generation should get updated"},{"line_number":235,"context_line":"        rp_gen \u003d 2"},{"line_number":236,"context_line":"        self.assertFalse(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_ac5a7827","line":233,"range":{"start_line":232,"start_character":0,"end_line":233,"end_character":65},"in_reply_to":"df87a7cf_65bf1561","updated":"2017-12-13 16:19:02.000000000","message":"This makes sense to me - he\u0027s checking to see if the \u0027have_traits_changed\u0027 function returns False (i.e. traits have *not* changed) if we provide the same list of traits we only updated the ProviderTree with on L228","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3cff39a7ad00ccbf6cd0e951b29bc813c2a9b292","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits))"},{"line_number":230,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[:1]))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # Updating with the same traits info should return False"},{"line_number":233,"context_line":"        self.assertFalse(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":234,"context_line":"        # But the generation should get updated"},{"line_number":235,"context_line":"        rp_gen \u003d 2"},{"line_number":236,"context_line":"        self.assertFalse(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5f99f91c","line":233,"range":{"start_line":232,"start_character":0,"end_line":233,"end_character":65},"in_reply_to":"df87a7cf_ac5a7827","updated":"2017-12-14 13:05:53.000000000","message":"Right","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0ef43b7a69eeaf0d8d64f87babfcfaf9b58bb55f","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        traits.append(\"HW_GPU_RESOLUTION_W800H600\")"},{"line_number":243,"context_line":"        self.assertTrue(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":244,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits[-1:]))"},{"line_number":245,"context_line":"        # Don\u0027t update the generation (this would normally be a bug, but we\u0027re"},{"line_number":246,"context_line":"        # testing generation\u003dNone and its (non) effect on have_traits_changed.)"},{"line_number":247,"context_line":"        self.assertTrue(pt.update_traits(cn.uuid, traits))"},{"line_number":248,"context_line":"        self.assertEqual(rp_gen, pt._find_with_lock(cn.uuid).generation)"},{"line_number":249,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[-1:]))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_a5567d29","line":246,"range":{"start_line":245,"start_character":1,"end_line":246,"end_character":1},"updated":"2017-12-08 14:19:11.000000000","message":"As per IRC it is not a bug if the client adds a new trait to the RP as the generation is updated by the server.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        traits.append(\"HW_GPU_RESOLUTION_W800H600\")"},{"line_number":243,"context_line":"        self.assertTrue(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":244,"context_line":"        self.assertFalse(pt.has_traits(cn.uuid, traits[-1:]))"},{"line_number":245,"context_line":"        # Don\u0027t update the generation (this would normally be a bug, but we\u0027re"},{"line_number":246,"context_line":"        # testing generation\u003dNone and its (non) effect on have_traits_changed.)"},{"line_number":247,"context_line":"        self.assertTrue(pt.update_traits(cn.uuid, traits))"},{"line_number":248,"context_line":"        self.assertEqual(rp_gen, pt._find_with_lock(cn.uuid).generation)"},{"line_number":249,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[-1:]))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_ac7358b1","line":246,"range":{"start_line":245,"start_character":1,"end_line":246,"end_character":1},"in_reply_to":"df87a7cf_a5567d29","updated":"2017-12-13 16:19:02.000000000","message":"Done","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1f7ab09c7936cc7b1cf650ca169d9b2c0e49d4da","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        self.assertEqual(rp_gen, pt._find_with_lock(cn.uuid).generation)"},{"line_number":249,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[-1:]))"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        # Now set a new generation; does *not* signal that traits have changed."},{"line_number":252,"context_line":"        rp_gen \u003d 3"},{"line_number":253,"context_line":"        self.assertFalse(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"},{"line_number":254,"context_line":"        self.assertFalse(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":255,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits))"},{"line_number":256,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, []))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_13b0c542","line":256,"range":{"start_line":251,"start_character":0,"end_line":256,"end_character":51},"updated":"2017-12-11 01:00:35.000000000","message":"Validation for updated generation is gone with PS4-\u003ePS5. But before that do we really need this test? We have already tested updating only generation without updating traits case above.","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aba00f5cccf0abeb4b2192a2b3a918a963e04f2d","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        self.assertEqual(rp_gen, pt._find_with_lock(cn.uuid).generation)"},{"line_number":249,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits[-1:]))"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        # Now set a new generation; does *not* signal that traits have changed."},{"line_number":252,"context_line":"        rp_gen \u003d 3"},{"line_number":253,"context_line":"        self.assertFalse(pt.update_traits(cn.uuid, traits, generation\u003drp_gen))"},{"line_number":254,"context_line":"        self.assertFalse(pt.have_traits_changed(cn.uuid, traits))"},{"line_number":255,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, traits))"},{"line_number":256,"context_line":"        self.assertTrue(pt.has_traits(cn.uuid, []))"}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_0c904495","line":256,"range":{"start_line":251,"start_character":0,"end_line":256,"end_character":51},"in_reply_to":"df87a7cf_13b0c542","updated":"2017-12-13 16:19:02.000000000","message":"Indeed. I moved the only check we cared about here - have_traits_changed - up","commit_id":"204c591f8c2fa8d745572fcb9bd26c13f65012cc"}]}
