)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     shengping zhang \u003czhangshengping@unitedstack.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-08-05 20:24:01 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Update the code."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update \u0027post_delete\u0027 in gnocchi/rest/__init__.py to use"},{"line_number":10,"context_line":"\u0027list_resources\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bacf61ea_a5978046","line":7,"updated":"2016-08-06 13:16:12.000000000","message":"This is the best description I saw lol\n\nCould you write a better summary of what this patch does? :)","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Update the code."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update \u0027post_delete\u0027 in gnocchi/rest/__init__.py to use"},{"line_number":10,"context_line":"\u0027list_resources\u0027."},{"line_number":11,"context_line":"Update method \u0027delete_resource\u0027 in gnocchi/indexer/sqlalchemy.py"},{"line_number":12,"context_line":"to change \u0027type\u0027 to isinstance and set parameter"},{"line_number":13,"context_line":"\u0027session_synchronize\u003dFalse\u0027 in \u0027delete\u0027 method."},{"line_number":14,"context_line":"Remove the miss_updated pdb"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"TODO: 1. Move test case to Gabbi"},{"line_number":17,"context_line":"      2. An corresponding gnocchi client CLI needs to"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bacf61ea_e59df866","line":14,"range":{"start_line":9,"start_character":0,"end_line":14,"end_character":27},"updated":"2016-08-06 13:16:12.000000000","message":"This is not very informative, I can see that by reading the patch. Explain what you want to achieve with that patch, not how you do it.","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"}],"doc/source/rest.j2":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ac547594ad73aff8fd97f69d6a5de79217d065ce","unresolved":false,"context_lines":[{"line_number":312,"context_line":"  When a resource is deleted, all its associated metrics are deleted at the"},{"line_number":313,"context_line":"  same time."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"  When a batch of resources are deleted, an attribute filter is required, otherwise"},{"line_number":316,"context_line":"  it deletes entire database."},{"line_number":317,"context_line":""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"All resources can be listed, either by using the `generic` type that will list"}],"source_content_type":"text/x-jinja2","patch_set":18,"id":"9a89bdaa_b49a7512","line":316,"range":{"start_line":315,"start_character":74,"end_line":316,"end_character":29},"updated":"2016-09-13 08:17:10.000000000","message":"to avoid deletion of the entire database.","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"}],"doc/source/rest.yaml":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"8b377fabaa04f9e3ba48c41f44aed233e31ceee0","unresolved":false,"context_lines":[{"line_number":551,"context_line":""},{"line_number":552,"context_line":"- name: delete-resources-by-ids"},{"line_number":553,"context_line":"  request: |"},{"line_number":554,"context_line":"    POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":555,"context_line":"    Content-Type: application/json"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    {"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a89bdaa_8ddd6416","line":554,"updated":"2016-09-13 09:01:40.000000000","message":"Can you make this one use DELETE?\n\nFix gendoc if you need to","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"94347c5f2e9f6b047f24dca18113f34ae9ed86a8","unresolved":false,"context_lines":[{"line_number":551,"context_line":""},{"line_number":552,"context_line":"- name: delete-resources-by-ids"},{"line_number":553,"context_line":"  request: |"},{"line_number":554,"context_line":"    POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":555,"context_line":"    Content-Type: application/json"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    {"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a89bdaa_0837824d","line":554,"in_reply_to":"9a89bdaa_8ddd6416","updated":"2016-09-13 15:40:28.000000000","message":"I was thinking to add pecan reference `url mapping` link here simply. but I do not know if it is ok.","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"d34248c955ae4999680bb96aa41eada8d20445f9","unresolved":false,"context_lines":[{"line_number":569,"context_line":""},{"line_number":570,"context_line":"- name: delete-resources-by-ids"},{"line_number":571,"context_line":"  request: |"},{"line_number":572,"context_line":"    POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":573,"context_line":"    Content-Type: application/json"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"    {"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"7a8ec9b2_f7ce3e59","line":572,"updated":"2016-09-14 10:33:26.000000000","message":"I\u0027m still unhappy about not having a DELETE call here. :D","commit_id":"097efeceff4585469391fb455cd42f70a514cc80"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"62587e198bbb4fd0d8e9570e99dde6824294c427","unresolved":false,"context_lines":[{"line_number":569,"context_line":""},{"line_number":570,"context_line":"- name: delete-resources-by-ids"},{"line_number":571,"context_line":"  request: |"},{"line_number":572,"context_line":"    POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":573,"context_line":"    Content-Type: application/json"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"    {"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"7a8ec9b2_a9a37a9d","line":572,"in_reply_to":"7a8ec9b2_f7ce3e59","updated":"2016-09-14 10:46:24.000000000","message":"how can I change here? is there any way? I will try to do it.","commit_id":"097efeceff4585469391fb455cd42f70a514cc80"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"ed5652c064ecb8c460fa383b4088308f0f5130b4","unresolved":false,"context_lines":[{"line_number":591,"context_line":"      \"\u003e\u003d\": {\"started_at\": \"{{ scenarios[\u0027create-resources-f\u0027][\u0027response\u0027].json[\u0027started_at\u0027] }}\"}"},{"line_number":592,"context_line":"    }"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"# - name: delete-resources-by-time"},{"line_number":595,"context_line":"  # request: |"},{"line_number":596,"context_line":"    # POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":597,"context_line":"    # Content-Type: application/json"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"7a8ec9b2_6c0c2095","line":594,"updated":"2016-09-14 11:06:22.000000000","message":"remove this one?","commit_id":"097efeceff4585469391fb455cd42f70a514cc80"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"5a18382ffa05e2ca598d69bbf08594f7ead4a591","unresolved":false,"context_lines":[{"line_number":591,"context_line":"      \"\u003e\u003d\": {\"started_at\": \"{{ scenarios[\u0027create-resources-f\u0027][\u0027response\u0027].json[\u0027started_at\u0027] }}\"}"},{"line_number":592,"context_line":"    }"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"# - name: delete-resources-by-time"},{"line_number":595,"context_line":"  # request: |"},{"line_number":596,"context_line":"    # POST /v1/resource/generic?_method\u003ddelete HTTP/1.1"},{"line_number":597,"context_line":"    # Content-Type: application/json"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"7a8ec9b2_181bd673","line":594,"in_reply_to":"7a8ec9b2_6c0c2095","updated":"2016-09-14 11:59:35.000000000","message":"oh, sorry, I forget to remove this. I will remove it now.","commit_id":"097efeceff4585469391fb455cd42f70a514cc80"}],"gnocchi/indexer/__init__.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"35eec402b62359ed242835b305dac5d194a2b894","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            super(NoSuchResources, self).__init__("},{"line_number":116,"context_line":"                \"Resources %s do not exist\" % resources)"},{"line_number":117,"context_line":"        else:"},{"line_number":118,"context_line":"            super(NoSuchResources, self).__init__("},{"line_number":119,"context_line":"                \"Resource %s does not exist\" % resources)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_b3ebc6af","line":118,"updated":"2016-08-16 13:30:19.000000000","message":"if and else conditions are exactly the same.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"82aff0e9853d7bf9c8bc4e614c67a05c418cbd04","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            super(NoSuchResources, self).__init__("},{"line_number":116,"context_line":"                \"Resources %s do not exist\" % resources)"},{"line_number":117,"context_line":"        else:"},{"line_number":118,"context_line":"            super(NoSuchResources, self).__init__("},{"line_number":119,"context_line":"                \"Resource %s does not exist\" % resources)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ac06dbe_cf0a1921","line":118,"in_reply_to":"3ac371cc_b3ebc6af","updated":"2016-08-22 10:26:57.000000000","message":"There is really awful, I noticed that. I will try to improve it.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"}],"gnocchi/indexer/sqlalchemy.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"85c20691d51f0baee39f48b9873ee2f25013bdf0","unresolved":false,"context_lines":[{"line_number":790,"context_line":"            # We are going to delete the resource; the on delete will set the"},{"line_number":791,"context_line":"            # resource_id of the attached metrics to NULL, we just have to mark"},{"line_number":792,"context_line":"            # their status as \u0027delete\u0027"},{"line_number":793,"context_line":"            if type(resource_id) !\u003d list:"},{"line_number":794,"context_line":"                resource_id \u003d [resource_id]"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"            session.query(Metric).filter("}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_6d114d04","line":793,"updated":"2016-08-04 14:49:16.000000000","message":"rename resource_id variable to resources and use isinstance(resources, list) to be consistent","commit_id":"c7d9da0cbe4d9cc8a0b719fa8d2a2ab4340a4a02"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"85c20691d51f0baee39f48b9873ee2f25013bdf0","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            session.query(Metric).filter("},{"line_number":797,"context_line":"                Metric.resource_id.in_(resource_id)"},{"line_number":798,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":799,"context_line":"                     synchronize_session\u003d\u0027fetch\u0027)"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            if session.query(Resource).filter("},{"line_number":802,"context_line":"                    Resource.id.in_(resource_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_6db66dfa","line":799,"updated":"2016-08-04 14:49:16.000000000","message":"curious but what\u0027s the reason for \u0027fetch\u0027?","commit_id":"c7d9da0cbe4d9cc8a0b719fa8d2a2ab4340a4a02"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        session.expire(r, [\u0027metrics\u0027])"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":"    @retry_on_deadlock"},{"line_number":788,"context_line":"    def delete_resource(self, resources):"},{"line_number":789,"context_line":"        with self.facade.writer() as session:"},{"line_number":790,"context_line":"            # We are going to delete the resource; the on delete will set the"},{"line_number":791,"context_line":"            # resource_id of the attached metrics to NULL, we just have to mark"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_258a701b","line":788,"updated":"2016-08-06 13:16:12.000000000","message":"in that case go ahead and rename it to delete_resources","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":791,"context_line":"            # resource_id of the attached metrics to NULL, we just have to mark"},{"line_number":792,"context_line":"            # their status as \u0027delete\u0027"},{"line_number":793,"context_line":"            if not isinstance(resources, list):"},{"line_number":794,"context_line":"                resources \u003d [resources]"},{"line_number":795,"context_line":""},{"line_number":796,"context_line":"            session.query(Metric).filter("},{"line_number":797,"context_line":"                Metric.resource_id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_c598b477","line":794,"updated":"2016-08-06 13:16:12.000000000","message":"No, it\u0027ll be better to go ahead and fix the caller. Doing that on every call add some useless overhead.","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            session.query(Metric).filter("},{"line_number":797,"context_line":"                Metric.resource_id.in_(resources)"},{"line_number":798,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":799,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            if session.query(Resource).filter("},{"line_number":802,"context_line":"                    Resource.id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_a57e6016","line":799,"range":{"start_line":799,"start_character":21,"end_line":799,"end_character":46},"updated":"2016-08-06 13:16:12.000000000","message":"I have no idea what this is and why it is there so I\u0027m scared.","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":799,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            if session.query(Resource).filter("},{"line_number":802,"context_line":"                    Resource.id.in_(resources)"},{"line_number":803,"context_line":"            ).delete(synchronize_session\u003dFalse) \u003d\u003d 0:"},{"line_number":804,"context_line":"                raise indexer.NoSuchResource(Resource.id)"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    @retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_e574d836","line":803,"range":{"start_line":801,"start_character":12,"end_line":803,"end_character":53},"updated":"2016-08-06 13:16:12.000000000","message":"This is not gonna work. If the list contains N resources, you want to be sore you deleted N resources, and if that\u0027s not the case, you need to rollback and say which one(s) of the resource are not existing.","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":801,"context_line":"            if session.query(Resource).filter("},{"line_number":802,"context_line":"                    Resource.id.in_(resources)"},{"line_number":803,"context_line":"            ).delete(synchronize_session\u003dFalse) \u003d\u003d 0:"},{"line_number":804,"context_line":"                raise indexer.NoSuchResource(Resource.id)"},{"line_number":805,"context_line":""},{"line_number":806,"context_line":"    @retry_on_deadlock"},{"line_number":807,"context_line":"    def get_resource(self, resource_type, resource_id, with_metrics\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_c56f145e","line":804,"range":{"start_line":804,"start_character":45,"end_line":804,"end_character":56},"updated":"2016-08-06 13:16:12.000000000","message":"This is a field, not an id, it gives no info.","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            )"},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"            for metric in metrics:"},{"line_number":799,"context_line":"                metric.update({\"status\": \"delete\"})"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":802,"context_line":"                Resource.id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_633e708d","line":799,"updated":"2016-08-10 15:52:00.000000000","message":"you should be able to call metrics.update() directly","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"f32478488e5d00acb6ba2634507cc2b9a2eb8877","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            )"},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"            for metric in metrics:"},{"line_number":799,"context_line":"                metric.update({\"status\": \"delete\"})"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":802,"context_line":"                Resource.id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_9f60f502","line":799,"in_reply_to":"9ad45d7e_633e708d","updated":"2016-08-11 08:27:29.000000000","message":"I tried to use metrics.update(). but it continuously asked me to synchronise the objects in current session by setting synchronize_session paramter as \u0027fetch\u0027 or \u0027False\u0027:\n\n        InvalidRequestError: Could not evaluate current criteria in Python. Specify \u0027fetch\u0027 or False for the synchronize_session parameter","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":804,"context_line":""},{"line_number":805,"context_line":"            deleted_resources \u003d []"},{"line_number":806,"context_line":"            for resource in indexed_resources:"},{"line_number":807,"context_line":"                session.delete(resource)"},{"line_number":808,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"            if set(resources) \u003e set(deleted_resources):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_0375f462","line":807,"updated":"2016-08-10 15:52:00.000000000","message":"ditto","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                session.delete(resource)"},{"line_number":808,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":811,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"},{"line_number":812,"context_line":"                raise indexer.NoSuchResource(unknown_resource)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_43c7ec63","line":810,"updated":"2016-08-10 15:52:00.000000000","message":"delete() returns the number of row deleted, so you can compare it against the number of resources passed, and then if it\u0027s different, check which one might be unknown","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"f32478488e5d00acb6ba2634507cc2b9a2eb8877","unresolved":false,"context_lines":[{"line_number":807,"context_line":"                session.delete(resource)"},{"line_number":808,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":811,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"},{"line_number":812,"context_line":"                raise indexer.NoSuchResource(unknown_resource)"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_ba67c7b5","line":810,"in_reply_to":"9ad45d7e_43c7ec63","updated":"2016-08-11 08:27:29.000000000","message":"if user input duplicate existence ids, the resources will be longer than the indexed_resources.\n\nUsing \u0027set\u0027 might add some fault-tolerance ?","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"35eec402b62359ed242835b305dac5d194a2b894","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            )"},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"            for metric in metrics:"},{"line_number":799,"context_line":"                metric.update({\"status\": \"delete\"})"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":802,"context_line":"                Resource.id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_7364ae48","line":799,"updated":"2016-08-16 13:30:19.000000000","message":"why can\u0027t we do this in one statement above? this is a lot of individual SQL calls now.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"82aff0e9853d7bf9c8bc4e614c67a05c418cbd04","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            )"},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"            for metric in metrics:"},{"line_number":799,"context_line":"                metric.update({\"status\": \"delete\"})"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":802,"context_line":"                Resource.id.in_(resources)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ac06dbe_2f73ed4e","line":799,"in_reply_to":"3ac371cc_7364ae48","updated":"2016-08-22 10:26:57.000000000","message":"In fact, I try to update them together at once by using metrics.update({\"status\":\"delete\"}).\nIt throw a error and ask me to use synchronize\u003d\"false\" or \"fetch\".\n\nanyway, I will try again or think up a new way to update.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"35eec402b62359ed242835b305dac5d194a2b894","unresolved":false,"context_lines":[{"line_number":808,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":811,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"},{"line_number":812,"context_line":"                raise indexer.NoSuchResources(unknown_resource)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"    @retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_5308922c","line":811,"updated":"2016-08-16 13:30:19.000000000","message":"you already check for this beforehand in https://review.openstack.org/#/c/351043/8/gnocchi/rest/__init__.py\n\nwe shouldn\u0027t be doing this in two places.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f9c0c810bb58d4f3e84f9c13e2d525351568f919","unresolved":false,"context_lines":[{"line_number":808,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":809,"context_line":""},{"line_number":810,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":811,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"},{"line_number":812,"context_line":"                raise indexer.NoSuchResources(unknown_resource)"},{"line_number":813,"context_line":""},{"line_number":814,"context_line":"    @retry_on_deadlock"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_5650805d","line":811,"in_reply_to":"3ac371cc_5308922c","updated":"2016-08-16 13:34:52.000000000","message":"nevermind. ignore this. i understand it\u0027s for race scenarios. we can probably just use indexed_resources instead of having to capture again in deleted_resources though.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"35eec402b62359ed242835b305dac5d194a2b894","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1108,"context_line":"                        # therefore kept this."},{"line_number":1109,"context_line":"                        if isinstance(value, list):"},{"line_number":1110,"context_line":"                            value \u003d [converter(v) for v in value]"},{"line_number":1111,"context_line":"                        else:"},{"line_number":1112,"context_line":"                            value \u003d converter(value)"},{"line_number":1113,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_33f9964e","line":1110,"updated":"2016-08-16 13:30:19.000000000","message":"what\u0027s this for?","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"82aff0e9853d7bf9c8bc4e614c67a05c418cbd04","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1108,"context_line":"                        # therefore kept this."},{"line_number":1109,"context_line":"                        if isinstance(value, list):"},{"line_number":1110,"context_line":"                            value \u003d [converter(v) for v in value]"},{"line_number":1111,"context_line":"                        else:"},{"line_number":1112,"context_line":"                            value \u003d converter(value)"},{"line_number":1113,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ac06dbe_8fb781d7","line":1110,"in_reply_to":"3ac371cc_33f9964e","updated":"2016-08-22 10:26:57.000000000","message":"I changed here, because I met a exception, when I input an list to method list_resources.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"82aff0e9853d7bf9c8bc4e614c67a05c418cbd04","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1108,"context_line":"                        # therefore kept this."},{"line_number":1109,"context_line":"                        if isinstance(value, list):"},{"line_number":1110,"context_line":"                            value \u003d [converter(v) for v in value]"},{"line_number":1111,"context_line":"                        else:"},{"line_number":1112,"context_line":"                            value \u003d converter(value)"},{"line_number":1113,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ac06dbe_4f9589dc","line":1110,"in_reply_to":"3ac371cc_33f9964e","updated":"2016-08-22 10:26:57.000000000","message":"When I use list_resources(...) and set the parameter: attribute_filter\u003d{\"in\": {\"id\": ids}}).  The method throw an exception, which is caused by ids is a list type. therefore I thought list_resources() method can not filter a list by using \u0027in\u0027. then I kept this.","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8bdda33be240a9863a0699934299bd03572456fd","unresolved":false,"context_lines":[{"line_number":820,"context_line":"            resource_cls \u003d self._resource_type_to_classes("},{"line_number":821,"context_line":"                session, resource_type)[\u0027resource\u0027]"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"            if isinstance(resource_id, list):"},{"line_number":824,"context_line":"                q \u003d session.query("},{"line_number":825,"context_line":"                    resource_cls).filter("},{"line_number":826,"context_line":"                        resource_cls.id.in_(resource_id))"},{"line_number":827,"context_line":"                if with_metrics:"},{"line_number":828,"context_line":"                    q \u003d q.options(sqlalchemy.orm.joinedload(\u0027metrics\u0027))"},{"line_number":829,"context_line":"                return q.all()"},{"line_number":830,"context_line":"            else:"},{"line_number":831,"context_line":"                q \u003d session.query("},{"line_number":832,"context_line":"                    resource_cls).filter("},{"line_number":833,"context_line":"                        resource_cls.id \u003d\u003d resource_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_f7763aa2","line":830,"range":{"start_line":823,"start_character":12,"end_line":830,"end_character":17},"updated":"2016-08-24 08:02:22.000000000","message":"I can delete these, since we do not need get_resource to accept a list anymore.","commit_id":"eaa5c93f3c14107e120f5ac052e93a7782554c80"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"943e5e58aa5f397c978b678be14d998cf9619231","unresolved":false,"context_lines":[{"line_number":808,"context_line":"            deleted_resources \u003d []"},{"line_number":809,"context_line":"            for resource in indexed_resources:"},{"line_number":810,"context_line":"                session.delete(resource)"},{"line_number":811,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":814,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_2f19c379","line":811,"updated":"2016-08-29 15:11:30.000000000","message":"if we\u0027re just going to delete this resources individually here, i don\u0027t think it really makes sense to have this delete_resources... just leave this method as is and call it each time.","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"80efe16bc85692f6c0fa44330e0be948034b6518","unresolved":false,"context_lines":[{"line_number":808,"context_line":"            deleted_resources \u003d []"},{"line_number":809,"context_line":"            for resource in indexed_resources:"},{"line_number":810,"context_line":"                session.delete(resource)"},{"line_number":811,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"            if set(resources) \u003e set(deleted_resources):"},{"line_number":814,"context_line":"                unknown_resource \u003d set(resources) - set(deleted_resources)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_496d9e03","line":811,"in_reply_to":"fa7ab95a_2f19c379","updated":"2016-09-05 03:16:05.000000000","message":"thanks for your advise, I see what you mean. but do you think it better to encapsulate the session.delete() method, and it wont be carry out, unless the session is expired.","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"943e5e58aa5f397c978b678be14d998cf9619231","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                        resource_cls.id \u003d\u003d resource_id)"},{"line_number":834,"context_line":"                if with_metrics:"},{"line_number":835,"context_line":"                    q \u003d q.options(sqlalchemy.orm.joinedload(\u0027metrics\u0027))"},{"line_number":836,"context_line":"                return q.first()"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"    def _get_history_result_mapper(self, session, resource_type):"},{"line_number":839,"context_line":"        classes \u003d self._resource_type_to_classes(session, resource_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_746562b3","line":836,"updated":"2016-08-29 15:11:30.000000000","message":"we should not need this duplicated. just change this to get_resources","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"80efe16bc85692f6c0fa44330e0be948034b6518","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                        resource_cls.id \u003d\u003d resource_id)"},{"line_number":834,"context_line":"                if with_metrics:"},{"line_number":835,"context_line":"                    q \u003d q.options(sqlalchemy.orm.joinedload(\u0027metrics\u0027))"},{"line_number":836,"context_line":"                return q.first()"},{"line_number":837,"context_line":""},{"line_number":838,"context_line":"    def _get_history_result_mapper(self, session, resource_type):"},{"line_number":839,"context_line":"        classes \u003d self._resource_type_to_classes(session, resource_type)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_6949828b","line":836,"in_reply_to":"fa7ab95a_746562b3","updated":"2016-09-05 03:16:05.000000000","message":"yes, you are right, I will delete this.","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"943e5e58aa5f397c978b678be14d998cf9619231","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1111,"context_line":"                        # therefore kept this."},{"line_number":1112,"context_line":"                        if isinstance(value, list):"},{"line_number":1113,"context_line":"                            value \u003d [converter(v) for v in value]"},{"line_number":1114,"context_line":"                        else:"},{"line_number":1115,"context_line":"                            value \u003d converter(value)"},{"line_number":1116,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa7ab95a_cfdf7767","line":1113,"updated":"2016-08-29 15:11:30.000000000","message":"there already is an in operator. we  should be using that i believe.\n\nhttps://github.com/openstack/gnocchi/blob/08bc1858f6869c5e94c50e901e34ae10e881ad17/gnocchi/indexer/sqlalchemy.py#L1016","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"f3f059e638e147d7fd8e6fad8fb7af0247ed1c6a","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1111,"context_line":"                        # therefore kept this."},{"line_number":1112,"context_line":"                        if isinstance(value, list):"},{"line_number":1113,"context_line":"                            value \u003d [converter(v) for v in value]"},{"line_number":1114,"context_line":"                        else:"},{"line_number":1115,"context_line":"                            value \u003d converter(value)"},{"line_number":1116,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a89bdaa_04a8d31e","line":1113,"in_reply_to":"fa7ab95a_cfdf7767","updated":"2016-09-05 08:56:05.000000000","message":"what if the uuid is a list of string. like:\n\ncurl  -H \"Content-Type: application/json\" -H \"X-Auth-Token:f17b2c688fb44458b24689959d5f76f2\" -X DELETE http://127.0.0.1:8042/v1/resource/generic -d \u0027{\"in\":{\"id\":[\"6cbe2a06-eeee-42ee-1111-9998ba5b60d8\",\"6cbe2a06-eeee-42ee-2222-9998ba5b60d8\",\"6cbe2a06-eeee-42ee-3333-9998ba5b60d8\"]}}\u0027\n\n\\n\n\nIt will gives exception like: \n\nQueryValueError: Invalid value: `[u\u00276cbe2a06-eeee-42ee-1111-9998ba5b60d8\u0027, u\u00276cbe2a06-eeee-42ee-2222-9998ba5b60d8\u0027, u\u00276cbe2a06-eeee-42ee-3333-9998ba5b60d8\u0027]\u0027 for field `id\u0027","commit_id":"c41afe972664cb8a27fa68fb584ef243212afcd1"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":797,"context_line":"            # But since we wont refer to the deleted metrics in following code,"},{"line_number":798,"context_line":"            # thus everything will be fine and deleted after session expired."},{"line_number":799,"context_line":"            session.query(Metric).filter("},{"line_number":800,"context_line":"                Metric.resource_id.in_(resources)"},{"line_number":801,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":802,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":803,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_30a18895","line":800,"updated":"2016-09-05 12:05:56.000000000","message":"We must ensure at this layer that resources is not an empty list or None otherwise the behavior of the request is predictable.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"fe8d288593edf7ba4e949608e2cdb4f5426916d3","unresolved":false,"context_lines":[{"line_number":797,"context_line":"            # But since we wont refer to the deleted metrics in following code,"},{"line_number":798,"context_line":"            # thus everything will be fine and deleted after session expired."},{"line_number":799,"context_line":"            session.query(Metric).filter("},{"line_number":800,"context_line":"                Metric.resource_id.in_(resources)"},{"line_number":801,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":802,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":803,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_87610a3c","line":800,"in_reply_to":"9a89bdaa_12ff0368","updated":"2016-09-06 13:05:40.000000000","message":"That looks ok","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8e3689a0e0112ff81075a0c85e3e2a36a8e9f6e8","unresolved":false,"context_lines":[{"line_number":797,"context_line":"            # But since we wont refer to the deleted metrics in following code,"},{"line_number":798,"context_line":"            # thus everything will be fine and deleted after session expired."},{"line_number":799,"context_line":"            session.query(Metric).filter("},{"line_number":800,"context_line":"                Metric.resource_id.in_(resources)"},{"line_number":801,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":802,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":803,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_12ff0368","line":800,"in_reply_to":"9a89bdaa_30a18895","updated":"2016-09-06 10:36:39.000000000","message":"if the resources is empty, could I return {\u0027delete\u0027:0} here ?","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":801,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":802,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":805,"context_line":"                Resource.id.in_(resources)"},{"line_number":806,"context_line":"            )"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_d0b4dcf3","line":804,"updated":"2016-09-05 12:05:56.000000000","message":"Select then delete increases (a lot) the change of deadlock. And a lot of sqlalchemy workload to load objects for just the ids. Not sure the precise exception worth it.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8e3689a0e0112ff81075a0c85e3e2a36a8e9f6e8","unresolved":false,"context_lines":[{"line_number":801,"context_line":"            ).update({\"status\": \"delete\"},"},{"line_number":802,"context_line":"                     synchronize_session\u003dFalse)"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"            indexed_resources \u003d session.query(Resource).filter("},{"line_number":805,"context_line":"                Resource.id.in_(resources)"},{"line_number":806,"context_line":"            )"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_5227cb11","line":804,"in_reply_to":"9a89bdaa_d0b4dcf3","updated":"2016-09-06 10:36:39.000000000","message":"I will change here by deleting bulk of resources instead, it will be more efficient.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":807,"context_line":""},{"line_number":808,"context_line":"            deleted_resources \u003d []"},{"line_number":809,"context_line":"            for resource in indexed_resources:"},{"line_number":810,"context_line":"                session.delete(resource)"},{"line_number":811,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"            if set(resources) \u003e set(deleted_resources):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_10cf2480","line":810,"updated":"2016-09-05 12:05:56.000000000","message":"session.delete don\u0027t raise exception here but only when session.commit() is called (and this is called when the \u0027with\u0027 blocks ends), so NoSuchResources can never be raised...","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8e3689a0e0112ff81075a0c85e3e2a36a8e9f6e8","unresolved":false,"context_lines":[{"line_number":807,"context_line":""},{"line_number":808,"context_line":"            deleted_resources \u003d []"},{"line_number":809,"context_line":"            for resource in indexed_resources:"},{"line_number":810,"context_line":"                session.delete(resource)"},{"line_number":811,"context_line":"                deleted_resources.append(str(resource.id))"},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"            if set(resources) \u003e set(deleted_resources):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_327167e1","line":810,"in_reply_to":"9a89bdaa_10cf2480","updated":"2016-09-06 10:36:39.000000000","message":"I will change here by compare the delete_num and the resource num.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":1098,"context_line":""},{"line_number":1099,"context_line":"                if converter:"},{"line_number":1100,"context_line":"                    try:"},{"line_number":1101,"context_line":"                        # the origin code will throw an exception"},{"line_number":1102,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1103,"context_line":"                        # therefore kept this."},{"line_number":1104,"context_line":"                        if isinstance(value, list):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_f3b56acd","line":1101,"updated":"2016-09-05 12:05:56.000000000","message":"This is unrelated to this change and need to go in another change with appropriate bug report.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"df99f6c1a0c08d7d4478650a293cb5fe0355d89f","unresolved":false,"context_lines":[{"line_number":810,"context_line":""},{"line_number":811,"context_line":"            # when race happens, tell user resources"},{"line_number":812,"context_line":"            # that have been deleted"},{"line_number":813,"context_line":"            if deleted_num !\u003d len(set(resources)):"},{"line_number":814,"context_line":"                unknown_resources \u003d ["},{"line_number":815,"context_line":"                    resource for resource in resources"},{"line_number":816,"context_line":"                    if not session.query(Resource).filter("},{"line_number":817,"context_line":"                        Resource.id \u003d\u003d resource"},{"line_number":818,"context_line":"                    ).scalar()"},{"line_number":819,"context_line":"                ]"},{"line_number":820,"context_line":"                if unknown_resources:"},{"line_number":821,"context_line":"                    raise indexer.NoSuchResources(unknown_resources)"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"            return deleted_num"},{"line_number":824,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_27091e32","line":821,"range":{"start_line":813,"start_character":0,"end_line":821,"end_character":68},"updated":"2016-09-06 13:06:28.000000000","message":"This makes sense at indexer layer but this cannot be triggered by the \"batch delete code\" at REST layer.\n\n\nThis is triggered by the \"one resource delete code\" at REST layer but we already known the ID of the resource in that case we don\u0027t have to compute it.\nAnd also REST layer expected indexer.NoSuchResource (without s) to be raised in that case.","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"df99f6c1a0c08d7d4478650a293cb5fe0355d89f","unresolved":false,"context_lines":[{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"                if converter:"},{"line_number":1108,"context_line":"                    try:"},{"line_number":1109,"context_line":"                        # the origin code will throw an exception"},{"line_number":1110,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1111,"context_line":"                        # therefore kept this."},{"line_number":1112,"context_line":"                        if isinstance(value, list):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_07289ae1","line":1109,"updated":"2016-09-06 13:06:28.000000000","message":"Why is this still here ? Can you fix this bug in another review.","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"500da7fc39056e40417c3b3750474b4d72a786dd","unresolved":false,"context_lines":[{"line_number":1106,"context_line":""},{"line_number":1107,"context_line":"                if converter:"},{"line_number":1108,"context_line":"                    try:"},{"line_number":1109,"context_line":"                        # the origin code will throw an exception"},{"line_number":1110,"context_line":"                        # if value of attribute_filter is a list"},{"line_number":1111,"context_line":"                        # therefore kept this."},{"line_number":1112,"context_line":"                        if isinstance(value, list):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_c5d5451c","line":1109,"in_reply_to":"9a89bdaa_07289ae1","updated":"2016-09-08 14:07:17.000000000","message":"I have separated this fix here: https://review.openstack.org/367400","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"}],"gnocchi/rest/__init__.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"85c20691d51f0baee39f48b9873ee2f25013bdf0","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"    def post_delete(self, **kwargs):"},{"line_number":1073,"context_line":"        ids \u003d kwargs.get(\u0027ids\u0027, [])"},{"line_number":1074,"context_line":"        for res_id in ids:"},{"line_number":1075,"context_line":"            resource \u003d pecan.request.indexer.get_resource("},{"line_number":1076,"context_line":"                self._resource_type, res_id)"},{"line_number":1077,"context_line":"            if not resource:"},{"line_number":1078,"context_line":"                abort(404, indexer.NoSuchResource(res_id))"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_0dab7176","line":1075,"updated":"2016-08-04 14:49:16.000000000","message":"i think we should get all resources in one query rather than one query per resource.","commit_id":"c7d9da0cbe4d9cc8a0b719fa8d2a2ab4340a4a02"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"85c20691d51f0baee39f48b9873ee2f25013bdf0","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"            if not resource:"},{"line_number":1078,"context_line":"                abort(404, indexer.NoSuchResource(res_id))"},{"line_number":1079,"context_line":"            enforce(\"delete resource\", resource)"},{"line_number":1080,"context_line":"            etag_precondition_check(resource)"},{"line_number":1081,"context_line":"        try:"},{"line_number":1082,"context_line":"            pecan.request.indexer.delete_resource(ids)"},{"line_number":1083,"context_line":"            pecan.response.status \u003d 204"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_adaea52b","line":1080,"updated":"2016-08-04 14:49:16.000000000","message":"you should handle this similar to how we do batching support.\n\nhttps://github.com/openstack/gnocchi/blob/master/gnocchi/rest/__init__.py#L1314-L1326","commit_id":"c7d9da0cbe4d9cc8a0b719fa8d2a2ab4340a4a02"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":1071,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":1072,"context_line":"    def post_delete(self, **kwargs):"},{"line_number":1073,"context_line":"        ids \u003d set(kwargs.get(\u0027ids\u0027, []))"},{"line_number":1074,"context_line":"        resources \u003d {}"},{"line_number":1075,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":1076,"context_line":"            self._resource_type)"},{"line_number":1077,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_6597483a","line":1074,"updated":"2016-08-06 13:16:12.000000000","message":"This is overwritten by line 1078","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"f43bc5e43981398672971f5f75810648b89da425","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"    def post_delete(self, **kwargs):"},{"line_number":1073,"context_line":"        ids \u003d set(kwargs.get(\u0027ids\u0027, []))"},{"line_number":1074,"context_line":"        resources \u003d {}"},{"line_number":1075,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":1076,"context_line":"            self._resource_type)"},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"        resources \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_a5a5c0a2","line":1075,"updated":"2016-08-06 13:16:12.000000000","message":"are you listing ALL resources? This… can return millions of resources… don\u0027t do that :(","commit_id":"1093c40eb433b728555633d5edcc794e786b7a5e"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"            abort(400, e)"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":1072,"context_line":"    def post_delete(self, **kwargs):"},{"line_number":1073,"context_line":"        ids \u003d kwargs.get(\u0027ids\u0027, [])"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_03fb347a","line":1072,"updated":"2016-08-10 15:52:00.000000000","message":"This is equivalent to delete in pecan unless I\u0027m missing something, so this should be \"delete\"","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":1072,"context_line":"    def post_delete(self, **kwargs):"},{"line_number":1073,"context_line":"        ids \u003d kwargs.get(\u0027ids\u0027, [])"},{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":1076,"context_line":"            self._resource_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_a338683e","line":1073,"updated":"2016-08-10 15:52:00.000000000","message":"don\u0027t use kwargs id you know the kwargs, just use a proper signature","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1074,"context_line":""},{"line_number":1075,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":1076,"context_line":"            self._resource_type,"},{"line_number":1077,"context_line":"            attribute_filter\u003d{\"in\": {\"id\": ids}})"},{"line_number":1078,"context_line":""},{"line_number":1079,"context_line":"        input_ids \u003d set(ids)"},{"line_number":1080,"context_line":"        indexed_ids \u003d set([str(r.id) for r in indexed_resources])"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_837ba4f4","line":1077,"updated":"2016-08-10 15:52:00.000000000","message":"This is ok-ish… but I think having to compile an attribute_filter here is overkill, we should just have a get_resources() method – but i\u0027d be ok to fix that in a subsequent patch.","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"            attribute_filter\u003d{\"in\": {\"id\": ids}})"},{"line_number":1078,"context_line":""},{"line_number":1079,"context_line":"        input_ids \u003d set(ids)"},{"line_number":1080,"context_line":"        indexed_ids \u003d set([str(r.id) for r in indexed_resources])"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if input_ids \u003e indexed_ids:"},{"line_number":1083,"context_line":"            abort(404, indexer.NoSuchResource("}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_43e40cab","line":1080,"range":{"start_line":1080,"start_character":26,"end_line":1080,"end_character":27},"updated":"2016-08-10 15:52:00.000000000","message":"no need for []","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if input_ids \u003e indexed_ids:"},{"line_number":1083,"context_line":"            abort(404, indexer.NoSuchResource("},{"line_number":1084,"context_line":"                list(input_ids-indexed_ids)))"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"        for resource in indexed_resources:"},{"line_number":1087,"context_line":"            enforce(\"delete resource\", resource)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_037a14bd","line":1084,"updated":"2016-08-10 15:52:00.000000000","message":"this exception is not meant to return several resources at once – you\u0027d need to define a new exception type to be perfect: NoSuchResources","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c8c81043a6d7792d0701ba65041245765904286f","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"        for resource in indexed_resources:"},{"line_number":1087,"context_line":"            enforce(\"delete resource\", resource)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"        pecan.request.indexer.delete_resources(ids)"},{"line_number":1090,"context_line":"        pecan.response.status \u003d 204"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_8333a413","line":1089,"updated":"2016-08-10 15:52:00.000000000","message":"This can raise so you need a try/except","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"f32478488e5d00acb6ba2634507cc2b9a2eb8877","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"        for resource in indexed_resources:"},{"line_number":1087,"context_line":"            enforce(\"delete resource\", resource)"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"        pecan.request.indexer.delete_resources(ids)"},{"line_number":1090,"context_line":"        pecan.response.status \u003d 204"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_5fa31d00","line":1089,"in_reply_to":"9ad45d7e_8333a413","updated":"2016-08-11 08:27:29.000000000","message":"I worte the try/except, but It can not caught the exception.\n\nbecause it already caught by :\n       /usr/local/lib/python2.7/dist-packages/oslo_db/api.py(141)\nthe wrapper has digested the exception finely.\n\nIt displayed the indications on the screen:\n     404 Not Found\n\n     The resource could not be found.\n\n     Resources set([u\u00276cbe2a06-0000-42ee-ba1d-9998ba5b60d8\u0027,    u\u00276cbe2a06-1111-42ee-ba1d-9998ba5b60d8\u0027]) do not exist","commit_id":"13dc881b1642d82a549635f382be2288c2c75340"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"35eec402b62359ed242835b305dac5d194a2b894","unresolved":false,"context_lines":[{"line_number":978,"context_line":"        indexed_resources \u003d pecan.request.indexer.get_resource("},{"line_number":979,"context_line":"            self._resource_type, resource_ids)"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"        input_ids \u003d set(resource_ids)"},{"line_number":982,"context_line":"        indexed_ids \u003d set(str(r.id) for r in indexed_resources)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        if input_ids \u003e indexed_ids:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_962dd848","line":981,"updated":"2016-08-16 13:30:19.000000000","message":"this should be done before get_resource","commit_id":"050c3acce665ded81c595f49c224b14824453ef8"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"dfa606596c7e063cc8dcaf909a4b3344e6cb65fc","unresolved":false,"context_lines":[{"line_number":975,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":976,"context_line":"    def delete(self, **kwargs):"},{"line_number":977,"context_line":"        if pecan.request.body:"},{"line_number":978,"context_line":"            attr_filter \u003d deserialize_and_validate("},{"line_number":979,"context_line":"                SearchResourceTypeController.ResourceSearchSchema)"},{"line_number":980,"context_line":"        else:"},{"line_number":981,"context_line":"            attr_filter \u003d None"},{"line_number":982,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac06dbe_d4521c12","line":979,"range":{"start_line":978,"start_character":12,"end_line":979,"end_character":66},"updated":"2016-08-24 07:45:42.000000000","message":"should I write a new voluptuous scheme rather than using the exist one?","commit_id":"eaa5c93f3c14107e120f5ac052e93a7782554c80"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":988,"context_line":"            self._resource_type,"},{"line_number":989,"context_line":"            attribute_filter\u003dattr_filter)"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"        if not indexed_resources:"},{"line_number":992,"context_line":"            abort(404, indexer.NoResourcesFoundByAttr("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_93c7be11","line":989,"updated":"2016-09-05 12:05:56.000000000","message":"List then delete is not really concurrency safe, when we do this for one resource, this is OK, because this will end into a 404 whatever race occurs, but for many resources, if one resource is deleted in the meanwhile the whole thing fail.\n\nBut here we have to discuss if we want \n* the policy enforcing done on all resources (and then we don\u0027t have other choice to do the list+delete\n\nor:\n\n* the policy enforcing done on something like \u0027batch delete resources\u0027\n\nI\u0027m in favor of the \u0027delete batch resources\u0027 that is much more performant and we have _get_list_resource_policy_filter() to enhance the attribute_filter with the policy to ensure we delete only owned resources.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8e3689a0e0112ff81075a0c85e3e2a36a8e9f6e8","unresolved":false,"context_lines":[{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        indexed_resources \u003d pecan.request.indexer.list_resources("},{"line_number":988,"context_line":"            self._resource_type,"},{"line_number":989,"context_line":"            attribute_filter\u003dattr_filter)"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"        if not indexed_resources:"},{"line_number":992,"context_line":"            abort(404, indexer.NoResourcesFoundByAttr("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_39279a65","line":989,"in_reply_to":"9a89bdaa_93c7be11","updated":"2016-09-06 10:36:39.000000000","message":"you are right, I used the _get_list_resource_policy_filter() instead.\n\nfor the race scenario, could I do a double check to compare the deleted resources num with resources num, before committed","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":990,"context_line":""},{"line_number":991,"context_line":"        if not indexed_resources:"},{"line_number":992,"context_line":"            abort(404, indexer.NoResourcesFoundByAttr("},{"line_number":993,"context_line":"                attr_filter))"},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"        for resource in indexed_resources:"},{"line_number":996,"context_line":"            enforce(\"delete resource\", resource)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a89bdaa_939b3ec9","line":993,"updated":"2016-09-05 12:05:56.000000000","message":"If I created a script that periodically delete entries, I don\u0027t thing it\u0027s good to sometimes got 404 something having entries deleted.\n\nSo for me if the request is valid, but the query deletes 0 resource, it\u0027s OK and we should return 204. The API call have done what we have asked.\n\nIf we want to inform the user when no resources are deleted we must return a json (or a header) like:\n\n   {\u0027deleted\u0027: 0}","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"df99f6c1a0c08d7d4478650a293cb5fe0355d89f","unresolved":false,"context_lines":[{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        resource_ids \u003d [resource.id for resource in indexed_resources]"},{"line_number":1007,"context_line":"        try:"},{"line_number":1008,"context_line":"            delete_num \u003d pecan.request.indexer.delete_resources(resource_ids)"},{"line_number":1009,"context_line":"        except indexer.NoSuchResources as e:"},{"line_number":1010,"context_line":"            abort(409, e)"},{"line_number":1011,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_47dd420d","line":1008,"updated":"2016-09-06 13:06:28.000000000","message":"Why delete_resources doesn\u0027t take the same args as list_resources ? If at REST layer we have filters why do we convert that to list of IDs for the indexer layer ? \n\nI think passing all of this to the indexer sql directly, will allow to do all of that in only 2 queries.\n\n\nI wonder if raising indexer.NoSuchResources have any sense for this REST endpoint.\n\n\n@jd can I have your opinion on this ?","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"7b2ddfffe581399745c67a9f53c1a1bacb43fd8c","unresolved":false,"context_lines":[{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        resource_ids \u003d [resource.id for resource in indexed_resources]"},{"line_number":1007,"context_line":"        try:"},{"line_number":1008,"context_line":"            delete_num \u003d pecan.request.indexer.delete_resources(resource_ids)"},{"line_number":1009,"context_line":"        except indexer.NoSuchResources as e:"},{"line_number":1010,"context_line":"            abort(409, e)"},{"line_number":1011,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_8205787b","line":1008,"in_reply_to":"9a89bdaa_47dd420d","updated":"2016-09-06 13:12:28.000000000","message":"Agreed, that currently breaks our ACID model of the indexer and it\u0027s just point less :)","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"2fe8e07be64cfacac22f9289054f84309fefda38","unresolved":false,"context_lines":[{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        resource_ids \u003d [resource.id for resource in indexed_resources]"},{"line_number":1007,"context_line":"        try:"},{"line_number":1008,"context_line":"            delete_num \u003d pecan.request.indexer.delete_resources(resource_ids)"},{"line_number":1009,"context_line":"        except indexer.NoSuchResources as e:"},{"line_number":1010,"context_line":"            abort(409, e)"},{"line_number":1011,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_a4dfc867","line":1008,"in_reply_to":"9a89bdaa_47dd420d","updated":"2016-09-07 07:59:34.000000000","message":"ah..., I see what you mean. I can not help agree with you both. Originally, I was  thinking to keep the code less  changed as possible as I could, but I am wrong.\n\n\nI have some uncertainties here:  \n\n\nwhen we delete resources, we will find and update metrics related to that resources filtered by unique resource id. then we need find all resource ids, right.\n\n\nwhen use attributes filter ( like list_resources uses ), if someone wants to delete all generic resource {\"\u003e\u003d\":{\"started_at\":\"2016-09-5\"}}, it may query out other resources that satisfies timestamp as well. since we use base.Resource for all other resources right ?","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"2fe8e07be64cfacac22f9289054f84309fefda38","unresolved":false,"context_lines":[{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        resource_ids \u003d [resource.id for resource in indexed_resources]"},{"line_number":1007,"context_line":"        try:"},{"line_number":1008,"context_line":"            delete_num \u003d pecan.request.indexer.delete_resources(resource_ids)"},{"line_number":1009,"context_line":"        except indexer.NoSuchResources as e:"},{"line_number":1010,"context_line":"            abort(409, e)"},{"line_number":1011,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_c4884cc8","line":1008,"in_reply_to":"9a89bdaa_8205787b","updated":"2016-09-07 07:59:34.000000000","message":"yes, It is true, I am totally wrong here. not follow and think the pattern it should be. I am really appreciated you for pointing out this for me.","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"500da7fc39056e40417c3b3750474b4d72a786dd","unresolved":false,"context_lines":[{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        resource_ids \u003d [resource.id for resource in indexed_resources]"},{"line_number":1007,"context_line":"        try:"},{"line_number":1008,"context_line":"            delete_num \u003d pecan.request.indexer.delete_resources(resource_ids)"},{"line_number":1009,"context_line":"        except indexer.NoSuchResources as e:"},{"line_number":1010,"context_line":"            abort(409, e)"},{"line_number":1011,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a89bdaa_fdd5831b","line":1008,"in_reply_to":"9a89bdaa_c4884cc8","updated":"2016-09-08 14:07:17.000000000","message":"You have done most of the work, you write the tests case !\n\nI have pushed a change that does the list/update/delete into 1 indexer call. So you see what I mean.\n\n\nIf you want to delete explicitly only generic resources you have to filter on type\u003d\u0027generic\u0027 too.","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"0910042c9c65033665c8135c5e755a685a0feeab","unresolved":false,"context_lines":[{"line_number":979,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":980,"context_line":"    def delete(self, **kwargs):"},{"line_number":981,"context_line":"        # NOTE(sileht): Don\u0027t allow empty filter, this is going to delete"},{"line_number":982,"context_line":"        # the entire database."},{"line_number":983,"context_line":"        attr_filter \u003d deserialize_and_validate("},{"line_number":984,"context_line":"            SearchResourceTypeController.ResourceSearchSchema)"},{"line_number":985,"context_line":"        if not attr_filter:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a89bdaa_567ac9bd","line":982,"updated":"2016-09-08 14:53:18.000000000","message":"LOL. can we add a test that explicitly looks for this failure. ie. finds \u0027the query must be provided\u0027 string. this seems like something we should specifically look for given severity.lol","commit_id":"1da745bfe9be24542834b69c1d002b5e8030e295"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1e1ac3ffc9a5cb1e9ac71ad3a262f147b4f510fb","unresolved":false,"context_lines":[{"line_number":979,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":980,"context_line":"    def delete(self, **kwargs):"},{"line_number":981,"context_line":"        # NOTE(sileht): Don\u0027t allow empty filter, this is going to delete"},{"line_number":982,"context_line":"        # the entire database."},{"line_number":983,"context_line":"        attr_filter \u003d deserialize_and_validate("},{"line_number":984,"context_line":"            SearchResourceTypeController.ResourceSearchSchema)"},{"line_number":985,"context_line":"        if not attr_filter:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a89bdaa_98d55be6","line":982,"in_reply_to":"9a89bdaa_567ac9bd","updated":"2016-09-08 15:24:54.000000000","message":"Agreed a test for this could be good.","commit_id":"1da745bfe9be24542834b69c1d002b5e8030e295"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"8b377fabaa04f9e3ba48c41f44aed233e31ceee0","unresolved":false,"context_lines":[{"line_number":985,"context_line":"        attr_filter \u003d deserialize_and_validate("},{"line_number":986,"context_line":"            SearchResourceTypeController.ResourceSearchSchema)"},{"line_number":987,"context_line":"        if not attr_filter:"},{"line_number":988,"context_line":"            abort(400, \"the query must be provided\")"},{"line_number":989,"context_line":""},{"line_number":990,"context_line":"        user, project \u003d get_user_and_project()"},{"line_number":991,"context_line":"        policy_filter \u003d _get_list_resource_policy_filter("}],"source_content_type":"text/x-python","patch_set":18,"id":"9a89bdaa_4df99c4d","line":988,"range":{"start_line":988,"start_character":28,"end_line":988,"end_character":33},"updated":"2016-09-13 09:01:40.000000000","message":"this is unclear","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"8b377fabaa04f9e3ba48c41f44aed233e31ceee0","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"        except indexer.IndexerException as e:"},{"line_number":1001,"context_line":"            abort(400, e)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        pecan.response.status \u003d 200"},{"line_number":1004,"context_line":"        return {\"deleted\": delete_num}"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a89bdaa_2d87f8b5","line":1003,"updated":"2016-09-13 09:01:40.000000000","message":"this is not needed, it\u0027s automatically set by pecan","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"1f754ece402d671851ccd1893707f6c20defc43c","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                    u\"and\", u\"∨\","},{"line_number":1052,"context_line":"                    u\"or\", u\"∧\","},{"line_number":1053,"context_line":"                    u\"not\","},{"line_number":1054,"context_line":"                ): voluptuous.All("},{"line_number":1055,"context_line":"                    [_ResourceSearchSchema], voluptuous.Length(min\u003d1)"},{"line_number":1056,"context_line":"                )"},{"line_number":1057,"context_line":"            }"},{"line_number":1058,"context_line":"        )"},{"line_number":1059,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a8ec9b2_811dc611","line":1056,"range":{"start_line":1054,"start_character":19,"end_line":1056,"end_character":17},"updated":"2016-09-14 04:59:58.000000000","message":"changed a bit for somthing like \u0027{\"and\":[]}\u0027  and other empty querys","commit_id":"c2fb9742a485851d3a66d223783bdde85ea63939"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"3f2ccda4324a4b71c32cd91d0313ed6afe21bf51","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                    u\"and\", u\"∨\","},{"line_number":1052,"context_line":"                    u\"or\", u\"∧\","},{"line_number":1053,"context_line":"                    u\"not\","},{"line_number":1054,"context_line":"                ): voluptuous.All("},{"line_number":1055,"context_line":"                    [_ResourceSearchSchema], voluptuous.Length(min\u003d1)"},{"line_number":1056,"context_line":"                )"},{"line_number":1057,"context_line":"            }"},{"line_number":1058,"context_line":"        )"},{"line_number":1059,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a8ec9b2_1312edb4","line":1056,"range":{"start_line":1054,"start_character":19,"end_line":1056,"end_character":17},"in_reply_to":"7a8ec9b2_811dc611","updated":"2016-09-14 05:55:30.000000000","message":"I don\u0027t  get why we need this .","commit_id":"c2fb9742a485851d3a66d223783bdde85ea63939"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"db96558b7bced75d80b22bf220db8630e4405a61","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"                    u\"and\", u\"∨\","},{"line_number":1133,"context_line":"                    u\"or\", u\"∧\","},{"line_number":1134,"context_line":"                    u\"not\","},{"line_number":1135,"context_line":"                ): voluptuous.All("},{"line_number":1136,"context_line":"                    [_ResourceSearchSchema], voluptuous.Length(min\u003d1)"},{"line_number":1137,"context_line":"                )"},{"line_number":1138,"context_line":"            }"},{"line_number":1139,"context_line":"        )"},{"line_number":1140,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a8ec9b2_533b95eb","line":1137,"range":{"start_line":1135,"start_character":19,"end_line":1137,"end_character":17},"updated":"2016-09-14 06:04:54.000000000","message":"when I do the delete resources test like this:\ncurl -H \"Content-Type: application/json\" -H \"X-Auth-Token:74b25b30e7794c2d9f295afffbe1bdba\" -X DELETE http://127.0.0.1:8041/v1/resource/generic -d \u0027{\"and\":[]}\u0027\n\nI deleted all the resources.\n\nif not attr_filter:\n            abort(400, \"caution: the query can not be empty, or it will \\\n                  delete entire database\")\n\nthe attr_filter is {\"and\": []}, if not attr_filter is True.","commit_id":"18624af38ad360163781021a29adbcfa9f2a063c"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"1ae50b7a7a1c20364da3604665e995d25f812dc5","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"                    u\"and\", u\"∨\","},{"line_number":1133,"context_line":"                    u\"or\", u\"∧\","},{"line_number":1134,"context_line":"                    u\"not\","},{"line_number":1135,"context_line":"                ): voluptuous.All("},{"line_number":1136,"context_line":"                    [_ResourceSearchSchema], voluptuous.Length(min\u003d1)"},{"line_number":1137,"context_line":"                )"},{"line_number":1138,"context_line":"            }"},{"line_number":1139,"context_line":"        )"},{"line_number":1140,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a8ec9b2_45c74012","line":1137,"range":{"start_line":1135,"start_character":19,"end_line":1137,"end_character":17},"in_reply_to":"7a8ec9b2_533b95eb","updated":"2016-09-14 09:16:31.000000000","message":"I got it, good idea.","commit_id":"18624af38ad360163781021a29adbcfa9f2a063c"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"247dde162200a3b903d9d0575f95c543c026f2b7","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"                    u\"and\", u\"∨\","},{"line_number":1133,"context_line":"                    u\"or\", u\"∧\","},{"line_number":1134,"context_line":"                    u\"not\","},{"line_number":1135,"context_line":"                ): voluptuous.All("},{"line_number":1136,"context_line":"                    [_ResourceSearchSchema], voluptuous.Length(min\u003d1)"},{"line_number":1137,"context_line":"                )"},{"line_number":1138,"context_line":"            }"},{"line_number":1139,"context_line":"        )"},{"line_number":1140,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a8ec9b2_f631efed","line":1137,"range":{"start_line":1135,"start_character":19,"end_line":1137,"end_character":17},"in_reply_to":"7a8ec9b2_533b95eb","updated":"2016-09-14 06:12:43.000000000","message":"the attr_fitler is \u0027{\"and\":[]}\u0027,  \n\n\n\u0027if not attr_filter\u0027 is not true","commit_id":"18624af38ad360163781021a29adbcfa9f2a063c"}],"gnocchi/tests/gabbi/gabbits/resource.yaml":[{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"40753af2ca66f75728662b8a37c1fc82e625a1fe","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            id:"},{"line_number":974,"context_line":"              - f93450f2-eeee-4d67-9985-02511241e7d1"},{"line_number":975,"context_line":"              - f93450f2-ffff-4d67-9985-02511241e7d1"},{"line_number":976,"context_line":"      status: 404"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9a89bdaa_907974ff","line":976,"updated":"2016-09-05 12:05:56.000000000","message":"A important test is missing, this is when some exists and some not.","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":18414,"name":"Shengping Zhang","email":"zhangshengping@unitedstack.com","username":"PeterZhang"},"change_message_id":"8e3689a0e0112ff81075a0c85e3e2a36a8e9f6e8","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            id:"},{"line_number":974,"context_line":"              - f93450f2-eeee-4d67-9985-02511241e7d1"},{"line_number":975,"context_line":"              - f93450f2-ffff-4d67-9985-02511241e7d1"},{"line_number":976,"context_line":"      status: 404"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9a89bdaa_75fe7939","line":976,"in_reply_to":"9a89bdaa_907974ff","updated":"2016-09-06 10:36:39.000000000","message":"yes, It will delete all. If we use \u0027in\u0027 operator and some id exist (some are not exist). \n\nsince I use the list_resources method, it wont tell which resources are really existent. If we want to specific a certain id, we might need use \u0027\u003d\u0027, \u0027eq\u0027","commit_id":"3537daa449a2551e4ccbb201be89fdf6d2d72011"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"df99f6c1a0c08d7d4478650a293cb5fe0355d89f","unresolved":false,"context_lines":[{"line_number":994,"context_line":"              - f93450f2-aaaa-4d67-9985-02511241e7d1"},{"line_number":995,"context_line":"              - f93450f2-bbbb-4d67-9985-02511241e7d1"},{"line_number":996,"context_line":"      status: 200"},{"line_number":997,"context_line":"      response_strings:"},{"line_number":998,"context_line":"          \"{deleted: 2}\""},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":"    - name: delete both existent and non-existent data"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9a89bdaa_67efa6b0","line":997,"updated":"2016-09-06 13:06:28.000000000","message":"Please, use response_json instead of response_string.","commit_id":"a8f18ad6e6e7e916d2173ce97ab0dfe31136e0a6"}],"releasenotes/notes/delete-resources-f10d21fc02f53f16.yaml":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"8b377fabaa04f9e3ba48c41f44aed233e31ceee0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Gnocchi is only allow to delete resources one"},{"line_number":4,"context_line":"    by one in previous release. In this release,"},{"line_number":5,"context_line":"    an REST API is provided for delete a batch of"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a89bdaa_adc148e6","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"updated":"2016-09-13 09:01:40.000000000","message":"it\u0027s a new feature, not a fix","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ac547594ad73aff8fd97f69d6a5de79217d065ce","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Gnocchi is only allow to delete resources one"},{"line_number":4,"context_line":"    by one in previous release. In this release,"},{"line_number":5,"context_line":"    an REST API is provided for delete a batch of"},{"line_number":6,"context_line":"    resources."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a89bdaa_b47ef5e1","line":3,"range":{"start_line":3,"start_character":20,"end_line":3,"end_character":25},"updated":"2016-09-13 08:17:10.000000000","message":"allowed","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"},{"author":{"_account_id":2813,"name":"Mehdi Abaakouk","email":"sileht@sileht.net","username":"sileht"},"change_message_id":"ac547594ad73aff8fd97f69d6a5de79217d065ce","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Gnocchi is only allow to delete resources one"},{"line_number":4,"context_line":"    by one in previous release. In this release,"},{"line_number":5,"context_line":"    an REST API is provided for delete a batch of"},{"line_number":6,"context_line":"    resources."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a89bdaa_544be9b0","line":6,"range":{"start_line":5,"start_character":28,"end_line":6,"end_character":14},"updated":"2016-09-13 08:17:10.000000000","message":"to delete multiple resources at once.","commit_id":"132d13cc5d0e077eedd82475df6e06cb6656997a"}]}
