)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"placement: Enable attach traits to ResourceProvider"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds themethods to attach traits to the ResourceProvider"},{"line_number":10,"context_line":"in the versioned object."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The set/get_traits methods is added to ResourceProvider object which"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_03d825ec","line":9,"updated":"2017-03-29 19:12:25.000000000","message":"s/themethods/methods/","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"placement: Enable attach traits to ResourceProvider"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds themethods to attach traits to the ResourceProvider"},{"line_number":10,"context_line":"in the versioned object."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The set/get_traits methods is added to ResourceProvider object which"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_89a32bb2","line":9,"in_reply_to":"ffe62b97_03d825ec","updated":"2017-03-30 02:51:10.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The set/get_traits methods is added to ResourceProvider object which"},{"line_number":13,"context_line":"is used to attach traits to resource provider."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The Traits.get_all supports filtering by associated or not."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The Traits.delete won\u0027t delete the trait which associated with any"},{"line_number":18,"context_line":"resource provider."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_c3f6bd5d","line":15,"updated":"2017-03-29 19:12:25.000000000","message":"s/Traits/TraitList/","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The set/get_traits methods is added to ResourceProvider object which"},{"line_number":13,"context_line":"is used to attach traits to resource provider."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The Traits.get_all supports filtering by associated or not."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The Traits.delete won\u0027t delete the trait which associated with any"},{"line_number":18,"context_line":"resource provider."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_49a9a38d","line":15,"in_reply_to":"ffe62b97_c3f6bd5d","updated":"2017-03-30 02:51:10.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The Traits.get_all supports filtering by associated or not."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The Traits.delete won\u0027t delete the trait which associated with any"},{"line_number":18,"context_line":"resource provider."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Part of implement blueprint resource-provider-traits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_238b29c3","line":17,"updated":"2017-03-29 19:12:25.000000000","message":"s/Traits/Trait/","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The Traits.get_all supports filtering by associated or not."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The Traits.delete won\u0027t delete the trait which associated with any"},{"line_number":18,"context_line":"resource provider."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Part of implement blueprint resource-provider-traits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ffe62b97_09971b4a","line":17,"in_reply_to":"ffe62b97_238b29c3","updated":"2017-03-30 02:51:10.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"}],"nova/exception.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8fe83bc62d0ce6e91600bff98c337acd689d1a2f","unresolved":false,"context_lines":[{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"class TraitInUse(Invalid):"},{"line_number":2155,"context_line":"    msg_fmt \u003d _(\"Cannot delete trait %(name)s. \""},{"line_number":2156,"context_line":"                \"Trait is in use in resource provider.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_5e2015f8","line":2156,"updated":"2017-03-14 16:12:31.000000000","message":"maybe \"in use by a resource provider\"?","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e7e753dbfe49d3c4cae4a6b1681d2938e63e377","unresolved":false,"context_lines":[{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"class TraitInUse(Invalid):"},{"line_number":2155,"context_line":"    msg_fmt \u003d _(\"Cannot delete trait %(name)s. \""},{"line_number":2156,"context_line":"                \"Trait is in use in resource provider.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a1ced50_14d2c2d2","line":2156,"in_reply_to":"3a1ff146_5e2015f8","updated":"2017-03-19 07:53:34.000000000","message":"Done","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"9b6b4e8ae586cd0e1b27433e969032d7ec9531df","unresolved":false,"context_lines":[{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"class TraitInUse(Invalid):"},{"line_number":2155,"context_line":"    msg_fmt \u003d _(\"Cannot delete trait %(name)s. \""},{"line_number":2156,"context_line":"                \"Trait is in use by a resource provider.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_25743899","line":2155,"range":{"start_line":2155,"start_character":17,"end_line":2155,"end_character":31},"updated":"2017-03-23 20:50:52.000000000","message":"From the exception name, this seems not only for \"delete\" case. So it would be nice to change this like\n\n The trait %(name)s is in use by a resource provider.","commit_id":"b8cf6e7a9b9015609d075db452b338a22bfbf08e"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f9e7995c5764cd81b106f1e2e7bc152e0ee5bf55","unresolved":false,"context_lines":[{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"class TraitInUse(Invalid):"},{"line_number":2155,"context_line":"    msg_fmt \u003d _(\"Cannot delete trait %(name)s. \""},{"line_number":2156,"context_line":"                \"Trait is in use by a resource provider.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"ffe62b97_7ad4d6bd","line":2155,"range":{"start_line":2155,"start_character":17,"end_line":2155,"end_character":31},"in_reply_to":"ffe62b97_25743899","updated":"2017-03-26 10:25:05.000000000","message":"yea, good point. I will change it.","commit_id":"b8cf6e7a9b9015609d075db452b338a22bfbf08e"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"2b25a4f8aa74c6ef78fe663cddcf9488a7fa3cbe","unresolved":false,"context_lines":[{"line_number":2152,"context_line":""},{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"class TraitInUse(Invalid):"},{"line_number":2155,"context_line":"    msg_fmt \u003d _(\"Cannot delete trait %(name)s. \""},{"line_number":2156,"context_line":"                \"Trait is in use by a resource provider.\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffe62b97_9bac558d","line":2156,"range":{"start_line":2155,"start_character":16,"end_line":2156,"end_character":16},"updated":"2017-03-24 20:20:16.000000000","message":"Can you check my comment of PS14, maybe I needed to put -1..","commit_id":"e051538350390eb4280ab17d1493b502a09404b0"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"49d818cee1c45514ac60944e3bafd0aacaeef099","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":276,"context_line":"        \u0027uuid\u0027: fields.UUIDField(nullable\u003dFalse),"},{"line_number":277,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dFalse),"},{"line_number":278,"context_line":"        \u0027generation\u0027: fields.IntegerField(nullable\u003dFalse),"},{"line_number":279,"context_line":"    }"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a8bc5a2_6a3e558d","line":278,"updated":"2016-09-26 08:29:17.000000000","message":"Better to add a field for traits?","commit_id":"cad78784fedcb4798d91d7a243efe5dcb943e294"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ef8cbcb6c4fe00d288c484a26d85ae88370b39b9","unresolved":false,"context_lines":[{"line_number":275,"context_line":"        \u0027id\u0027: fields.IntegerField(read_only\u003dTrue),"},{"line_number":276,"context_line":"        \u0027uuid\u0027: fields.UUIDField(nullable\u003dFalse),"},{"line_number":277,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dFalse),"},{"line_number":278,"context_line":"        \u0027generation\u0027: fields.IntegerField(nullable\u003dFalse),"},{"line_number":279,"context_line":"    }"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a8bc5a2_d022bc51","line":278,"in_reply_to":"5a8bc5a2_6a3e558d","updated":"2016-09-26 08:34:31.000000000","message":"yes, but I think we can do that later.","commit_id":"cad78784fedcb4798d91d7a243efe5dcb943e294"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"49d818cee1c45514ac60944e3bafd0aacaeef099","unresolved":false,"context_lines":[{"line_number":328,"context_line":" "},{"line_number":329,"context_line":"    @staticmethod"},{"line_number":330,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":331,"context_line":"    def _set_traits_to_db(context, _id, traits):"},{"line_number":332,"context_line":"        existed_traits \u003d ResourceProvider._get_traits_from_db(context, _id)"},{"line_number":333,"context_line":"        existed_trait_ids \u003d [trait.id for trait in existed_traits]"},{"line_number":334,"context_line":"        traits_ids \u003d [trait.id for trait in traits]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a8bc5a2_d0c63c99","line":331,"updated":"2016-09-26 08:29:17.000000000","message":"considering comments at https://review.openstack.org/#/c/376202/1/nova/api/openstack/placement/handlers/trait.py@137\n\nIt might be good to add non-exist traits to database, then add new ResourceroviderTraits into database.","commit_id":"cad78784fedcb4798d91d7a243efe5dcb943e294"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"5fe71bd7b0b8471adb3df3608e72972c4c9c7b0b","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        to_delete \u003d set(existed_trait_ids) - set(traits_ids)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        if to_delete:"},{"line_number":339,"context_line":"            context.query(models.ResourceProviderTraits).filter("},{"line_number":340,"context_line":"                models.ResourceProviderTraits.trait_id.in_(to_delete)).delete()"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        if to_add:"},{"line_number":343,"context_line":"            for trait_id in to_add:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a8bc5a2_57af017d","line":340,"range":{"start_line":339,"start_character":12,"end_line":340,"end_character":79},"updated":"2016-09-28 06:12:43.000000000","message":"Seems there\u0027s a bug.\n\nChange to:\ncontext.session.query(models.ResourceProviderTraits).filter(\n                models.ResourceProviderTraits.trait_id.in_(to_delete)\n                ).delete(synchronize_session\u003d\u0027fetch\u0027)","commit_id":"e949e85417bbeb78dbc7921f16bf80a46630e6ef"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e633ca05eab46277389b66ddb3cde33cd72966a3","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        to_delete \u003d set(existed_trait_ids) - set(traits_ids)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        if to_delete:"},{"line_number":339,"context_line":"            context.query(models.ResourceProviderTraits).filter("},{"line_number":340,"context_line":"                models.ResourceProviderTraits.trait_id.in_(to_delete)).delete()"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        if to_add:"},{"line_number":343,"context_line":"            for trait_id in to_add:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_637546c9","line":340,"range":{"start_line":339,"start_character":12,"end_line":340,"end_character":79},"in_reply_to":"5a8bc5a2_57af017d","updated":"2016-10-04 06:39:48.000000000","message":"yes, thanks, I saw an error related to this when test.","commit_id":"e949e85417bbeb78dbc7921f16bf80a46630e6ef"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c0eada76bd453412f5a8fbbcf11a8027bad6b8ad","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            for trait_id in to_add:"},{"line_number":344,"context_line":"                rp_trait \u003d models.ResourceProviderTraits()"},{"line_number":345,"context_line":"                rp_trait.trait_id \u003d trait_id"},{"line_number":346,"context_line":"                rp_trait.resource_provider_id \u003d _id"},{"line_number":347,"context_line":"                context.session.add(rp_trait)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_80c58b8f","line":346,"updated":"2016-09-29 15:16:25.000000000","message":"Adding traits should presumably update the generation of the resource provider?","commit_id":"e949e85417bbeb78dbc7921f16bf80a46630e6ef"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e633ca05eab46277389b66ddb3cde33cd72966a3","unresolved":false,"context_lines":[{"line_number":343,"context_line":"            for trait_id in to_add:"},{"line_number":344,"context_line":"                rp_trait \u003d models.ResourceProviderTraits()"},{"line_number":345,"context_line":"                rp_trait.trait_id \u003d trait_id"},{"line_number":346,"context_line":"                rp_trait.resource_provider_id \u003d _id"},{"line_number":347,"context_line":"                context.session.add(rp_trait)"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @base.remotable"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_236fbefc","line":346,"in_reply_to":"3a98d1f4_80c58b8f","updated":"2016-10-04 06:39:48.000000000","message":"yes, I will update generation, thanks for point this out.","commit_id":"e949e85417bbeb78dbc7921f16bf80a46630e6ef"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"37ece08b220f010a5809032ddb711cf732408228","unresolved":false,"context_lines":[{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"    @base.remotable_classmethod"},{"line_number":1682,"context_line":"    def delete_all(cls, context):"},{"line_number":1683,"context_line":"        traits \u003d cls._get_all_from_db(context, [])"},{"line_number":1684,"context_line":"        cls._delete_all(context, traits)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_ed7a0277","line":1683,"updated":"2017-01-09 13:18:44.000000000","message":"Should it be included in the same transaction with `_delete_all`?","commit_id":"c7e64fd96934217a17a32193b2134c77cd9cf927"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"cade4fd45f31ba20075023fdf6378ed7725dd31b","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            if to_delete_names:"},{"line_number":579,"context_line":"                to_delete_ids \u003d []"},{"line_number":580,"context_line":"                for name in to_delete_names:"},{"line_number":581,"context_line":"                    to_delete_ids.append(_TRAIT_CACHE.id_from_string(name))"},{"line_number":582,"context_line":"                context.session.query(models.ResourceProviderTraits).filter("},{"line_number":583,"context_line":"                    models.ResourceProviderTraits.trait_id.in_(to_delete_ids)"},{"line_number":584,"context_line":"                ).delete(synchronize_session\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_2841c038","line":581,"updated":"2017-01-23 02:58:14.000000000","message":"I\u0027m not sure but is it good to use nested transaction?","commit_id":"81bb31fec14254971b52d98ef3dd4cea1d1aca4f"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"cade4fd45f31ba20075023fdf6378ed7725dd31b","unresolved":false,"context_lines":[{"line_number":592,"context_line":""},{"line_number":593,"context_line":"    @base.remotable"},{"line_number":594,"context_line":"    def set_traits(self, traits):"},{"line_number":595,"context_line":"        self._set_traits_to_db(self._context, self, self.id, traits)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_28af00e3","line":595,"updated":"2017-01-23 02:58:14.000000000","message":"Lacks some interfaces to attach/delete individual traits.","commit_id":"81bb31fec14254971b52d98ef3dd4cea1d1aca4f"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"cade4fd45f31ba20075023fdf6378ed7725dd31b","unresolved":false,"context_lines":[{"line_number":1715,"context_line":""},{"line_number":1716,"context_line":"    @staticmethod"},{"line_number":1717,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1718,"context_line":"    def _delete_all(context):"},{"line_number":1719,"context_line":"        num \u003d context.session.query(models.ResourceProviderTraits).join("},{"line_number":1720,"context_line":"            models.Trait, models.Trait.id \u003d\u003d"},{"line_number":1721,"context_line":"                models.ResourceProviderTraits.trait_id).filter("}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_888ab419","line":1718,"updated":"2017-01-23 02:58:14.000000000","message":"A suggestion: add or change this to a purge method to remove all the unassociated custom traits.\n\nI don\u0027t see any useful scenarios to remove all custom traits and return failure whenever there is one trait associated. In addition, the info in the exception vague because user still doesn\u0027t know which trait fails the deletion.","commit_id":"81bb31fec14254971b52d98ef3dd4cea1d1aca4f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8fe83bc62d0ce6e91600bff98c337acd689d1a2f","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    @staticmethod"},{"line_number":555,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":556,"context_line":"    def _set_traits_to_db(context, rp, _id, traits):"},{"line_number":557,"context_line":"        existed_traits \u003d ResourceProvider._get_traits_from_db(context, _id)"},{"line_number":558,"context_line":"        existed_trait_names \u003d [trait.name for trait in existed_traits]"},{"line_number":559,"context_line":"        traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_5eaad51a","line":557,"updated":"2017-03-14 16:12:31.000000000","message":"\"existed\" is not correct grammar here, \"existing\" would be. You might fix it throughout this method just so people don\u0027t get distracted.","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e7e753dbfe49d3c4cae4a6b1681d2938e63e377","unresolved":false,"context_lines":[{"line_number":554,"context_line":"    @staticmethod"},{"line_number":555,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":556,"context_line":"    def _set_traits_to_db(context, rp, _id, traits):"},{"line_number":557,"context_line":"        existed_traits \u003d ResourceProvider._get_traits_from_db(context, _id)"},{"line_number":558,"context_line":"        existed_trait_names \u003d [trait.name for trait in existed_traits]"},{"line_number":559,"context_line":"        traits_dict \u003d {trait.name: trait for trait in traits}"},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1a1ced50_34d5feb8","line":557,"in_reply_to":"3a1ff146_5eaad51a","updated":"2017-03-19 07:53:34.000000000","message":"thanks, will fix it.","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8fe83bc62d0ce6e91600bff98c337acd689d1a2f","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        conn \u003d context.session.connection()"},{"line_number":565,"context_line":"        with conn.begin():"},{"line_number":566,"context_line":"            if to_delete_names:"},{"line_number":567,"context_line":"                trait_id_smtm \u003d context.session.query(models.Trait.id).filter("},{"line_number":568,"context_line":"                    models.Trait.name.in_(to_delete_names)).subquery()"},{"line_number":569,"context_line":"                context.session.query(models.ResourceProviderTraits).filter("},{"line_number":570,"context_line":"                    models.ResourceProviderTraits.trait_id.in_(trait_id_smtm)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a1ff146_393e13b9","line":567,"updated":"2017-03-14 16:12:31.000000000","message":"smtm?\n\nAre you after an abbreviation for \"statement\". Might be easier to say \"trait_id_query\"?\n\nAlso, you already have the ids in \"existed_traits\" above, you could extract and use those to create \"to_delete_ids\" instead of \"to_delete_names\" and thus avoid the subquery?","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8e7e753dbfe49d3c4cae4a6b1681d2938e63e377","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        conn \u003d context.session.connection()"},{"line_number":565,"context_line":"        with conn.begin():"},{"line_number":566,"context_line":"            if to_delete_names:"},{"line_number":567,"context_line":"                trait_id_smtm \u003d context.session.query(models.Trait.id).filter("},{"line_number":568,"context_line":"                    models.Trait.name.in_(to_delete_names)).subquery()"},{"line_number":569,"context_line":"                context.session.query(models.ResourceProviderTraits).filter("},{"line_number":570,"context_line":"                    models.ResourceProviderTraits.trait_id.in_(trait_id_smtm)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a1ced50_54dc3ae4","line":567,"in_reply_to":"3a1ff146_393e13b9","updated":"2017-03-19 07:53:34.000000000","message":"ah, yes, I already have the id, nice suggestion, thanks","commit_id":"602b08ad62e745ab433f61390fda7b6790024e5d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":573,"context_line":"                ).delete(synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":574,"context_line":"            if to_add_names:"},{"line_number":575,"context_line":"                for name in to_add_names:"},{"line_number":576,"context_line":"                    rp_trait \u003d models.ResourceProviderTraits()"},{"line_number":577,"context_line":"                    rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":578,"context_line":"                    rp_trait.resource_provider_id \u003d _id"},{"line_number":579,"context_line":"                    context.session.add(rp_trait)"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_a64f4769","line":576,"updated":"2017-03-29 19:12:25.000000000","message":"this should have been called models.ResourceProviderTrait, not models.ResourceProviderTraits...","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":573,"context_line":"                ).delete(synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":574,"context_line":"            if to_add_names:"},{"line_number":575,"context_line":"                for name in to_add_names:"},{"line_number":576,"context_line":"                    rp_trait \u003d models.ResourceProviderTraits()"},{"line_number":577,"context_line":"                    rp_trait.trait_id \u003d traits_dict[name].id"},{"line_number":578,"context_line":"                    rp_trait.resource_provider_id \u003d _id"},{"line_number":579,"context_line":"                    context.session.add(rp_trait)"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_a9a5cfa0","line":576,"in_reply_to":"ffe62b97_a64f4769","updated":"2017-03-30 02:51:10.000000000","message":"yes, I missed that one. I will correct it.","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":1623,"context_line":"                models.Trait.name.like(filters[\u0027prefix\u0027] + \u0027%\u0027))"},{"line_number":1624,"context_line":"        if \u0027associated\u0027 in filters:"},{"line_number":1625,"context_line":"            if filters[\u0027associated\u0027]:"},{"line_number":1626,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1627,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"},{"line_number":1628,"context_line":"                ).filter(models.ResourceProviderTraits.trait_id !\u003d null())"},{"line_number":1629,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_c6dfeb63","line":1626,"updated":"2017-03-29 19:12:25.000000000","message":"The above should be an innerjoin.","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":1623,"context_line":"                models.Trait.name.like(filters[\u0027prefix\u0027] + \u0027%\u0027))"},{"line_number":1624,"context_line":"        if \u0027associated\u0027 in filters:"},{"line_number":1625,"context_line":"            if filters[\u0027associated\u0027]:"},{"line_number":1626,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1627,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"},{"line_number":1628,"context_line":"                ).filter(models.ResourceProviderTraits.trait_id !\u003d null())"},{"line_number":1629,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_e9cd175d","line":1626,"in_reply_to":"ffe62b97_c6dfeb63","updated":"2017-03-30 02:51:10.000000000","message":"Yes, I should use innerjoin instead of outerjoin and the filter. Thanks","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"            if filters[\u0027associated\u0027]:"},{"line_number":1626,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1627,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"},{"line_number":1628,"context_line":"                ).filter(models.ResourceProviderTraits.trait_id !\u003d null())"},{"line_number":1629,"context_line":"            else:"},{"line_number":1630,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1631,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_66ca5fa1","line":1628,"updated":"2017-03-29 19:12:25.000000000","message":"and remove the filter() on NOT NULL here.\n\nalso, for the above, you need to add a:\n\n query \u003d query.distinct()\n\notherwise you\u0027ll be returning copies of Trait objects, one for each resource provider a trait is associated.","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"92d87db19699796b2100aecc9b809f88897ddd33","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"            if filters[\u0027associated\u0027]:"},{"line_number":1626,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1627,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"},{"line_number":1628,"context_line":"                ).filter(models.ResourceProviderTraits.trait_id !\u003d null())"},{"line_number":1629,"context_line":"            else:"},{"line_number":1630,"context_line":"                query \u003d query.outerjoin(models.ResourceProviderTraits,"},{"line_number":1631,"context_line":"                    models.Trait.id \u003d\u003d models.ResourceProviderTraits.trait_id"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_a9d38f00","line":1628,"in_reply_to":"ffe62b97_66ca5fa1","updated":"2017-03-30 02:51:10.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"}],"nova/tests/functional/db/test_resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":1710,"context_line":"        rp.set_traits(associated_traits)"},{"line_number":1711,"context_line":"        self._assert_traits([\u0027CUSTOM_TRAIT_A\u0027, \u0027CUSTOM_TRAIT_B\u0027],"},{"line_number":1712,"context_line":"            objects.TraitList.get_all(self.context,"},{"line_number":1713,"context_line":"                filters\u003d{\u0027associated\u0027: True}))"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    def test_traits_get_all_with_associated_false(self):"},{"line_number":1716,"context_line":"        rp \u003d objects.ResourceProvider("}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_6697ff3b","line":1713,"updated":"2017-03-29 19:12:25.000000000","message":"Modify this test method to include \u003e1 resource provider that has at least one of the above traits associated with both of the providers. That should catch issues like the lack of distinct() mentioned previously.","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c5bd9fc3a577c9b130943bd760f103439831cbd9","unresolved":false,"context_lines":[{"line_number":1710,"context_line":"        rp.set_traits(associated_traits)"},{"line_number":1711,"context_line":"        self._assert_traits([\u0027CUSTOM_TRAIT_A\u0027, \u0027CUSTOM_TRAIT_B\u0027],"},{"line_number":1712,"context_line":"            objects.TraitList.get_all(self.context,"},{"line_number":1713,"context_line":"                filters\u003d{\u0027associated\u0027: True}))"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"    def test_traits_get_all_with_associated_false(self):"},{"line_number":1716,"context_line":"        rp \u003d objects.ResourceProvider("}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_7b2aee7e","line":1713,"in_reply_to":"ffe62b97_6697ff3b","updated":"2017-03-30 02:57:43.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6053e4a63d8f07f5aa8394e6272931d6bd15b41a","unresolved":false,"context_lines":[{"line_number":1730,"context_line":"        rp.set_traits(associated_traits)"},{"line_number":1731,"context_line":"        self._assert_traits([\u0027CUSTOM_TRAIT_C\u0027],"},{"line_number":1732,"context_line":"            objects.TraitList.get_all(self.context,"},{"line_number":1733,"context_line":"                filters\u003d{\u0027associated\u0027: False}))"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_e64d4fc4","line":1733,"updated":"2017-03-29 19:12:25.000000000","message":"Probably a good idea to add the same \u003e1 providers to this test too...","commit_id":"177190038f368adab864fe8e47ace24e4c959553"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c5bd9fc3a577c9b130943bd760f103439831cbd9","unresolved":false,"context_lines":[{"line_number":1730,"context_line":"        rp.set_traits(associated_traits)"},{"line_number":1731,"context_line":"        self._assert_traits([\u0027CUSTOM_TRAIT_C\u0027],"},{"line_number":1732,"context_line":"            objects.TraitList.get_all(self.context,"},{"line_number":1733,"context_line":"                filters\u003d{\u0027associated\u0027: False}))"}],"source_content_type":"text/x-python","patch_set":19,"id":"ffe62b97_5b2dea92","line":1733,"in_reply_to":"ffe62b97_e64d4fc4","updated":"2017-03-30 02:57:43.000000000","message":"Done","commit_id":"177190038f368adab864fe8e47ace24e4c959553"}]}
