)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ce1ca3206e12d657258af6f47cde7f404bba30ab","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2019-11-01 10:28:36 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a backend driver of Pengyun Zettastor iSCSI storge."},{"line_number":8,"context_line":"Add opts.py"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"Change-Id: I94eb9f44c69e0cf86289c5616fb7ba9c0ac11959"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_2326c8cc","line":8,"updated":"2019-11-01 19:53:07.000000000","message":"Need blank line after the summary line so they don\u0027t get concatenated. Though I think this can be removed as it\u0027s not a very useful description of the changeset.","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2019-11-04 17:39:10 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a backend driver of Pengyun Zettastor iSCSI storge."},{"line_number":8,"context_line":"Add opts.py"},{"line_number":9,"context_line":"Modify codes as suggestion."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I94eb9f44c69e0cf86289c5616fb7ba9c0ac11959"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3fa7e38b_9cc104e7","line":9,"range":{"start_line":8,"start_character":0,"end_line":9,"end_character":27},"updated":"2019-11-05 02:30:56.000000000","message":"As mentioned previously, remove this. Add a blank line and add a more detailed description of what this change will do, not a play by play of each update of the patchset.","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"5399c0c2c631106c15993e47f15206f58f19c3c2","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2019-11-05 10:41:22 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a backend driver of Pengyun Zettastor iSCSI storge."},{"line_number":8,"context_line":"Add opts.py"},{"line_number":9,"context_line":"Modify codes as suggestion."},{"line_number":10,"context_line":"Fix doc issue and remove commented codes."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I94eb9f44c69e0cf86289c5616fb7ba9c0ac11959"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3fa7e38b_4f08b025","line":10,"range":{"start_line":8,"start_character":0,"end_line":10,"end_character":41},"updated":"2019-11-05 02:44:21.000000000","message":"Please pay attention to previous patchset comments.","commit_id":"06131e7c92b5461c18f0e242b85e972bcbba419b"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"75504821097cddfad48ee76502c8f9ffabb7dcb4","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add a backend driver of Pengyun Zettastor iSCSI storge."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add opts.py, modify codes as code review suggestion, fix doc issue"},{"line_number":10,"context_line":"and remove commented codes, remove unuseful log info and modify"},{"line_number":11,"context_line":"blank line. Modify variable name according to openstack style."},{"line_number":12,"context_line":"Modify pycharm note for dict and list. Fix create_cloned_volume"},{"line_number":13,"context_line":"return value issue."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I94eb9f44c69e0cf86289c5616fb7ba9c0ac11959"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3fa7e38b_fd725612","line":13,"range":{"start_line":9,"start_character":0,"end_line":13,"end_character":18},"updated":"2019-11-07 03:46:06.000000000","message":"Seriously, stop doing this.","commit_id":"0ab4d5a066700bf8ab9a0f7680c5036687563187"}],"cinder/tests/unit/volume/drivers/pengyun/test_pengyun_driver.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import ddt"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import mock"},{"line_number":19,"context_line":"from os_brick.initiator import connector"},{"line_number":20,"context_line":"import random"},{"line_number":21,"context_line":"import uuid"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_3cb49081","line":19,"updated":"2019-11-05 02:30:56.000000000","message":"Imports should be in three groups of standard libs, a blank line, third party libs, a blank line, then the local cinder imports.","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"}],"cinder/volume/drivers/pengyun/pengyun_driver.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"zettastor_opts \u003d ["},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027san_ip\u0027,"},{"line_number":41,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":42,"context_line":"               help\u003d\u0027IP address of SAN controller\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027san_login\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027admin\u0027,"},{"line_number":45,"context_line":"               help\u003d\u0027Username for SAN controller\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027san_password\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":48,"context_line":"               help\u003d\u0027Password for SAN controller\u0027,"},{"line_number":49,"context_line":"               secret\u003dTrue),"},{"line_number":50,"context_line":"]"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_df454a70","line":49,"range":{"start_line":40,"start_character":5,"end_line":49,"end_character":28},"updated":"2019-11-01 16:47:11.000000000","message":"Can we re-use existing options instead of introducing new?","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":53,"context_line":"CONF.register_opts(zettastor_opts, group\u003dconfiguration.SHARED_CONF_GROUP)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _retries(delay\u003d1, retries\u003d4):"},{"line_number":57,"context_line":"    def retry_decorator(f):"},{"line_number":58,"context_line":"        @wraps(f)"},{"line_number":59,"context_line":"        def f_retry(*args, **kwargs):"},{"line_number":60,"context_line":"            opt_dict \u003d {\u0027retries\u0027: retries, \u0027delay\u0027: delay}"},{"line_number":61,"context_line":"            while opt_dict[\u0027retries\u0027] \u003e 1:"},{"line_number":62,"context_line":"                try:"},{"line_number":63,"context_line":"                    return f(*args, **kwargs)"},{"line_number":64,"context_line":"                except exception.VolumeDriverException as e:"},{"line_number":65,"context_line":"                    LOG.debug(\u0027Retrying in %(delay)s seconds...\u0027,"},{"line_number":66,"context_line":"                              {\u0027delay\u0027: delay})"},{"line_number":67,"context_line":"                    time.sleep(opt_dict[\u0027delay\u0027])"},{"line_number":68,"context_line":"                    opt_dict[\u0027retries\u0027] -\u003d 1"},{"line_number":69,"context_line":"            return f(*args, **kwargs)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        return f_retry"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    return retry_decorator"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"@interface.volumedriver"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_9f2032b2","line":73,"range":{"start_line":56,"start_character":4,"end_line":73,"end_character":26},"updated":"2019-11-01 16:47:11.000000000","message":"We have already such decorator [1].\n\n\n[1]https://opendev.org/openstack/cinder/src/branch/master/cinder/utils.py#L658","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    # ThirdPartySystems wiki page"},{"line_number":90,"context_line":"    CI_WIKI_NAME \u003d \u0027Pengyun_Cinder_CI\u0027"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":93,"context_line":"        \"\"\"Init PENGYUNISCSIDriver class.\"\"\""},{"line_number":94,"context_line":"        super(PengyunISCSIDriver, self).__init__(*args, **kwargs)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    @staticmethod"},{"line_number":97,"context_line":"    def get_driver_options():"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_3f2b3e95","line":94,"range":{"start_line":92,"start_character":0,"end_line":94,"end_character":65},"updated":"2019-11-01 16:47:11.000000000","message":"Please, remove empty __init__","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    image_meta, image_service):"},{"line_number":121,"context_line":"        \"\"\"Clone image.\"\"\""},{"line_number":122,"context_line":"        start_time \u003d time.time()"},{"line_number":123,"context_line":"        LOG.debug(\u0027in clone_image\u0027)"},{"line_number":124,"context_line":"        LOG.debug(\u0027Clone image location: %(image_location)s, \u0027"},{"line_number":125,"context_line":"                  \u0027meta: %(image_meta)s.\u0027,"},{"line_number":126,"context_line":"                  {\u0027image_location\u0027: image_location,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_fafff4fd","line":123,"updated":"2019-11-01 16:47:11.000000000","message":"Please, start log message with an upper-case letter here and below","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            model_update \u003d self.create_cloned_volume(volume, srcVolume)"},{"line_number":133,"context_line":"            result_size \u003d model_update[\u0027size\u0027]"},{"line_number":134,"context_line":"        except Exception as err:"},{"line_number":135,"context_line":"            msg \u003d (\u0027Create volume error. \u0027)"},{"line_number":136,"context_line":"            LOG.debug(msg)"},{"line_number":137,"context_line":"            return ({}, False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_5a140841","line":134,"updated":"2019-11-01 16:47:11.000000000","message":"Can we handle less specific exception here?","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            result_size \u003d model_update[\u0027size\u0027]"},{"line_number":134,"context_line":"        except Exception as err:"},{"line_number":135,"context_line":"            msg \u003d (\u0027Create volume error. \u0027)"},{"line_number":136,"context_line":"            LOG.debug(msg)"},{"line_number":137,"context_line":"            return ({}, False)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        elapsed_time \u003d time.time() - start_time"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_9a0e0030","line":136,"updated":"2019-11-01 16:47:11.000000000","message":"Please, add exception details to the log message","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            pool_id \u003d self.client.list_pools(domain_id)"},{"line_number":170,"context_line":"            self.client.create_volume(volume_id, volume_name,"},{"line_number":171,"context_line":"                                      volume_size, domain_id, pool_id)"},{"line_number":172,"context_line":"        except Exception as e:"},{"line_number":173,"context_line":"            raise exception.VolumeDriverException(message\u003de)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        volume_status \u003d [\u0027Available\u0027, \u0027Deleting\u0027, \u0027Deleted\u0027, \u0027Stable\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_1a2c5097","line":172,"updated":"2019-11-01 16:47:11.000000000","message":"Can we catch more specific exception here?","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            self.client.create_volume(volume_id, volume_name,"},{"line_number":171,"context_line":"                                      volume_size, domain_id, pool_id)"},{"line_number":172,"context_line":"        except Exception as e:"},{"line_number":173,"context_line":"            raise exception.VolumeDriverException(message\u003de)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        volume_status \u003d [\u0027Available\u0027, \u0027Deleting\u0027, \u0027Deleted\u0027, \u0027Stable\u0027]"},{"line_number":176,"context_line":"        current_status \u003d self.client.poll_volume_have_status(volume_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_da21d89f","line":173,"updated":"2019-11-01 16:47:11.000000000","message":"Please, log traceback here. It will be very helpful for debugging","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                    image_meta, image_service):"},{"line_number":74,"context_line":"        \"\"\"Clone image.\"\"\""},{"line_number":75,"context_line":"        start_time \u003d time.time()"},{"line_number":76,"context_line":"        LOG.debug(\u0027In clone_image.\u0027)"},{"line_number":77,"context_line":"        LOG.debug(\u0027Clone image location: %(image_location)s, \u0027"},{"line_number":78,"context_line":"                  \u0027meta: %(image_meta)s.\u0027,"},{"line_number":79,"context_line":"                  {\u0027image_location\u0027: image_location,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_5cb70c86","line":76,"updated":"2019-11-05 02:30:56.000000000","message":"Remove this. It is not useful and the next line logs something that would actually be helpful.","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            model_update \u003d self.create_cloned_volume(volume, srcVolume)"},{"line_number":86,"context_line":"            result_size \u003d model_update[\u0027size\u0027]"},{"line_number":87,"context_line":"        except exception.VolumeNotFound:"},{"line_number":88,"context_line":"            msg \u003d _(\u0027Fail to get source volume %s info.\u0027) % srcVolume[\u0027id\u0027]"},{"line_number":89,"context_line":"            LOG.debug(msg)"},{"line_number":90,"context_line":"            return ({}, False)"},{"line_number":91,"context_line":"        except exception.VolumeDriverException:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_fcb11890","line":88,"range":{"start_line":88,"start_character":18,"end_line":88,"end_character":20},"updated":"2019-11-05 02:30:56.000000000","message":"Don\u0027t translate log messages.","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def create_volume(self, volume):"},{"line_number":105,"context_line":"        \"\"\"Create volume.\"\"\""},{"line_number":106,"context_line":"        start_time \u003d time.time()"},{"line_number":107,"context_line":"        LOG.debug(\u0027In create_volume.\u0027)"},{"line_number":108,"context_line":"        LOG.info(\u0027Create volume, volume: %(display_name)s.\u0027,"},{"line_number":109,"context_line":"                 {\u0027display_name\u0027: volume[\u0027display_name\u0027]})"},{"line_number":110,"context_line":"        volume_id \u003d pengyun_utils.gen_id_from(volume[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_bca72050","line":107,"updated":"2019-11-05 02:30:56.000000000","message":"Remove these kinds of log messages.","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d819ef8f54dc561cd2833a8fb49a8cf364a0f9a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            raise exception.VolumeDriverException(message\u003dmsg)"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        elapsed_time \u003d time.time() - start_time"},{"line_number":232,"context_line":"        LOG.debug(\u0027In create_snapshot elapsed_time: %s.\u0027, elapsed_time)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def delete_snapshot(self, snapshot):"},{"line_number":235,"context_line":"        \"\"\"Delete snapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_7c4c489d","line":232,"updated":"2019-11-05 02:30:56.000000000","message":"Remove these throughout and use the utils.trace_method decorators on any calls that you would like to be able to trace this:\n\nhttps://github.com/openstack/cinder/blob/fb0bebe78838f7209f4502e71708450dc1e1eace/cinder/utils.py#L721","commit_id":"5fcc54a16bc9c856830f4b8f013db9a80e736c99"}],"cinder/volume/drivers/pengyun/rest_client.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"664c3ce6438ae30e68ce195d0b55a0562657fa06","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def _retry(delay\u003d1, retries\u003d4):"},{"line_number":34,"context_line":"    def retry_decorator(f):"},{"line_number":35,"context_line":"        @wraps(f)"},{"line_number":36,"context_line":"        def f_retry(*args, **kwargs):"},{"line_number":37,"context_line":"            opt_dict \u003d {\u0027retries\u0027: retries, \u0027delay\u0027: delay}"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ba53bc15","line":34,"updated":"2019-11-01 16:47:11.000000000","message":"Please, do not duplicate the code","commit_id":"0d08bc139e672542a89cacecca38e5ab3c180308"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"89d1e6e91f6f16f654beaf843b5057347c617ddc","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def get_volume_domain_pool(self, volume_id):"},{"line_number":180,"context_line":"        \"\"\"Get volume domain pool.\"\"\""},{"line_number":181,"context_line":"        url \u003d constants.VOLUME_INFO_BY_IDS"},{"line_number":182,"context_line":"        ids_list \u003d list()"},{"line_number":183,"context_line":"        ids_list.append(volume_id)"},{"line_number":184,"context_line":"        data \u003d {\u0027ids\u0027: json.dumps(ids_list),"},{"line_number":185,"context_line":"                \u0027accountId\u0027: self.account_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_1d4972b6","line":182,"range":{"start_line":182,"start_character":19,"end_line":182,"end_character":25},"updated":"2019-11-07 03:48:11.000000000","message":"These were more correct as {} and [] rather than dict() and list() calls.","commit_id":"07cc74321d082de36b6962116a0ec93d114cd171"}]}
