)]}'
{"nova/exception.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d18754efefb474254bf563f4ddd87efe3fc17584","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":""},{"line_number":2142,"context_line":"class TraitNotFound(NotFound):"},{"line_number":2143,"context_line":"    msg_fmt \u003d _(\"No such trait %(name)s.\")"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_67679c25","line":2143,"updated":"2017-03-20 21:23:11.000000000","message":"I\u0027m not sure we need to this one. NotFound by itself is probably good enough. The caller knows what it was looking for.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"af188c6aef50a48f0a52bce48c8179482914f60c","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":""},{"line_number":2142,"context_line":"class TraitNotFound(NotFound):"},{"line_number":2143,"context_line":"    msg_fmt \u003d _(\"No such trait %(name)s.\")"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_bbc5298f","line":2143,"in_reply_to":"1a1ced50_67679c25","updated":"2017-03-20 23:23:36.000000000","message":"Perhaps in the future when a resource provider is created with traits specified that do not exist? The alternative is to add them, but that\u0027s problematic if the reason it doesn\u0027t exist is a typo.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d6d5486bd46c0fedb20dedd4164e7767a45fc19f","unresolved":false,"context_lines":[{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":""},{"line_number":2142,"context_line":"class TraitNotFound(NotFound):"},{"line_number":2143,"context_line":"    msg_fmt \u003d _(\"No such trait %(name)s.\")"},{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_2b5526f9","line":2143,"in_reply_to":"1a1ced50_bbc5298f","updated":"2017-03-22 09:38:32.000000000","message":"@Chris, if we use generic exception, that means we may ignore some unexpected exception.\n\n@Ed, I remember we said we won\u0027t create resource provider with traits. We expect two separated APIs between create resource provider and associate trait.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3820fb83c0b86117832a25c09d232e3a6157c65a","unresolved":false,"context_lines":[{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"},{"line_number":2147,"context_line":"    msg_fmt \u003d _(\"The Trait %(trait)s already exists\")"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"class TraitCannotDeleteStandard(Invalid):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_2ab42033","line":2147,"range":{"start_line":2147,"start_character":21,"end_line":2147,"end_character":26},"updated":"2017-03-22 23:30:40.000000000","message":"nit: s/Trait/trait/ for fitting to the above message of TraitNotFound.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3820fb83c0b86117832a25c09d232e3a6157c65a","unresolved":false,"context_lines":[{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"},{"line_number":2147,"context_line":"    msg_fmt \u003d _(\"The Trait %(trait)s already exists\")"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"class TraitCannotDeleteStandard(Invalid):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_2ae2602f","line":2147,"range":{"start_line":2147,"start_character":29,"end_line":2147,"end_character":34},"updated":"2017-03-22 23:30:40.000000000","message":"why not \"name\" here like the other exceptions?","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"473fb313dd8a93289e814b38dafeb42634ba0738","unresolved":false,"context_lines":[{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"},{"line_number":2147,"context_line":"    msg_fmt \u003d _(\"The Trait %(trait)s already exists\")"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"class TraitCannotDeleteStandard(Invalid):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_a5c83e56","line":2147,"range":{"start_line":2147,"start_character":29,"end_line":2147,"end_character":34},"in_reply_to":"1a1ced50_2ae2602f","updated":"2017-03-23 02:12:22.000000000","message":"yea, name is better.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"119281f4b4aca44439197f28400b7b1430af4d37","unresolved":false,"context_lines":[{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"},{"line_number":2147,"context_line":"    msg_fmt \u003d _(\"The Trait %(trait)s already exists\")"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"class TraitCannotDeleteStandard(Invalid):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ffe62b97_c95fe20c","line":2147,"range":{"start_line":2147,"start_character":29,"end_line":2147,"end_character":34},"in_reply_to":"1a1ced50_33501432","updated":"2017-03-23 23:41:01.000000000","message":"oops, sorry, I forget to fix it.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"f443b37016b06b9d2cc90fbff9e636f13bce9d5e","unresolved":false,"context_lines":[{"line_number":2144,"context_line":""},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"class TraitExists(NovaException):"},{"line_number":2147,"context_line":"    msg_fmt \u003d _(\"The Trait %(trait)s already exists\")"},{"line_number":2148,"context_line":""},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"class TraitCannotDeleteStandard(Invalid):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_33501432","line":2147,"range":{"start_line":2147,"start_character":29,"end_line":2147,"end_character":34},"in_reply_to":"1a1ced50_a5c83e56","updated":"2017-03-23 03:28:07.000000000","message":"Thanks, but how about my first nit comment? (s/Trait/trait/)","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"036a4f1f46b0f2b1225fa11eb0eb283237dc5a45","unresolved":false,"context_lines":[{"line_number":994,"context_line":"    def _update_all(context, traits):"},{"line_number":995,"context_line":"        traits \u003d set(traits)"},{"line_number":996,"context_line":"        query \u003d context.session.query(models.Trait)"},{"line_number":997,"context_line":"        existed_traits \u003d set([trait.name for trait in query.all()])"},{"line_number":998,"context_line":"        to_add \u003d traits - existed_traits"},{"line_number":999,"context_line":"        to_delete \u003d existed_traits - traits"},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_834f4bbc","line":997,"range":{"start_line":997,"start_character":8,"end_line":997,"end_character":22},"updated":"2016-09-29 18:40:14.000000000","message":"nit: `existing_traits` would read better.","commit_id":"0be55867b099e4af1a575bad9c37d266d4de1ee2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ac2ba8b26170310aa97039d90480ded94d6a0fa0","unresolved":false,"context_lines":[{"line_number":994,"context_line":"    def _update_all(context, traits):"},{"line_number":995,"context_line":"        traits \u003d set(traits)"},{"line_number":996,"context_line":"        query \u003d context.session.query(models.Trait)"},{"line_number":997,"context_line":"        existed_traits \u003d set([trait.name for trait in query.all()])"},{"line_number":998,"context_line":"        to_add \u003d traits - existed_traits"},{"line_number":999,"context_line":"        to_delete \u003d existed_traits - traits"},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_2385fecd","line":997,"range":{"start_line":997,"start_character":8,"end_line":997,"end_character":22},"in_reply_to":"3a98d1f4_834f4bbc","updated":"2016-10-04 06:30:02.000000000","message":"Done","commit_id":"0be55867b099e4af1a575bad9c37d266d4de1ee2"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"    @staticmethod"},{"line_number":1491,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1492,"context_line":"    def _create_in_db(context, updates):"},{"line_number":1493,"context_line":"        trait \u003d models.Trait()"},{"line_number":1494,"context_line":"        trait.update(updates)"},{"line_number":1495,"context_line":"        context.session.add(trait)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_fb7a0323","line":1492,"updated":"2017-01-06 07:28:39.000000000","message":"Create an entry in trait cache?","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30549365b0eeebf56f0fa0d89edc6dbb22357501","unresolved":false,"context_lines":[{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"    @staticmethod"},{"line_number":1491,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1492,"context_line":"    def _create_in_db(context, updates):"},{"line_number":1493,"context_line":"        trait \u003d models.Trait()"},{"line_number":1494,"context_line":"        trait.update(updates)"},{"line_number":1495,"context_line":"        context.session.add(trait)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_f0074715","line":1492,"in_reply_to":"ba5201f7_fb7a0323","updated":"2017-01-09 11:35:05.000000000","message":"I guess it\u0027s fine. If there is lookup later. The cache will update.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"                                              reason\u003d\u0027name is required\u0027)"},{"line_number":1505,"context_line":"        if self.name in os_traits.get_traits():"},{"line_number":1506,"context_line":"            raise exception.TraitExists(trait\u003dself.name)"},{"line_number":1507,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1508,"context_line":"            raise exception.ObjectActionError("},{"line_number":1509,"context_line":"                    action\u003d\u0027update_all\u0027,"},{"line_number":1510,"context_line":"                    reason\u003d\u0027name must start with \u0027 + self.CUSTOM_NAMESPACE)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_3e2ab990","line":1507,"updated":"2017-01-06 07:28:39.000000000","message":"+1, custom traits must start with CUSTOM_NAMESPACE explicitly.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"    @staticmethod"},{"line_number":1528,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1529,"context_line":"    def _destroy_in_db(context, name):"},{"line_number":1530,"context_line":"        res \u003d context.session.query(models.Trait).filter_by("},{"line_number":1531,"context_line":"            name\u003dname).delete()"},{"line_number":1532,"context_line":"        if not res:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_9baad783","line":1529,"updated":"2017-01-06 07:28:39.000000000","message":"Remove the corresponding entry in trait cache.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30549365b0eeebf56f0fa0d89edc6dbb22357501","unresolved":false,"context_lines":[{"line_number":1526,"context_line":""},{"line_number":1527,"context_line":"    @staticmethod"},{"line_number":1528,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1529,"context_line":"    def _destroy_in_db(context, name):"},{"line_number":1530,"context_line":"        res \u003d context.session.query(models.Trait).filter_by("},{"line_number":1531,"context_line":"            name\u003dname).delete()"},{"line_number":1532,"context_line":"        if not res:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_30162f4c","line":1529,"in_reply_to":"ba5201f7_9baad783","updated":"2017-01-09 11:35:05.000000000","message":"yea, I forget that one.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    @staticmethod"},{"line_number":1578,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1579,"context_line":"    def _update_all(context, traits):"},{"line_number":1580,"context_line":"        traits \u003d set(traits)"},{"line_number":1581,"context_line":"        valid_traits \u003d os_traits.get_traits()"},{"line_number":1582,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_5ba4efb8","line":1579,"updated":"2017-01-06 07:28:39.000000000","message":"Clear trait cache after update?","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30549365b0eeebf56f0fa0d89edc6dbb22357501","unresolved":false,"context_lines":[{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    @staticmethod"},{"line_number":1578,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1579,"context_line":"    def _update_all(context, traits):"},{"line_number":1580,"context_line":"        traits \u003d set(traits)"},{"line_number":1581,"context_line":"        valid_traits \u003d os_traits.get_traits()"},{"line_number":1582,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_bfbf435f","line":1579,"in_reply_to":"ba5201f7_5ba4efb8","updated":"2017-01-09 11:35:05.000000000","message":"yea, i think so.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1611,"context_line":""},{"line_number":1612,"context_line":"    @staticmethod"},{"line_number":1613,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1614,"context_line":"    def _delete_all(context):"},{"line_number":1615,"context_line":"        context.session.query(models.Trait).delete()"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_bbb6bbf6","line":1614,"updated":"2017-01-06 07:28:39.000000000","message":"Need to remove related cache entries.","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30549365b0eeebf56f0fa0d89edc6dbb22357501","unresolved":false,"context_lines":[{"line_number":1611,"context_line":""},{"line_number":1612,"context_line":"    @staticmethod"},{"line_number":1613,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1614,"context_line":"    def _delete_all(context):"},{"line_number":1615,"context_line":"        context.session.query(models.Trait).delete()"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_1faf6f2c","line":1614,"in_reply_to":"ba5201f7_bbb6bbf6","updated":"2017-01-09 11:35:05.000000000","message":"Done","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"be79391621740a78662cd71ea53f2af628b30801","unresolved":false,"context_lines":[{"line_number":1505,"context_line":""},{"line_number":1506,"context_line":"    @staticmethod"},{"line_number":1507,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1508,"context_line":"    def _create_in_db(context, updates):"},{"line_number":1509,"context_line":"        trait \u003d models.Trait()"},{"line_number":1510,"context_line":"        trait.update(updates)"},{"line_number":1511,"context_line":"        context.session.add(trait)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_f7580f8d","line":1508,"updated":"2017-01-09 13:00:12.000000000","message":"Check duplication here and raise `TraitExists`?","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2918097816d603fe3ebd7519a864afafc2acb654","unresolved":false,"context_lines":[{"line_number":1505,"context_line":""},{"line_number":1506,"context_line":"    @staticmethod"},{"line_number":1507,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1508,"context_line":"    def _create_in_db(context, updates):"},{"line_number":1509,"context_line":"        trait \u003d models.Trait()"},{"line_number":1510,"context_line":"        trait.update(updates)"},{"line_number":1511,"context_line":"        context.session.add(trait)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_e702fdb3","line":1508,"in_reply_to":"ba5201f7_f7580f8d","updated":"2017-01-10 05:08:10.000000000","message":"good catch, I forget this one.","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"be79391621740a78662cd71ea53f2af628b30801","unresolved":false,"context_lines":[{"line_number":1545,"context_line":"        if not res:"},{"line_number":1546,"context_line":"            raise exception.TraitNotFound(identifier\u003dname)"},{"line_number":1547,"context_line":""},{"line_number":1548,"context_line":"    def destroy(self):"},{"line_number":1549,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1550,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1551,"context_line":"                                              reason\u003d\u0027name is required\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_5a92e2a0","line":1548,"updated":"2017-01-09 13:00:12.000000000","message":"`409 Confilct` if the name to delete has associations with any\n  ResourceProvider.","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"96dfaa2e6799fc31cf20441dd26d9ab4ddcea4af","unresolved":false,"context_lines":[{"line_number":1545,"context_line":"        if not res:"},{"line_number":1546,"context_line":"            raise exception.TraitNotFound(identifier\u003dname)"},{"line_number":1547,"context_line":""},{"line_number":1548,"context_line":"    def destroy(self):"},{"line_number":1549,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1550,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1551,"context_line":"                                              reason\u003d\u0027name is required\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_7afb2648","line":1548,"in_reply_to":"ba5201f7_5a92e2a0","updated":"2017-01-09 13:12:22.000000000","message":"OK, no worries.. I find it in a later patch.","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"96dfaa2e6799fc31cf20441dd26d9ab4ddcea4af","unresolved":false,"context_lines":[{"line_number":1618,"context_line":"        query \u003d context.session.query(models.Trait)"},{"line_number":1619,"context_line":"        existed_traits \u003d set([trait.name for trait in query.all()])"},{"line_number":1620,"context_line":"        to_add \u003d traits - existed_traits"},{"line_number":1621,"context_line":"        to_delete \u003d existed_traits - traits"},{"line_number":1622,"context_line":""},{"line_number":1623,"context_line":"        if to_add:"},{"line_number":1624,"context_line":"            data \u003d [{\u0027name\u0027: trait} for trait in to_add]"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_9a028a0a","line":1621,"updated":"2017-01-09 13:12:22.000000000","message":"It still has chances to delete standard traits..","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"2918097816d603fe3ebd7519a864afafc2acb654","unresolved":false,"context_lines":[{"line_number":1618,"context_line":"        query \u003d context.session.query(models.Trait)"},{"line_number":1619,"context_line":"        existed_traits \u003d set([trait.name for trait in query.all()])"},{"line_number":1620,"context_line":"        to_add \u003d traits - existed_traits"},{"line_number":1621,"context_line":"        to_delete \u003d existed_traits - traits"},{"line_number":1622,"context_line":""},{"line_number":1623,"context_line":"        if to_add:"},{"line_number":1624,"context_line":"            data \u003d [{\u0027name\u0027: trait} for trait in to_add]"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_c71c1916","line":1621,"in_reply_to":"ba5201f7_9a028a0a","updated":"2017-01-10 05:08:10.000000000","message":"ah, right, I should exclude the standard traits at here. thanks","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"be79391621740a78662cd71ea53f2af628b30801","unresolved":false,"context_lines":[{"line_number":1642,"context_line":"    @staticmethod"},{"line_number":1643,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1644,"context_line":"    def _delete_all(context):"},{"line_number":1645,"context_line":"        context.session.query(models.Trait).delete()"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"    @base.remotable_classmethod"},{"line_number":1648,"context_line":"    def delete_all(cls, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_3adc3e74","line":1645,"updated":"2017-01-09 13:00:12.000000000","message":"This will delete all the traits including the standard.\n\nAlso if the custom trait is associated, the deletion will be failed according to the spec. (or should it delete all the unassociated and custom traits?)","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3226069cd07b9203b63e43d36f2979a751b9196c","unresolved":false,"context_lines":[{"line_number":1642,"context_line":"    @staticmethod"},{"line_number":1643,"context_line":"    @db_api.api_context_manager.writer"},{"line_number":1644,"context_line":"    def _delete_all(context):"},{"line_number":1645,"context_line":"        context.session.query(models.Trait).delete()"},{"line_number":1646,"context_line":""},{"line_number":1647,"context_line":"    @base.remotable_classmethod"},{"line_number":1648,"context_line":"    def delete_all(cls, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba5201f7_bd91e454","line":1645,"in_reply_to":"ba5201f7_3adc3e74","updated":"2017-01-10 06:52:00.000000000","message":"yea, I should exclude the standard traits. For the check of trait is associated is taken care by later patch.\n\nThis patch only is about the traits itself. The later patch will take care the relationship between traits and rp.","commit_id":"b55ffd1dc89445a51295ceab099e16ef0af58e24"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"65549e7f61205a1008b12a569227e11124d30ae7","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1516,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1517,"context_line":"                                              reason\u003d\u0027name is required\u0027)"},{"line_number":1518,"context_line":"        if self.name in os_traits.get_traits():"},{"line_number":1519,"context_line":"            raise exception.TraitExists(trait\u003dself.name)"},{"line_number":1520,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1521,"context_line":"            raise exception.ObjectActionError("},{"line_number":1522,"context_line":"                    action\u003d\u0027update_all\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba2be162_44b031de","line":1519,"range":{"start_line":1518,"start_character":8,"end_line":1519,"end_character":56},"updated":"2017-02-28 23:54:16.000000000","message":"This doesn\u0027t seem like the correct exception. The only case where this would be raised is if someone is trying to create a standard trait. So the problems isn\u0027t so much that it already exists, but that changing the standard traits isn\u0027t allowed. \u0027TraitExists\u0027 should really only apply to custom traits.","commit_id":"884802df5c0bfde24387af7e630af50bd1bdda87"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"abc58b930f3506348a98f6736d50b966b41c63db","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1516,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1517,"context_line":"                                              reason\u003d\u0027name is required\u0027)"},{"line_number":1518,"context_line":"        if self.name in os_traits.get_traits():"},{"line_number":1519,"context_line":"            raise exception.TraitExists(trait\u003dself.name)"},{"line_number":1520,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1521,"context_line":"            raise exception.ObjectActionError("},{"line_number":1522,"context_line":"                    action\u003d\u0027update_all\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba2be162_976b671d","line":1519,"range":{"start_line":1518,"start_character":8,"end_line":1519,"end_character":56},"in_reply_to":"ba2be162_44b031de","updated":"2017-03-06 09:29:10.000000000","message":"yes, and for now, we will remove all the reference to the os_traits.","commit_id":"884802df5c0bfde24387af7e630af50bd1bdda87"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"8d843264fa0476b4f2503e99f117e2b814fc2352","unresolved":false,"context_lines":[{"line_number":1600,"context_line":"            except exception.TraitNotFound:"},{"line_number":1601,"context_line":"                # This shouldn\u0027t happen, due to we just get the trait from"},{"line_number":1602,"context_line":"                # the namespace cache."},{"line_number":1603,"context_line":"                LOG.debug(_LW(\"The cache of traits is inconsistent.\"))"},{"line_number":1604,"context_line":"                continue"},{"line_number":1605,"context_line":"            db_traits.append({\u0027id\u0027: _id, \u0027name\u0027: trait})"},{"line_number":1606,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_13176f52","line":1603,"range":{"start_line":1603,"start_character":26,"end_line":1603,"end_character":30},"updated":"2017-03-07 03:00:42.000000000","message":"This marker function is not necessary. Remove it.","commit_id":"37e7b56d994c07e973ed2567f5cc35f012ed0316"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"3222f0d9b1b2c40ddc1a935ba574d9d78eb1604d","unresolved":false,"context_lines":[{"line_number":1600,"context_line":"            except exception.TraitNotFound:"},{"line_number":1601,"context_line":"                # This shouldn\u0027t happen, due to we just get the trait from"},{"line_number":1602,"context_line":"                # the namespace cache."},{"line_number":1603,"context_line":"                LOG.debug(_LW(\"The cache of traits is inconsistent.\"))"},{"line_number":1604,"context_line":"                continue"},{"line_number":1605,"context_line":"            db_traits.append({\u0027id\u0027: _id, \u0027name\u0027: trait})"},{"line_number":1606,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a30ddce_fff29a05","line":1603,"range":{"start_line":1603,"start_character":26,"end_line":1603,"end_character":30},"in_reply_to":"9a30ddce_13176f52","updated":"2017-03-07 05:04:58.000000000","message":"Yes, good catch, thanks Takashi","commit_id":"37e7b56d994c07e973ed2567f5cc35f012ed0316"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8c8ff917c47c46e3452b35e48e9ed221dad2e81e","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"        return trait"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"    def create(self):"},{"line_number":1495,"context_line":"        if \u0027id\u0027 is self:"},{"line_number":1496,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1497,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":1498,"context_line":"        if \u0027name\u0027 not in self:"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a30ddce_ada49b4a","line":1495,"range":{"start_line":1495,"start_character":16,"end_line":1495,"end_character":18},"updated":"2017-03-13 12:51:04.000000000","message":"this is \u0027is\u0027 or \u0027in\u0027?","commit_id":"b53f5250c44b10c0f5f2bf60561077452c03e434"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f4f557ed018f6b4dc2c7e661faa1908849b8a39e","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"        return trait"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"    def create(self):"},{"line_number":1495,"context_line":"        if \u0027id\u0027 is self:"},{"line_number":1496,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1497,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":1498,"context_line":"        if \u0027name\u0027 not in self:"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a1ced50_d4602a38","line":1495,"in_reply_to":"3a1ff146_d356be05","updated":"2017-03-19 07:35:35.000000000","message":"yea, indeed","commit_id":"b53f5250c44b10c0f5f2bf60561077452c03e434"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d1af3272833938e9c623f6ad8d889af4ba5dfdc0","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"        return trait"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"    def create(self):"},{"line_number":1495,"context_line":"        if \u0027id\u0027 is self:"},{"line_number":1496,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1497,"context_line":"                                              reason\u003d\u0027already created\u0027)"},{"line_number":1498,"context_line":"        if \u0027name\u0027 not in self:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_d356be05","line":1495,"in_reply_to":"9a30ddce_ada49b4a","updated":"2017-03-14 15:34:35.000000000","message":"must be a missing test","commit_id":"b53f5250c44b10c0f5f2bf60561077452c03e434"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d18754efefb474254bf563f4ddd87efe3fc17584","unresolved":false,"context_lines":[{"line_number":1501,"context_line":""},{"line_number":1502,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1503,"context_line":"            raise exception.ObjectActionError("},{"line_number":1504,"context_line":"                    action\u003d\u0027update_all\u0027,"},{"line_number":1505,"context_line":"                    reason\u003d\u0027name must start with \u0027 + self.CUSTOM_NAMESPACE)"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        updates \u003d self.obj_get_changes()"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_674ebc97","line":1504,"updated":"2017-03-20 21:23:11.000000000","message":"do you want update_all here, or create like the others?","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d6d5486bd46c0fedb20dedd4164e7767a45fc19f","unresolved":false,"context_lines":[{"line_number":1501,"context_line":""},{"line_number":1502,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1503,"context_line":"            raise exception.ObjectActionError("},{"line_number":1504,"context_line":"                    action\u003d\u0027update_all\u0027,"},{"line_number":1505,"context_line":"                    reason\u003d\u0027name must start with \u0027 + self.CUSTOM_NAMESPACE)"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        updates \u003d self.obj_get_changes()"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_6b98fec0","line":1504,"in_reply_to":"1a1ced50_674ebc97","updated":"2017-03-22 09:38:32.000000000","message":"it is just wrong. I must copy this from somewhere.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"af188c6aef50a48f0a52bce48c8179482914f60c","unresolved":false,"context_lines":[{"line_number":1502,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1503,"context_line":"            raise exception.ObjectActionError("},{"line_number":1504,"context_line":"                    action\u003d\u0027update_all\u0027,"},{"line_number":1505,"context_line":"                    reason\u003d\u0027name must start with \u0027 + self.CUSTOM_NAMESPACE)"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":1508,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_3b3859a0","line":1505,"range":{"start_line":1505,"start_character":53,"end_line":1505,"end_character":74},"updated":"2017-03-20 23:23:36.000000000","message":"I would prefer to see this quoted in the reason string, so that it is clear to the reader that this is a literal value.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d6d5486bd46c0fedb20dedd4164e7767a45fc19f","unresolved":false,"context_lines":[{"line_number":1502,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"},{"line_number":1503,"context_line":"            raise exception.ObjectActionError("},{"line_number":1504,"context_line":"                    action\u003d\u0027update_all\u0027,"},{"line_number":1505,"context_line":"                    reason\u003d\u0027name must start with \u0027 + self.CUSTOM_NAMESPACE)"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":1508,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_ebea2e0e","line":1505,"range":{"start_line":1505,"start_character":53,"end_line":1505,"end_character":74},"in_reply_to":"1a1ced50_3b3859a0","updated":"2017-03-22 09:38:32.000000000","message":"got it","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d18754efefb474254bf563f4ddd87efe3fc17584","unresolved":false,"context_lines":[{"line_number":1537,"context_line":""},{"line_number":1538,"context_line":"    def destroy(self):"},{"line_number":1539,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1540,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1541,"context_line":"                                              reason\u003d\u0027name is required\u0027)"},{"line_number":1542,"context_line":""},{"line_number":1543,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_87365850","line":1540,"updated":"2017-03-20 21:23:11.000000000","message":"destroy","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d6d5486bd46c0fedb20dedd4164e7767a45fc19f","unresolved":false,"context_lines":[{"line_number":1537,"context_line":""},{"line_number":1538,"context_line":"    def destroy(self):"},{"line_number":1539,"context_line":"        if \u0027name\u0027 not in self:"},{"line_number":1540,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":1541,"context_line":"                                              reason\u003d\u0027name is required\u0027)"},{"line_number":1542,"context_line":""},{"line_number":1543,"context_line":"        if not self.name.startswith(self.CUSTOM_NAMESPACE):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_0bf06afd","line":1540,"in_reply_to":"1a1ced50_87365850","updated":"2017-03-22 09:38:32.000000000","message":"Done","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3820fb83c0b86117832a25c09d232e3a6157c65a","unresolved":false,"context_lines":[{"line_number":1472,"context_line":"    @staticmethod"},{"line_number":1473,"context_line":"    def _from_db_object(context, trait, db_trait):"},{"line_number":1474,"context_line":"        for key in trait.fields:"},{"line_number":1475,"context_line":"            if key in db_trait:"},{"line_number":1476,"context_line":"                setattr(trait, key, db_trait[key])"},{"line_number":1477,"context_line":"        trait.obj_reset_changes()"},{"line_number":1478,"context_line":"        trait._context \u003d context"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_05c4b73d","line":1475,"range":{"start_line":1475,"start_character":12,"end_line":1475,"end_character":31},"updated":"2017-03-22 23:30:40.000000000","message":"Is this check necessary?\nThe other _from_db_object(like ResourceProvider) don\u0027t have this check and the above fields seems mandatory on this object.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"473fb313dd8a93289e814b38dafeb42634ba0738","unresolved":false,"context_lines":[{"line_number":1472,"context_line":"    @staticmethod"},{"line_number":1473,"context_line":"    def _from_db_object(context, trait, db_trait):"},{"line_number":1474,"context_line":"        for key in trait.fields:"},{"line_number":1475,"context_line":"            if key in db_trait:"},{"line_number":1476,"context_line":"                setattr(trait, key, db_trait[key])"},{"line_number":1477,"context_line":"        trait.obj_reset_changes()"},{"line_number":1478,"context_line":"        trait._context \u003d context"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_854262ac","line":1475,"range":{"start_line":1475,"start_character":12,"end_line":1475,"end_character":31},"in_reply_to":"1a1ced50_05c4b73d","updated":"2017-03-23 02:12:22.000000000","message":"yes, it is ok to remove it.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3820fb83c0b86117832a25c09d232e3a6157c65a","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        try:"},{"line_number":1505,"context_line":"            db_trait \u003d self._create_in_db(self._context, updates)"},{"line_number":1506,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1507,"context_line":"            raise exception.TraitExists(trait\u003dself.name)"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        self._from_db_object(self._context, self, db_trait)"},{"line_number":1510,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_ea492832","line":1507,"range":{"start_line":1507,"start_character":40,"end_line":1507,"end_character":45},"updated":"2017-03-22 23:30:40.000000000","message":"here can be \u0027name\u003d\u0027 for matching the other exception raises.","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"473fb313dd8a93289e814b38dafeb42634ba0738","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        try:"},{"line_number":1505,"context_line":"            db_trait \u003d self._create_in_db(self._context, updates)"},{"line_number":1506,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1507,"context_line":"            raise exception.TraitExists(trait\u003dself.name)"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        self._from_db_object(self._context, self, db_trait)"},{"line_number":1510,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_a53d9e2c","line":1507,"range":{"start_line":1507,"start_character":40,"end_line":1507,"end_character":45},"in_reply_to":"1a1ced50_ea492832","updated":"2017-03-23 02:12:22.000000000","message":"Done","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"3820fb83c0b86117832a25c09d232e3a6157c65a","unresolved":false,"context_lines":[{"line_number":1528,"context_line":"        res \u003d context.session.query(models.Trait).filter_by("},{"line_number":1529,"context_line":"            name\u003dname).delete()"},{"line_number":1530,"context_line":"        if not res:"},{"line_number":1531,"context_line":"            raise exception.TraitNotFound(name\u003dname)"},{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"    def destroy(self):"},{"line_number":1534,"context_line":"        if \u0027name\u0027 not in self:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_dbe51c09","line":1531,"range":{"start_line":1531,"start_character":18,"end_line":1531,"end_character":42},"updated":"2017-03-22 23:30:40.000000000","message":"The other objects just raise exception.NotFound() without specific exception. Do we need to implement the specific exception here?","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"473fb313dd8a93289e814b38dafeb42634ba0738","unresolved":false,"context_lines":[{"line_number":1528,"context_line":"        res \u003d context.session.query(models.Trait).filter_by("},{"line_number":1529,"context_line":"            name\u003dname).delete()"},{"line_number":1530,"context_line":"        if not res:"},{"line_number":1531,"context_line":"            raise exception.TraitNotFound(name\u003dname)"},{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"    def destroy(self):"},{"line_number":1534,"context_line":"        if \u0027name\u0027 not in self:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1ced50_450b0a7d","line":1531,"range":{"start_line":1531,"start_character":18,"end_line":1531,"end_character":42},"in_reply_to":"1a1ced50_dbe51c09","updated":"2017-03-23 02:12:22.000000000","message":"We have ResourceClassNotFound, so I just copy it. And I think the specific exception is better than generic exception?","commit_id":"14959588b8cd37dd3d8fb0c11961d00c0ab124a3"}],"nova/tests/functional/db/test_resource_provider.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"036a4f1f46b0f2b1225fa11eb0eb283237dc5a45","unresolved":false,"context_lines":[{"line_number":875,"context_line":""},{"line_number":876,"context_line":"    def _assert_traits(self, expected_traits, traits_objs):"},{"line_number":877,"context_line":"        expected_traits.sort()"},{"line_number":878,"context_line":"        traits \u003d []"},{"line_number":879,"context_line":"        for obj in traits_objs:"},{"line_number":880,"context_line":"            traits.append(obj.name)"},{"line_number":881,"context_line":"        traits.sort()"},{"line_number":882,"context_line":"        self.assertEqual(expected_traits, traits)"},{"line_number":883,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_46d2b101","line":880,"range":{"start_line":878,"start_character":0,"end_line":880,"end_character":35},"updated":"2016-09-29 18:40:14.000000000","message":"replace with:\n\n    traits \u003d [obj.name for obj in traits_objs]","commit_id":"0be55867b099e4af1a575bad9c37d266d4de1ee2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"ac2ba8b26170310aa97039d90480ded94d6a0fa0","unresolved":false,"context_lines":[{"line_number":875,"context_line":""},{"line_number":876,"context_line":"    def _assert_traits(self, expected_traits, traits_objs):"},{"line_number":877,"context_line":"        expected_traits.sort()"},{"line_number":878,"context_line":"        traits \u003d []"},{"line_number":879,"context_line":"        for obj in traits_objs:"},{"line_number":880,"context_line":"            traits.append(obj.name)"},{"line_number":881,"context_line":"        traits.sort()"},{"line_number":882,"context_line":"        self.assertEqual(expected_traits, traits)"},{"line_number":883,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a98d1f4_a3710e0e","line":880,"range":{"start_line":878,"start_character":0,"end_line":880,"end_character":35},"in_reply_to":"3a98d1f4_46d2b101","updated":"2016-10-04 06:30:02.000000000","message":"Done","commit_id":"0be55867b099e4af1a575bad9c37d266d4de1ee2"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"4ff51485d317923b0b517997516e9eae763ded55","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        self.assertEqual(t.name, \u0027CUSTOM_TRAIT_A\u0027)"},{"line_number":1451,"context_line":"        t.destroy()"},{"line_number":1452,"context_line":"        self.assertRaises(exception.TraitNotFound, objects.Trait.get_by_name,"},{"line_number":1453,"context_line":"                          self.context, \u0027TRAIT_A\u0027)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def test_trait_create_with_standard_trait(self):"},{"line_number":1456,"context_line":"        t \u003d objects.Trait(self.context)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_5b2eaffb","line":1453,"range":{"start_line":1453,"start_character":41,"end_line":1453,"end_character":48},"updated":"2017-01-06 07:28:39.000000000","message":"Why not CUSTOM_TRAIT_A?","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30549365b0eeebf56f0fa0d89edc6dbb22357501","unresolved":false,"context_lines":[{"line_number":1450,"context_line":"        self.assertEqual(t.name, \u0027CUSTOM_TRAIT_A\u0027)"},{"line_number":1451,"context_line":"        t.destroy()"},{"line_number":1452,"context_line":"        self.assertRaises(exception.TraitNotFound, objects.Trait.get_by_name,"},{"line_number":1453,"context_line":"                          self.context, \u0027TRAIT_A\u0027)"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def test_trait_create_with_standard_trait(self):"},{"line_number":1456,"context_line":"        t \u003d objects.Trait(self.context)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba5201f7_ffa2ab4a","line":1453,"range":{"start_line":1453,"start_character":41,"end_line":1453,"end_character":48},"in_reply_to":"ba5201f7_5b2eaffb","updated":"2017-01-09 11:35:05.000000000","message":"I can\u0027t remember why....","commit_id":"b82a134f9c443bdfe59553e32c4d0f64f0c54ca5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d1af3272833938e9c623f6ad8d889af4ba5dfdc0","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        t.name \u003d \u0027CUSTOM_TRAIT_A\u0027"},{"line_number":1544,"context_line":"        t.create()"},{"line_number":1545,"context_line":"        self.assertIn(\u0027id\u0027, t)"},{"line_number":1546,"context_line":"        self.assertEqual(t.name, \u0027CUSTOM_TRAIT_A\u0027)"},{"line_number":1547,"context_line":""},{"line_number":1548,"context_line":"    def test_trait_create_without_custom_prefix(self):"},{"line_number":1549,"context_line":"        t \u003d objects.Trait(self.context)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_134bf62c","line":1546,"updated":"2017-03-14 15:34:35.000000000","message":"There should be a test that tries to create a trait when id is already set.\n\nAnd one where \u0027name\u0027 is not set.","commit_id":"b53f5250c44b10c0f5f2bf60561077452c03e434"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f4f557ed018f6b4dc2c7e661faa1908849b8a39e","unresolved":false,"context_lines":[{"line_number":1543,"context_line":"        t.name \u003d \u0027CUSTOM_TRAIT_A\u0027"},{"line_number":1544,"context_line":"        t.create()"},{"line_number":1545,"context_line":"        self.assertIn(\u0027id\u0027, t)"},{"line_number":1546,"context_line":"        self.assertEqual(t.name, \u0027CUSTOM_TRAIT_A\u0027)"},{"line_number":1547,"context_line":""},{"line_number":1548,"context_line":"    def test_trait_create_without_custom_prefix(self):"},{"line_number":1549,"context_line":"        t \u003d objects.Trait(self.context)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1a1ced50_f463663f","line":1546,"in_reply_to":"3a1ff146_134bf62c","updated":"2017-03-19 07:35:35.000000000","message":"Done","commit_id":"b53f5250c44b10c0f5f2bf60561077452c03e434"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"af188c6aef50a48f0a52bce48c8179482914f60c","unresolved":false,"context_lines":[{"line_number":1555,"context_line":"        t \u003d objects.Trait(self.context)"},{"line_number":1556,"context_line":"        self.assertRaises(exception.ObjectActionError, t.create)"},{"line_number":1557,"context_line":""},{"line_number":1558,"context_line":"    def test_trait_create_without_custom_prefix(self):"},{"line_number":1559,"context_line":"        t \u003d objects.Trait(self.context)"},{"line_number":1560,"context_line":"        t.name \u003d \u0027HW_CPU_X86_AVX\u0027"},{"line_number":1561,"context_line":"        self.assertRaises(exception.ObjectActionError, t.create)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_7b101102","line":1558,"range":{"start_line":1558,"start_character":19,"end_line":1558,"end_character":47},"updated":"2017-03-20 23:23:36.000000000","message":"This test is actually testing \u0027create_an_existing_standard_trait\u0027 (i.e., HW_CPU_X86_AVX). I would use a string like \u0027TRAIT_A\u0027  for t.name to be clear it is a custom trait.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d6d5486bd46c0fedb20dedd4164e7767a45fc19f","unresolved":false,"context_lines":[{"line_number":1555,"context_line":"        t \u003d objects.Trait(self.context)"},{"line_number":1556,"context_line":"        self.assertRaises(exception.ObjectActionError, t.create)"},{"line_number":1557,"context_line":""},{"line_number":1558,"context_line":"    def test_trait_create_without_custom_prefix(self):"},{"line_number":1559,"context_line":"        t \u003d objects.Trait(self.context)"},{"line_number":1560,"context_line":"        t.name \u003d \u0027HW_CPU_X86_AVX\u0027"},{"line_number":1561,"context_line":"        self.assertRaises(exception.ObjectActionError, t.create)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a1ced50_ebd14e58","line":1558,"range":{"start_line":1558,"start_character":19,"end_line":1558,"end_character":47},"in_reply_to":"1a1ced50_7b101102","updated":"2017-03-22 09:38:32.000000000","message":"yes, nice point.","commit_id":"e30988737d5026f736e49fd531adca70a8f87ae1"}]}
