)]}'
{"etc/providers.d/openstack-infra2.conf":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"b11733408a0536ecb7c3731d163e2ecf1bc4389e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[provider]"},{"line_number":2,"context_line":"name \u003d OS Infra Provider with volume snapshot plugin"},{"line_number":3,"context_line":"description \u003d This provider uses OpenStack\u0027s own services (swift, cinder) as storage"},{"line_number":4,"context_line":"id \u003d 90d5bfea-a259-41e6-80c6-dcfcfcd9d827"}],"source_content_type":"text/plain","patch_set":11,"id":"7f231b9d_bf7349b1","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":10},"updated":"2017-06-14 07:14:41.000000000","message":"mind giving this file a different name than \u0027openstack-infra2.conf\u0027?","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"}],"karbor/services/protection/protection_plugins/volume/volume_snapshot_plugin.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9a9a669273e6dfc131ab9895b2aafba9e79f3ea2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from karbor.services.protection.protection_plugins.volume \\"},{"line_number":21,"context_line":"    import volume_snapshot_plugin_schemas as volume_schemas"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from cinderclient import exceptions as cinder_exc"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_service import loopingcall"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ff0f0b1f_3909d9dc","line":26,"range":{"start_line":23,"start_character":0,"end_line":26,"end_character":36},"updated":"2017-05-27 08:05:16.000000000","message":"It is better to move these thirdparty libraries up, like six on line 14","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b065694b55e5fcfb99c6c09d93ff1700c6c2539a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from karbor.services.protection.protection_plugins.volume \\"},{"line_number":21,"context_line":"    import volume_snapshot_plugin_schemas as volume_schemas"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from cinderclient import exceptions as cinder_exc"},{"line_number":24,"context_line":"from oslo_config import cfg"},{"line_number":25,"context_line":"from oslo_log import log as logging"},{"line_number":26,"context_line":"from oslo_service import loopingcall"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_261863d1","line":26,"range":{"start_line":23,"start_character":0,"end_line":26,"end_character":36},"in_reply_to":"ff0f0b1f_3909d9dc","updated":"2017-06-01 03:03:40.000000000","message":"Done","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9a9a669273e6dfc131ab9895b2aafba9e79f3ea2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def status_poll(get_status_func, interval, success_statuses\u003dset(),"},{"line_number":39,"context_line":"                failure_statuses\u003dset(), ignore_statuses\u003dset(),"},{"line_number":40,"context_line":"                ignore_unexpected\u003dFalse):"},{"line_number":41,"context_line":"    def _poll():"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff0f0b1f_d972dd7c","line":38,"range":{"start_line":38,"start_character":4,"end_line":38,"end_character":15},"updated":"2017-05-27 08:05:16.000000000","message":"use utils.py/status_poll instead.\nhttps://github.com/openstack/karbor/blob/master/karbor/services/protection/protection_plugins/utils.py#L16","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b065694b55e5fcfb99c6c09d93ff1700c6c2539a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def status_poll(get_status_func, interval, success_statuses\u003dset(),"},{"line_number":39,"context_line":"                failure_statuses\u003dset(), ignore_statuses\u003dset(),"},{"line_number":40,"context_line":"                ignore_unexpected\u003dFalse):"},{"line_number":41,"context_line":"    def _poll():"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_060f9f89","line":38,"range":{"start_line":38,"start_character":4,"end_line":38,"end_character":15},"in_reply_to":"ff0f0b1f_d972dd7c","updated":"2017-06-01 03:03:40.000000000","message":"Your patch has been merged. I will update it.","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9a9a669273e6dfc131ab9895b2aafba9e79f3ea2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        LOG.info(\u0027Creating volume snapshot, volume_id: %s\u0027, volume_id)"},{"line_number":121,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":122,"context_line":"                                   constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":123,"context_line":"        volume_info \u003d cinder_client.volumes.get(volume_id)"},{"line_number":124,"context_line":"        if volume_info.status !\u003d \"available\":"},{"line_number":125,"context_line":"            is_success \u003d status_poll("},{"line_number":126,"context_line":"                partial(get_volume_status, cinder_client, volume_id),"},{"line_number":127,"context_line":"                interval\u003dself._interval,"},{"line_number":128,"context_line":"                success_statuses\u003d{\u0027available\u0027, \u0027in-use\u0027, \u0027error_extending\u0027,"},{"line_number":129,"context_line":"                                  \u0027error_restoring\u0027},"},{"line_number":130,"context_line":"                failure_statuses\u003d{\u0027error\u0027, \u0027error_deleting\u0027, \u0027deleting\u0027,"},{"line_number":131,"context_line":"                                  \u0027not-found\u0027},"},{"line_number":132,"context_line":"                ignore_statuses\u003d{\u0027attaching\u0027, \u0027creating\u0027, \u0027backing-up\u0027,"},{"line_number":133,"context_line":"                                 \u0027restoring-backup\u0027},"},{"line_number":134,"context_line":"            )"},{"line_number":135,"context_line":"            if not is_success:"},{"line_number":136,"context_line":"                bank_section.update_object(\u0027status\u0027,"},{"line_number":137,"context_line":"                                           constants.RESOURCE_STATUS_ERROR)"},{"line_number":138,"context_line":"                raise exception.CreateBackupFailed("},{"line_number":139,"context_line":"                    reason\u003d\u0027Volume is in a error status.\u0027,"},{"line_number":140,"context_line":"                    resource_id\u003dvolume_id,"},{"line_number":141,"context_line":"                    resource_type\u003dconstants.VOLUME_RESOURCE_TYPE,"},{"line_number":142,"context_line":"                )"},{"line_number":143,"context_line":"        resource_metadata \u003d {"},{"line_number":144,"context_line":"            \u0027volume_id\u0027: volume_id,"},{"line_number":145,"context_line":"            \u0027size\u0027: volume_info.size"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff0f0b1f_d9e53d0c","line":142,"range":{"start_line":123,"start_character":0,"end_line":142,"end_character":17},"updated":"2017-05-27 08:05:16.000000000","message":"not quite understand why did loop check for volume\u0027s status. If its status is not \u0027available\u0027 checked on line 124, it is better to raise exception.","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"197764457f9f80829b978e0204f8192e86f31848","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        LOG.info(\u0027Creating volume snapshot, volume_id: %s\u0027, volume_id)"},{"line_number":121,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":122,"context_line":"                                   constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":123,"context_line":"        volume_info \u003d cinder_client.volumes.get(volume_id)"},{"line_number":124,"context_line":"        if volume_info.status !\u003d \"available\":"},{"line_number":125,"context_line":"            is_success \u003d status_poll("},{"line_number":126,"context_line":"                partial(get_volume_status, cinder_client, volume_id),"},{"line_number":127,"context_line":"                interval\u003dself._interval,"},{"line_number":128,"context_line":"                success_statuses\u003d{\u0027available\u0027, \u0027in-use\u0027, \u0027error_extending\u0027,"},{"line_number":129,"context_line":"                                  \u0027error_restoring\u0027},"},{"line_number":130,"context_line":"                failure_statuses\u003d{\u0027error\u0027, \u0027error_deleting\u0027, \u0027deleting\u0027,"},{"line_number":131,"context_line":"                                  \u0027not-found\u0027},"},{"line_number":132,"context_line":"                ignore_statuses\u003d{\u0027attaching\u0027, \u0027creating\u0027, \u0027backing-up\u0027,"},{"line_number":133,"context_line":"                                 \u0027restoring-backup\u0027},"},{"line_number":134,"context_line":"            )"},{"line_number":135,"context_line":"            if not is_success:"},{"line_number":136,"context_line":"                bank_section.update_object(\u0027status\u0027,"},{"line_number":137,"context_line":"                                           constants.RESOURCE_STATUS_ERROR)"},{"line_number":138,"context_line":"                raise exception.CreateBackupFailed("},{"line_number":139,"context_line":"                    reason\u003d\u0027Volume is in a error status.\u0027,"},{"line_number":140,"context_line":"                    resource_id\u003dvolume_id,"},{"line_number":141,"context_line":"                    resource_type\u003dconstants.VOLUME_RESOURCE_TYPE,"},{"line_number":142,"context_line":"                )"},{"line_number":143,"context_line":"        resource_metadata \u003d {"},{"line_number":144,"context_line":"            \u0027volume_id\u0027: volume_id,"},{"line_number":145,"context_line":"            \u0027size\u0027: volume_info.size"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_abcb1470","line":142,"range":{"start_line":123,"start_character":0,"end_line":142,"end_character":17},"in_reply_to":"df140735_6672db13","updated":"2017-06-01 08:38:45.000000000","message":"These is also a loop check about volume in cinder protect plugin.https://github.com/openstack/karbor/blob/master/karbor/services/protection/protection_plugins/volume/cinder_protection_plugin.py#L180","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b065694b55e5fcfb99c6c09d93ff1700c6c2539a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        LOG.info(\u0027Creating volume snapshot, volume_id: %s\u0027, volume_id)"},{"line_number":121,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":122,"context_line":"                                   constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":123,"context_line":"        volume_info \u003d cinder_client.volumes.get(volume_id)"},{"line_number":124,"context_line":"        if volume_info.status !\u003d \"available\":"},{"line_number":125,"context_line":"            is_success \u003d status_poll("},{"line_number":126,"context_line":"                partial(get_volume_status, cinder_client, volume_id),"},{"line_number":127,"context_line":"                interval\u003dself._interval,"},{"line_number":128,"context_line":"                success_statuses\u003d{\u0027available\u0027, \u0027in-use\u0027, \u0027error_extending\u0027,"},{"line_number":129,"context_line":"                                  \u0027error_restoring\u0027},"},{"line_number":130,"context_line":"                failure_statuses\u003d{\u0027error\u0027, \u0027error_deleting\u0027, \u0027deleting\u0027,"},{"line_number":131,"context_line":"                                  \u0027not-found\u0027},"},{"line_number":132,"context_line":"                ignore_statuses\u003d{\u0027attaching\u0027, \u0027creating\u0027, \u0027backing-up\u0027,"},{"line_number":133,"context_line":"                                 \u0027restoring-backup\u0027},"},{"line_number":134,"context_line":"            )"},{"line_number":135,"context_line":"            if not is_success:"},{"line_number":136,"context_line":"                bank_section.update_object(\u0027status\u0027,"},{"line_number":137,"context_line":"                                           constants.RESOURCE_STATUS_ERROR)"},{"line_number":138,"context_line":"                raise exception.CreateBackupFailed("},{"line_number":139,"context_line":"                    reason\u003d\u0027Volume is in a error status.\u0027,"},{"line_number":140,"context_line":"                    resource_id\u003dvolume_id,"},{"line_number":141,"context_line":"                    resource_type\u003dconstants.VOLUME_RESOURCE_TYPE,"},{"line_number":142,"context_line":"                )"},{"line_number":143,"context_line":"        resource_metadata \u003d {"},{"line_number":144,"context_line":"            \u0027volume_id\u0027: volume_id,"},{"line_number":145,"context_line":"            \u0027size\u0027: volume_info.size"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_6672db13","line":142,"range":{"start_line":123,"start_character":0,"end_line":142,"end_character":17},"in_reply_to":"ff0f0b1f_d9e53d0c","updated":"2017-06-01 03:03:40.000000000","message":"You can see these status \u0027attaching\u0027, \u0027creating\u0027, \u0027backing-up\u0027, \u0027restoring-backup. Not only status \"available\" volume can be protected here. If the volume is being attaching or creating, in a middle status, this loop will waiting for these action finished. The status will changed to a success status, so the volume can be protected then.","commit_id":"93421101e5412d798323662d07ef5500c9bd1968"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"b11733408a0536ecb7c3731d163e2ecf1bc4389e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        LOG.info(\u0027Creating volume snapshot, volume_id: %s\u0027, volume_id)"},{"line_number":113,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":114,"context_line":"                                   constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":115,"context_line":"        volume_info \u003d cinder_client.volumes.get(volume_id)"},{"line_number":116,"context_line":"        if volume_info.status !\u003d \"available\":"},{"line_number":117,"context_line":"            is_success \u003d utils.status_poll("},{"line_number":118,"context_line":"                partial(get_volume_status, cinder_client, volume_id),"},{"line_number":119,"context_line":"                interval\u003dself._interval,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_847280e2","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":45},"updated":"2017-06-14 07:14:41.000000000","message":"necessary? just do the status poll below","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"886d19fbd3b82399c2079aa26181d201ac7c9d1c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        LOG.info(\u0027Creating volume snapshot, volume_id: %s\u0027, volume_id)"},{"line_number":113,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":114,"context_line":"                                   constants.RESOURCE_STATUS_PROTECTING)"},{"line_number":115,"context_line":"        volume_info \u003d cinder_client.volumes.get(volume_id)"},{"line_number":116,"context_line":"        if volume_info.status !\u003d \"available\":"},{"line_number":117,"context_line":"            is_success \u003d utils.status_poll("},{"line_number":118,"context_line":"                partial(get_volume_status, cinder_client, volume_id),"},{"line_number":119,"context_line":"                interval\u003dself._interval,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_fcc78411","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":45},"in_reply_to":"7f231b9d_847280e2","updated":"2017-06-14 13:17:19.000000000","message":"Done","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"b11733408a0536ecb7c3731d163e2ecf1bc4389e","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            )"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        resource_metadata[\u0027snapshot_id\u0027] \u003d snapshot_id"},{"line_number":157,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":158,"context_line":"                                   constants.RESOURCE_STATUS_AVAILABLE)"},{"line_number":159,"context_line":"        bank_section.update_object(\u0027metadata\u0027, resource_metadata)"},{"line_number":160,"context_line":"        LOG.info(\u0027Snapshot volume (volume_id: %(volume_id)s snapshot_id: \u0027"},{"line_number":161,"context_line":"                 \u0027%(snapshot_id)s ) successfully\u0027,"},{"line_number":162,"context_line":"                 {\u0027volume_id\u0027: volume_id, \u0027snapshot_id\u0027: snapshot_id})"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_44a7c850","line":159,"range":{"start_line":157,"start_character":0,"end_line":159,"end_character":65},"updated":"2017-06-14 07:14:41.000000000","message":"Swap the order of these two.","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"886d19fbd3b82399c2079aa26181d201ac7c9d1c","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            )"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        resource_metadata[\u0027snapshot_id\u0027] \u003d snapshot_id"},{"line_number":157,"context_line":"        bank_section.update_object(\u0027status\u0027,"},{"line_number":158,"context_line":"                                   constants.RESOURCE_STATUS_AVAILABLE)"},{"line_number":159,"context_line":"        bank_section.update_object(\u0027metadata\u0027, resource_metadata)"},{"line_number":160,"context_line":"        LOG.info(\u0027Snapshot volume (volume_id: %(volume_id)s snapshot_id: \u0027"},{"line_number":161,"context_line":"                 \u0027%(snapshot_id)s ) successfully\u0027,"},{"line_number":162,"context_line":"                 {\u0027volume_id\u0027: volume_id, \u0027snapshot_id\u0027: snapshot_id})"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_dcca8818","line":159,"range":{"start_line":157,"start_character":0,"end_line":159,"end_character":65},"in_reply_to":"7f231b9d_44a7c850","updated":"2017-06-14 13:17:19.000000000","message":"Done","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"b11733408a0536ecb7c3731d163e2ecf1bc4389e","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                          volume.status)"},{"line_number":200,"context_line":"                restore.update_resource_status("},{"line_number":201,"context_line":"                    constants.VOLUME_RESOURCE_TYPE,"},{"line_number":202,"context_line":"                    volume.id, volume.status, \"Invalid status.\")"},{"line_number":203,"context_line":"                restore.save()"},{"line_number":204,"context_line":"                raise exception.RestoreResourceFailed("},{"line_number":205,"context_line":"                    name\u003d\"Volume Snapshot\","}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_1f4ebd6e","line":202,"range":{"start_line":202,"start_character":47,"end_line":202,"end_character":62},"updated":"2017-06-14 07:14:41.000000000","message":"can you add the status to the error description?\nalso, no need for . in the end of log messages","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"886d19fbd3b82399c2079aa26181d201ac7c9d1c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                          volume.status)"},{"line_number":200,"context_line":"                restore.update_resource_status("},{"line_number":201,"context_line":"                    constants.VOLUME_RESOURCE_TYPE,"},{"line_number":202,"context_line":"                    volume.id, volume.status, \"Invalid status.\")"},{"line_number":203,"context_line":"                restore.save()"},{"line_number":204,"context_line":"                raise exception.RestoreResourceFailed("},{"line_number":205,"context_line":"                    name\u003d\"Volume Snapshot\","}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_bcea2c72","line":202,"range":{"start_line":202,"start_character":47,"end_line":202,"end_character":62},"in_reply_to":"7f231b9d_1f4ebd6e","updated":"2017-06-14 13:17:19.000000000","message":"Done","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"b11733408a0536ecb7c3731d163e2ecf1bc4389e","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                           volume.id, volume.status)"},{"line_number":210,"context_line":"            restore.save()"},{"line_number":211,"context_line":"        except Exception as e:"},{"line_number":212,"context_line":"            LOG.error(\"Restore volume from snapshot failed, volume_id: %s.\","},{"line_number":213,"context_line":"                      original_volume_id)"},{"line_number":214,"context_line":"            raise exception.RestoreResourceFailed("},{"line_number":215,"context_line":"                name\u003d\"Volume Snapshot\","}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_df572502","line":212,"range":{"start_line":212,"start_character":73,"end_line":212,"end_character":74},"updated":"2017-06-14 07:14:41.000000000","message":"no need for . in the end of log messages, in all of the file","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"886d19fbd3b82399c2079aa26181d201ac7c9d1c","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                           volume.id, volume.status)"},{"line_number":210,"context_line":"            restore.save()"},{"line_number":211,"context_line":"        except Exception as e:"},{"line_number":212,"context_line":"            LOG.error(\"Restore volume from snapshot failed, volume_id: %s.\","},{"line_number":213,"context_line":"                      original_volume_id)"},{"line_number":214,"context_line":"            raise exception.RestoreResourceFailed("},{"line_number":215,"context_line":"                name\u003d\"Volume Snapshot\","}],"source_content_type":"text/x-python","patch_set":11,"id":"7f231b9d_9ced308d","line":212,"range":{"start_line":212,"start_character":73,"end_line":212,"end_character":74},"in_reply_to":"7f231b9d_df572502","updated":"2017-06-14 13:17:19.000000000","message":"Done","commit_id":"1903c5881bf2dce7640a18aa0d93c024e0749303"}]}
