)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0ee0db0ee2bdf9a5ef16c5c1e5401abf3abe1077","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds image delete to server side for deleting"},{"line_number":10,"context_line":"pulled image in docker img or glance image."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I735783aa57925c7593c52a63d590fe93cf22d7c4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"df7087c5_cc9c1910","line":11,"updated":"2018-03-13 14:42:44.000000000","message":"It seems this patch is for implementing the BP: https://blueprints.launchpad.net/zun/+spec/support-image-delete , so we should have the following in the commit message:\n\n  Implements: blueprint support-image-delete\n\nSee here: https://docs.openstack.org/infra/manual/developers.html#committing-a-change","commit_id":"6f61ee76fee27f9714d2714d4374cc62a97e2dac"}],"zun/api/controllers/v1/images.py":[{"author":{"_account_id":23365,"name":"feng.shengqin","email":"feng.shengqin@zte.com.cn","username":"FengShengqin"},"change_message_id":"8031257615efead7200f112baa11606d963a9d03","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":69,"context_line":"    @exception.wrap_pecan_controller_exception"},{"line_number":70,"context_line":"    @validation.validate_query_param(pecan.request, schema.query_param_search)"},{"line_number":71,"context_line":"    def delete(self, image_id):"},{"line_number":72,"context_line":"        context \u003d pecan.request.context"},{"line_number":73,"context_line":"        image \u003d utils.get_image(image_id)"},{"line_number":74,"context_line":"        return pecan.request.compute_api.image_delete(context, image)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_d1958341","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":14},"updated":"2018-03-14 05:32:16.000000000","message":"would you add a policy rule for image_delete?","commit_id":"f8f277f32ba39d3805572ad13ef0db97cab2b5ac"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"c8e2d184f431ee28dad0278bf25ef841d1f8e8fe","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    @pecan.expose(\u0027json\u0027)"},{"line_number":69,"context_line":"    @exception.wrap_pecan_controller_exception"},{"line_number":70,"context_line":"    @validation.validate_query_param(pecan.request, schema.query_param_search)"},{"line_number":71,"context_line":"    def delete(self, image_id):"},{"line_number":72,"context_line":"        context \u003d pecan.request.context"},{"line_number":73,"context_line":"        image \u003d utils.get_image(image_id)"},{"line_number":74,"context_line":"        return pecan.request.compute_api.image_delete(context, image)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_671ab5cc","line":71,"range":{"start_line":71,"start_character":8,"end_line":71,"end_character":14},"in_reply_to":"df7087c5_d1958341","updated":"2018-03-14 06:48:07.000000000","message":"hi, feng, i dont clear about the policy rule for image delete, i mean why does it need policy rule for image_delete ?","commit_id":"f8f277f32ba39d3805572ad13ef0db97cab2b5ac"}],"zun/compute/manager.py":[{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"a8e2be0e317015e59ca058e6171e6010e3f5f92b","unresolved":false,"context_lines":[{"line_number":859,"context_line":"    def _do_image_delete(self, context, image):"},{"line_number":860,"context_line":"        LOG.debug(\u0027Deleting image...\u0027)"},{"line_number":861,"context_line":"        image.destroy(context, image.uuid)"},{"line_number":862,"context_line":"        if image.image_id:"},{"line_number":863,"context_line":"            try:"},{"line_number":864,"context_line":"                image_driver.delete_image(context, image.image_id,"},{"line_number":865,"context_line":"                                          glance.GlanceDriver())"},{"line_number":866,"context_line":"            except Exception as e:"},{"line_number":867,"context_line":"                image_driver.delete_image(context, image.image_id,"},{"line_number":868,"context_line":"                                          docker.DockerDriver())"},{"line_number":869,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_87b972ea","line":866,"range":{"start_line":862,"start_character":8,"end_line":866,"end_character":34},"updated":"2018-03-09 09:21:51.000000000","message":"@caishan,\nThanks for that patch.\nJust one question:\nWhy just delete image first from Glance and then try to delete it from docker?\n\nIf glance and docker both have this image, this method could not deal with it.\n\nI think maybe it\u0027t better to check the current image driver first, and then delete the image from current image driver.\nWhat do you think?","commit_id":"4235235a1c13c0a591697a2b7ea695a1d323fb2a"},{"author":{"_account_id":21428,"name":"JiWei","email":"17366060309@163.com","username":"WeiJi"},"change_message_id":"6c04026b9d8e2245cd71df80e323817eac18835b","unresolved":false,"context_lines":[{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def _do_image_delete(self, context, image):"},{"line_number":859,"context_line":"        LOG.debug(\u0027Deleting image...\u0027)"},{"line_number":860,"context_line":"        image.destroy(context, image.uuid)"},{"line_number":861,"context_line":"        image_driver.delete_image(context, image.image_id)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def image_pull(self, context, image):"},{"line_number":864,"context_line":"        utils.spawn_n(self._do_image_pull, context, image)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_c2b92f15","line":861,"range":{"start_line":860,"start_character":0,"end_line":861,"end_character":58},"updated":"2018-03-14 07:14:18.000000000","message":"It might be better：\nimage_driver.delete_image(context, image.image_id)\nimage.destroy(context, image.uuid)\n\nIf delete image fails, you can also find database records","commit_id":"f8f277f32ba39d3805572ad13ef0db97cab2b5ac"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"df75cededca705863264c360d85e15d0f2f977e1","unresolved":false,"context_lines":[{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def _do_image_delete(self, context, image):"},{"line_number":859,"context_line":"        LOG.debug(\u0027Deleting image...\u0027)"},{"line_number":860,"context_line":"        image.destroy(context, image.uuid)"},{"line_number":861,"context_line":"        image_driver.delete_image(context, image.image_id)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def image_pull(self, context, image):"},{"line_number":864,"context_line":"        utils.spawn_n(self._do_image_pull, context, image)"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_add04755","line":861,"range":{"start_line":860,"start_character":0,"end_line":861,"end_character":58},"in_reply_to":"df7087c5_c2b92f15","updated":"2018-03-19 01:53:17.000000000","message":"yes, thanks, this is better.","commit_id":"f8f277f32ba39d3805572ad13ef0db97cab2b5ac"}],"zun/db/api.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"92b50fa90c834882b30a8400b71b34ab63b19917","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@profiler.trace(\"db\")"},{"line_number":279,"context_line":"def destroy_image(context, image_uuid):"},{"line_number":280,"context_line":"    \"\"\"Destroy a image\"\"\""},{"line_number":281,"context_line":"    return _get_dbdriver_instance().destroy_image(context, image_uuid)"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"@profiler.trace(\"db\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_9ffaf272","line":281,"range":{"start_line":281,"start_character":11,"end_line":281,"end_character":33},"updated":"2018-03-12 10:07:07.000000000","message":"Etcd doesn\u0027t have destroy_image method. It may be failed. Please add method in etcd db as well :)","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"04ca218b76a41d212b9fb98c59d2077caa3ec915","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@profiler.trace(\"db\")"},{"line_number":279,"context_line":"def destroy_image(context, image_uuid):"},{"line_number":280,"context_line":"    \"\"\"Destroy a image\"\"\""},{"line_number":281,"context_line":"    return _get_dbdriver_instance().destroy_image(context, image_uuid)"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"@profiler.trace(\"db\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_31965241","line":281,"range":{"start_line":281,"start_character":11,"end_line":281,"end_character":33},"updated":"2018-03-13 14:02:17.000000000","message":"oh , thanks, you are right","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"3222bccd123877c0f88132f1ff62fe390d6de902","unresolved":false,"context_lines":[{"line_number":278,"context_line":"@profiler.trace(\"db\")"},{"line_number":279,"context_line":"def destroy_image(context, image_uuid):"},{"line_number":280,"context_line":"    \"\"\"Destroy a image\"\"\""},{"line_number":281,"context_line":"    return _get_dbdriver_instance().destroy_image(context, image_uuid)"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"@profiler.trace(\"db\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_754043a6","line":281,"range":{"start_line":281,"start_character":11,"end_line":281,"end_character":33},"in_reply_to":"df7087c5_9ffaf272","updated":"2018-03-13 07:27:47.000000000","message":"Could you please more clear about this ? thanks","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"}],"zun/image/docker/driver.py":[{"author":{"_account_id":23829,"name":"weikeyou","email":"wei.keyou@zte.com.cn","username":"weikeyou"},"change_message_id":"362e01e39c0db908043f06e10c57592bc4b2548f","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def delete_image(self, context, img_id):"},{"line_number":37,"context_line":"        with docker_utils.docker_client() as docker:"},{"line_number":38,"context_line":"            try:"},{"line_number":39,"context_line":"                docker.remove_image(img_id)"},{"line_number":40,"context_line":"            except errors.APIError as api_error:"},{"line_number":41,"context_line":"                raise exception.ZunException(str(api_error))"},{"line_number":42,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_807de1b2","line":39,"range":{"start_line":39,"start_character":16,"end_line":39,"end_character":43},"updated":"2018-03-09 02:40:33.000000000","message":"if can\u0027t find  the image in docker，we shouldn\u0027t raise it.","commit_id":"af85110ed87486279999404fa69e3c9e3b5838a8"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"92b50fa90c834882b30a8400b71b34ab63b19917","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            except errors.APIError as api_error:"},{"line_number":41,"context_line":"                raise exception.ZunException(str(api_error))"},{"line_number":42,"context_line":"            except Exception as e:"},{"line_number":43,"context_line":"                msg \u003d _(\u0027Cannot delete image in docker\u0027)"},{"line_number":44,"context_line":"                raise exception.ZunException(msg.format(e))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _search_image_on_host(self, repo, tag):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_5f2f7aa0","line":43,"range":{"start_line":43,"start_character":25,"end_line":43,"end_character":54},"updated":"2018-03-12 10:07:07.000000000","message":"We should contain image_id in the message.","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"3222bccd123877c0f88132f1ff62fe390d6de902","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            except errors.APIError as api_error:"},{"line_number":41,"context_line":"                raise exception.ZunException(str(api_error))"},{"line_number":42,"context_line":"            except Exception as e:"},{"line_number":43,"context_line":"                msg \u003d _(\u0027Cannot delete image in docker\u0027)"},{"line_number":44,"context_line":"                raise exception.ZunException(msg.format(e))"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _search_image_on_host(self, repo, tag):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_525e7512","line":43,"range":{"start_line":43,"start_character":25,"end_line":43,"end_character":54},"in_reply_to":"df7087c5_5f2f7aa0","updated":"2018-03-13 07:27:47.000000000","message":"that is good.","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":23365,"name":"feng.shengqin","email":"feng.shengqin@zte.com.cn","username":"FengShengqin"},"change_message_id":"8031257615efead7200f112baa11606d963a9d03","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        with docker_utils.docker_client() as docker:"},{"line_number":39,"context_line":"            try:"},{"line_number":40,"context_line":"                docker.remove_image(img_id)"},{"line_number":41,"context_line":"            except errors.APIError as api_error:"},{"line_number":42,"context_line":"                raise exception.ZunException(str(api_error))"},{"line_number":43,"context_line":"            except Exception as e:"},{"line_number":44,"context_line":"                LOG.exception(\u0027Unknown exception occurred while deleting \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_f16a0718","line":41,"range":{"start_line":41,"start_character":19,"end_line":41,"end_character":34},"updated":"2018-03-14 05:32:16.000000000","message":"If the image is not exist, we may catch 404 in the APIError and needn\u0027t raise excception.","commit_id":"f8f277f32ba39d3805572ad13ef0db97cab2b5ac"}],"zun/image/driver.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"92b50fa90c834882b30a8400b71b34ab63b19917","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    try:"},{"line_number":140,"context_line":"        image_driver.delete_image(context, img_id)"},{"line_number":141,"context_line":"    except Exception as e:"},{"line_number":142,"context_line":"        LOG.exception(\u0027Unknown exception occurred while deleting image %s: %s\u0027,"},{"line_number":143,"context_line":"                      img_id,"},{"line_number":144,"context_line":"                      six.text_type(e))"},{"line_number":145,"context_line":"        raise exception.ZunException(six.text_type(e))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"class ContainerImageDriver(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_3fe166d1","side":"PARENT","line":145,"range":{"start_line":142,"start_character":8,"end_line":145,"end_character":54},"updated":"2018-03-12 10:07:07.000000000","message":"We should keep these lines.","commit_id":"79a344489b2d9e8c5af55383d4ed54e94fbba50f"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"c2d63fe20dcec440f4af34235436a47abb3cb4ae","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    try:"},{"line_number":140,"context_line":"        image_driver.delete_image(context, img_id)"},{"line_number":141,"context_line":"    except Exception as e:"},{"line_number":142,"context_line":"        LOG.exception(\u0027Unknown exception occurred while deleting image %s: %s\u0027,"},{"line_number":143,"context_line":"                      img_id,"},{"line_number":144,"context_line":"                      six.text_type(e))"},{"line_number":145,"context_line":"        raise exception.ZunException(six.text_type(e))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"class ContainerImageDriver(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_9e59798f","side":"PARENT","line":145,"range":{"start_line":142,"start_character":8,"end_line":145,"end_character":54},"in_reply_to":"df7087c5_3fe166d1","updated":"2018-03-13 06:42:49.000000000","message":"you mean we should keep raise this exception ?","commit_id":"79a344489b2d9e8c5af55383d4ed54e94fbba50f"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"348445f66ee918f36677e4d0711bbe618094753f","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    try:"},{"line_number":140,"context_line":"        image_driver.delete_image(context, img_id)"},{"line_number":141,"context_line":"    except Exception as e:"},{"line_number":142,"context_line":"        LOG.exception(\u0027Unknown exception occurred while deleting image %s: %s\u0027,"},{"line_number":143,"context_line":"                      img_id,"},{"line_number":144,"context_line":"                      six.text_type(e))"},{"line_number":145,"context_line":"        raise exception.ZunException(six.text_type(e))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"class ContainerImageDriver(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_95a15797","side":"PARENT","line":145,"range":{"start_line":142,"start_character":8,"end_line":145,"end_character":54},"in_reply_to":"df7087c5_9e59798f","updated":"2018-03-13 07:25:44.000000000","message":"Yes, it will provide more details.","commit_id":"79a344489b2d9e8c5af55383d4ed54e94fbba50f"},{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"92b50fa90c834882b30a8400b71b34ab63b19917","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def delete_image(context, img_id, image_driver):"},{"line_number":139,"context_line":"    image_driver_list \u003d CONF.image_driver_list"},{"line_number":140,"context_line":"    if image_driver_list is None:"},{"line_number":141,"context_line":"        image_driver_list \u003d [\u0027docker\u0027, \u0027glance\u0027]"},{"line_number":142,"context_line":"    for driver in image_driver_list:"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            image_driver \u003d load_image_driver(driver)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_bf79f62f","line":141,"range":{"start_line":140,"start_character":4,"end_line":141,"end_character":48},"updated":"2018-03-12 10:07:07.000000000","message":"I think we can remove this check.","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"c2d63fe20dcec440f4af34235436a47abb3cb4ae","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def delete_image(context, img_id, image_driver):"},{"line_number":139,"context_line":"    image_driver_list \u003d CONF.image_driver_list"},{"line_number":140,"context_line":"    if image_driver_list is None:"},{"line_number":141,"context_line":"        image_driver_list \u003d [\u0027docker\u0027, \u0027glance\u0027]"},{"line_number":142,"context_line":"    for driver in image_driver_list:"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            image_driver \u003d load_image_driver(driver)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_3e1cedbf","line":141,"range":{"start_line":140,"start_character":4,"end_line":141,"end_character":48},"in_reply_to":"df7087c5_bf79f62f","updated":"2018-03-13 06:42:49.000000000","message":"yes, you right, conf/image_driver.py have already defined it.","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"}],"zun/objects/image.py":[{"author":{"_account_id":22406,"name":"Kien Nguyen","email":"kiennt2609@gmail.com","username":"kiennt"},"change_message_id":"92b50fa90c834882b30a8400b71b34ab63b19917","unresolved":false,"context_lines":[{"line_number":19,"context_line":"@base.ZunObjectRegistry.register"},{"line_number":20,"context_line":"class Image(base.ZunPersistentObject, base.ZunObject):"},{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # VERSION \u003d \u00271.1\u0027: Add delete image"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_3fc08650","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":21},"updated":"2018-03-12 10:07:07.000000000","message":"Should be Version 1.1 for consistency.","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"},{"author":{"_account_id":27577,"name":"caishan","email":"caishan1993@foxmail.com","username":"caishan"},"change_message_id":"c2d63fe20dcec440f4af34235436a47abb3cb4ae","unresolved":false,"context_lines":[{"line_number":19,"context_line":"@base.ZunObjectRegistry.register"},{"line_number":20,"context_line":"class Image(base.ZunPersistentObject, base.ZunObject):"},{"line_number":21,"context_line":"    # Version 1.0: Initial version"},{"line_number":22,"context_line":"    # VERSION \u003d \u00271.1\u0027: Add delete image"},{"line_number":23,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    fields \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"df7087c5_3edf0dd7","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":21},"in_reply_to":"df7087c5_3fc08650","updated":"2018-03-13 06:42:49.000000000","message":"yes, i see that","commit_id":"137a3b488d9f862ca0f854ab413351f790ef1b42"}]}
