)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b52452b31c99625aa7d09eef1ad2563a2841def9","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     songwenping \u003csongwenping@inspur.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2021-05-12 10:14:45 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Delete trait for placement"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If no rp uses the old device trait, we need clean it, else placement"},{"line_number":10,"context_line":"will raise 409 exception."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"51dd5773_bb31b191","line":7,"range":{"start_line":7,"start_character":13,"end_line":7,"end_character":17},"updated":"2021-05-14 06:18:22.000000000","message":"from","commit_id":"873216a0d74c414169ec8ff2a420bdb7ab51c6fc"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"35cbeca29ac21e92a8f65a28ae9785d6c4628700","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     songwenping \u003csongwenping@inspur.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2021-05-12 10:14:45 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Delete trait for placement"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If no rp uses the old device trait, we need clean it, else placement"},{"line_number":10,"context_line":"will raise 409 exception."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"e21eb4aa_e2beb6b5","line":7,"range":{"start_line":7,"start_character":13,"end_line":7,"end_character":17},"in_reply_to":"51dd5773_bb31b191","updated":"2021-05-26 07:27:34.000000000","message":"Done","commit_id":"873216a0d74c414169ec8ff2a420bdb7ab51c6fc"}],"cyborg/common/placement_client.py":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"b52452b31c99625aa7d09eef1ad2563a2841def9","unresolved":true,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def delet_trait(self, context, name):"},{"line_number":315,"context_line":"        \"\"\"Delete trait by name.\"\"\""},{"line_number":316,"context_line":"        version \u003d \u00271.6\u0027"},{"line_number":317,"context_line":"        resp \u003d self.delete("},{"line_number":318,"context_line":"            \"/traits/%s\" % name, version\u003dversion,"},{"line_number":319,"context_line":"            global_request_id\u003dcontext.global_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d2c42339_be4b3287","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":23},"updated":"2021-05-14 06:18:22.000000000","message":"right.","commit_id":"873216a0d74c414169ec8ff2a420bdb7ab51c6fc"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"35cbeca29ac21e92a8f65a28ae9785d6c4628700","unresolved":false,"context_lines":[{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def delet_trait(self, context, name):"},{"line_number":315,"context_line":"        \"\"\"Delete trait by name.\"\"\""},{"line_number":316,"context_line":"        version \u003d \u00271.6\u0027"},{"line_number":317,"context_line":"        resp \u003d self.delete("},{"line_number":318,"context_line":"            \"/traits/%s\" % name, version\u003dversion,"},{"line_number":319,"context_line":"            global_request_id\u003dcontext.global_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"57257cea_d3dbacd0","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":23},"in_reply_to":"d2c42339_be4b3287","updated":"2021-05-26 07:27:34.000000000","message":"Ack","commit_id":"873216a0d74c414169ec8ff2a420bdb7ab51c6fc"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"c1dec08068849321c1d3fb233d220e1d66fbf07c","unresolved":true,"context_lines":[{"line_number":311,"context_line":"            raise exception.ResourceProviderInUse()"},{"line_number":312,"context_line":"        raise exception.ResourceProviderDeletionFailed(uuid\u003drp_uuid)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"    def delet_trait(self, context, name):"},{"line_number":315,"context_line":"        \"\"\"Delete trait by name.\"\"\""},{"line_number":316,"context_line":"        version \u003d \u00271.6\u0027"},{"line_number":317,"context_line":"        resp \u003d self.delete("}],"source_content_type":"text/x-python","patch_set":2,"id":"70413865_e782b8fb","line":314,"range":{"start_line":314,"start_character":8,"end_line":314,"end_character":19},"updated":"2021-05-26 10:30:02.000000000","message":"delete","commit_id":"48098c614984a03dc361d1e99af514f720b5198e"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"6a0b4381bd54afc1175d33c2c6c7af939bb2f19b","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        traits \u003d list(set(traits_json[\u0027traits\u0027] + trait_names))"},{"line_number":113,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":114,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def delete_trait_by_name(self, rp_uuid, trait_name):"},{"line_number":117,"context_line":"        traits_json \u003d self._get_rp_traits(rp_uuid)"},{"line_number":118,"context_line":"        traits \u003d ["},{"line_number":119,"context_line":"            trait for trait in traits_json[\u0027traits\u0027]"},{"line_number":120,"context_line":"            if trait !\u003d trait_name"},{"line_number":121,"context_line":"            ]"},{"line_number":122,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":123,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def delete_traits_with_prefixes(self, rp_uuid, trait_prefixes):"},{"line_number":126,"context_line":"        traits_json \u003d self._get_rp_traits(rp_uuid)"},{"line_number":127,"context_line":"        traits \u003d ["},{"line_number":128,"context_line":"            trait for trait in traits_json[\u0027traits\u0027]"},{"line_number":129,"context_line":"            if not any(trait.startswith(prefix)"},{"line_number":130,"context_line":"                       for prefix in trait_prefixes)]"},{"line_number":131,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":132,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def get_placement_request_id(self, response):"},{"line_number":135,"context_line":"        if response is not None:"},{"line_number":136,"context_line":"            return response.headers.get(request_id.HTTP_RESP_HEADER_REQUEST_ID)"}],"source_content_type":"text/x-python","patch_set":8,"id":"2c26c9e4_d6e57c32","line":133,"range":{"start_line":115,"start_character":0,"end_line":133,"end_character":0},"updated":"2021-07-16 01:47:16.000000000","message":"each time these funstion called, we should verify if the trait need to be deleted, can we encasuplate delete_trait in these 2 functions","commit_id":"e864139db2f6a0e4dc4dc5fe21f01d227cc0c30c"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"aee4b9d1f3ff9db13b90c445e276ecaeda95446c","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        traits \u003d list(set(traits_json[\u0027traits\u0027] + trait_names))"},{"line_number":113,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":114,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def delete_trait_by_name(self, rp_uuid, trait_name):"},{"line_number":117,"context_line":"        traits_json \u003d self._get_rp_traits(rp_uuid)"},{"line_number":118,"context_line":"        traits \u003d ["},{"line_number":119,"context_line":"            trait for trait in traits_json[\u0027traits\u0027]"},{"line_number":120,"context_line":"            if trait !\u003d trait_name"},{"line_number":121,"context_line":"            ]"},{"line_number":122,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":123,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def delete_traits_with_prefixes(self, rp_uuid, trait_prefixes):"},{"line_number":126,"context_line":"        traits_json \u003d self._get_rp_traits(rp_uuid)"},{"line_number":127,"context_line":"        traits \u003d ["},{"line_number":128,"context_line":"            trait for trait in traits_json[\u0027traits\u0027]"},{"line_number":129,"context_line":"            if not any(trait.startswith(prefix)"},{"line_number":130,"context_line":"                       for prefix in trait_prefixes)]"},{"line_number":131,"context_line":"        traits_json[\u0027traits\u0027] \u003d traits"},{"line_number":132,"context_line":"        self._put_rp_traits(rp_uuid, traits_json)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def get_placement_request_id(self, response):"},{"line_number":135,"context_line":"        if response is not None:"},{"line_number":136,"context_line":"            return response.headers.get(request_id.HTTP_RESP_HEADER_REQUEST_ID)"}],"source_content_type":"text/x-python","patch_set":8,"id":"cd3faf8c_0d260275","line":133,"range":{"start_line":115,"start_character":0,"end_line":133,"end_character":0},"in_reply_to":"2c26c9e4_d6e57c32","updated":"2021-07-20 08:28:25.000000000","message":"how about refactor in the follow patch?","commit_id":"e864139db2f6a0e4dc4dc5fe21f01d227cc0c30c"}],"cyborg/conductor/manager.py":[{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"c1dec08068849321c1d3fb233d220e1d66fbf07c","unresolved":true,"context_lines":[{"line_number":313,"context_line":"                        rp_uuid, old_driver_attr_obj.value)"},{"line_number":314,"context_line":"                    self.placement_client.add_traits_to_rp("},{"line_number":315,"context_line":"                        rp_uuid, [new_driver_attr_obj.value])"},{"line_number":316,"context_line":"                    self.placement_client.delete_trait("},{"line_number":317,"context_line":"                        context, old_driver_attr_obj.value)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def drv_ah_make_diff(cls, context, dep_id, cpid_id, old_driver_ah_list,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7cef8945_913bab30","line":317,"range":{"start_line":316,"start_character":20,"end_line":317,"end_character":59},"updated":"2021-05-26 10:30:02.000000000","message":"I am confused about this. how can we ensure that the trait of old device is not used by new device? if we can not make sure of that, I suggest to leave the trait as it is","commit_id":"48098c614984a03dc361d1e99af514f720b5198e"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"f1ad5b51de1b88ae3fbafabcf3b2818a85e4dcf6","unresolved":true,"context_lines":[{"line_number":313,"context_line":"                        rp_uuid, old_driver_attr_obj.value)"},{"line_number":314,"context_line":"                    self.placement_client.add_traits_to_rp("},{"line_number":315,"context_line":"                        rp_uuid, [new_driver_attr_obj.value])"},{"line_number":316,"context_line":"                    self.placement_client.delete_trait("},{"line_number":317,"context_line":"                        context, old_driver_attr_obj.value)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def drv_ah_make_diff(cls, context, dep_id, cpid_id, old_driver_ah_list,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fd7c4129_14f945b5","line":317,"range":{"start_line":316,"start_character":20,"end_line":317,"end_character":59},"in_reply_to":"7cef8945_913bab30","updated":"2021-05-27 09:10:09.000000000","message":"we neednot to ensure the trait is used by other device, if it is used, placement will raise 409 error and we will LOG the error.\nthis cleanup is not nessecery, but i am afraid there will be lot of useless traits reserved in placement.","commit_id":"48098c614984a03dc361d1e99af514f720b5198e"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"ff0b1205719307148dbdb94d636d9115424d42d2","unresolved":true,"context_lines":[{"line_number":313,"context_line":"                        rp_uuid, old_driver_attr_obj.value)"},{"line_number":314,"context_line":"                    self.placement_client.add_traits_to_rp("},{"line_number":315,"context_line":"                        rp_uuid, [new_driver_attr_obj.value])"},{"line_number":316,"context_line":"                    self.placement_client.delete_trait("},{"line_number":317,"context_line":"                        context, old_driver_attr_obj.value)"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    @classmethod"},{"line_number":320,"context_line":"    def drv_ah_make_diff(cls, context, dep_id, cpid_id, old_driver_ah_list,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b54b300_48c01fe8","line":317,"range":{"start_line":316,"start_character":20,"end_line":317,"end_character":59},"in_reply_to":"fd7c4129_14f945b5","updated":"2021-06-01 12:47:52.000000000","message":"Agree with keep using the logical exist in placement.","commit_id":"48098c614984a03dc361d1e99af514f720b5198e"}],"releasenotes/notes/bug-1928174-delete_trait_from_placement-266caf73cf289759.yaml":[{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"0599b12ddf0dc1fde22556e99c23d0d5855265cb","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug 1928174`_ is cleaned the old device trait on reporting data. the"},{"line_number":5,"context_line":"    trait will be removing succesfully if no rp uses, else placement will"},{"line_number":6,"context_line":"    raise 409 exception."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"8c7a6b54_f641ee76","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":18},"updated":"2021-07-08 06:37:30.000000000","message":"missing the reference link below","commit_id":"2bd6ee236265a8200dde8fb03182014ed7d06c5f"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"988670847d077b846e075e74cfb33e20ec5dba91","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug 1928174`_ is cleaned the old device trait on reporting data. the"},{"line_number":5,"context_line":"    trait will be removing succesfully if no rp uses, else placement will"},{"line_number":6,"context_line":"    raise 409 exception."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"4be60f79_a7ee635e","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":18},"in_reply_to":"8c7a6b54_f641ee76","updated":"2021-07-09 09:10:07.000000000","message":"Done","commit_id":"2bd6ee236265a8200dde8fb03182014ed7d06c5f"},{"author":{"_account_id":25738,"name":"Xinran WANG","email":"xin-ran.wang@intel.com","username":"Xinran"},"change_message_id":"0599b12ddf0dc1fde22556e99c23d0d5855265cb","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug 1928174`_ is cleaned the old device trait on reporting data. the"},{"line_number":5,"context_line":"    trait will be removing succesfully if no rp uses, else placement will"},{"line_number":6,"context_line":"    raise 409 exception."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"a141be1b_29f49ce0","line":5,"range":{"start_line":5,"start_character":54,"end_line":5,"end_character":59},"updated":"2021-07-08 06:37:30.000000000","message":"otherwise","commit_id":"2bd6ee236265a8200dde8fb03182014ed7d06c5f"},{"author":{"_account_id":31412,"name":"Wenping Song","email":"songwenping@inspur.com","username":"songwenping"},"change_message_id":"988670847d077b846e075e74cfb33e20ec5dba91","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `Bug 1928174`_ is cleaned the old device trait on reporting data. the"},{"line_number":5,"context_line":"    trait will be removing succesfully if no rp uses, else placement will"},{"line_number":6,"context_line":"    raise 409 exception."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"dc38239a_71679a39","line":5,"range":{"start_line":5,"start_character":54,"end_line":5,"end_character":59},"in_reply_to":"a141be1b_29f49ce0","updated":"2021-07-09 09:10:07.000000000","message":"Done","commit_id":"2bd6ee236265a8200dde8fb03182014ed7d06c5f"}],"releasenotes/notes/delete_trait_from_placement-b981337b904d3e71.yaml":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"ff0b1205719307148dbdb94d636d9115424d42d2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"1710fa76_be09a486","updated":"2021-06-01 12:47:52.000000000","message":"It\u0027s better to say `Bug 1928174`_ is cleaned the old device ....,\n\nAnd, please rename the file\u0027s name \"bug-1928174-delete_trait_from_placement-b981337b904d3e71.yaml\".\n\nyou can refer https://github.com/openstack/nova/blob/master/releasenotes/notes/bug-1811726-multi-node-delete-2ba17f02c6171fbb.yaml","commit_id":"e46208fd2ca3c2bc1d4c04bb415ee715ae68d5e8"}]}
