)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"fe6ec9ee54783c5dc4a8b3d20bae170fd6db741a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Driver QuantaStor added"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Review comments fixed"},{"line_number":10,"context_line":"Fixed pep8 errors"},{"line_number":11,"context_line":"Added Quantastor Driver Docs"},{"line_number":12,"context_line":"Added Release Notes"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3f79a3b5_8896a79f","line":10,"range":{"start_line":9,"start_character":0,"end_line":10,"end_character":17},"updated":"2018-11-29 06:23:20.000000000","message":"These lines aren\u0027t required in the commit message","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-11-29 19:06:47 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Driver QuantaStor added"},{"line_number":8,"context_line":"Added Quantastor Driver Docs"},{"line_number":9,"context_line":"Added Release Notes"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I1a48fe0dd41165d08e60f0de8db8330dfa900a48"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_cfbfbec9","line":8,"updated":"2018-11-29 15:49:45.000000000","message":"Blank line needed after the summary line.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"c82fc175632cef365bd303ea293ce55823b31889","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     quantastor-ci \u003cyachika.ralhan@msystechnologies.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-01-21 18:51:50 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Driver QuantaStor added"},{"line_number":8,"context_line":"Added Quantastor Driver Docs"},{"line_number":9,"context_line":"Added Release Notes"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fdfeff1_b24aa824","line":7,"updated":"2019-01-22 20:03:10.000000000","message":"Need a summary line separate from the commit message -- please see\n    https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"5d377c1a0bd27863c748f232b726950e72c000af"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     yachika_ralhan \u003cyachika.ralhan@msystechnologies.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-01-29 06:48:31 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Using existing san_ip config option in quantastor.py"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Importing SanISCSIDriver class to use existing san config options."},{"line_number":10,"context_line":"Removed unnecessary return and debugging statements. Raising execptions,"},{"line_number":11,"context_line":"as perviously, it was strings."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Handled the case where the new volume (volume from snapshot) being"},{"line_number":14,"context_line":"requested is larger than the snapshot."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"While terminating connection, connector may be None in the case of"},{"line_number":17,"context_line":"force detach. Handled this and remove all connections if that is the case."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I1a48fe0dd41165d08e60f0de8db8330dfa900a48"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"9fdfeff1_9515a09e","line":17,"range":{"start_line":7,"start_character":0,"end_line":17,"end_character":74},"updated":"2019-01-29 13:17:43.000000000","message":"All of this should be changed. This makes it sounds like multiple fixes are being done on an existing driver, but this patch is actually adding a new driver. Change the commit message to reflect that. Something along the lines of:\n\n\"Add new OSNEXUS QuantaStor driver\n\nThis adds a new driver for QuantaStor storage.\"","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"}],"cinder/opts.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0b948d5910c9a42c377de0ef31195ced0c92b395","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    cinder_volume_drivers_prophetstor_options"},{"line_number":145,"context_line":"from cinder.volume.drivers import pure as cinder_volume_drivers_pure"},{"line_number":146,"context_line":"from cinder.volume.drivers import qnap as cinder_volume_drivers_qnap"},{"line_number":147,"context_line":"from cinder.volume.drivers import quantastor as \\"},{"line_number":148,"context_line":"    cinder_volume_drivers_quantastor"},{"line_number":149,"context_line":"from cinder.volume.drivers import quobyte as cinder_volume_drivers_quobyte"},{"line_number":150,"context_line":"from cinder.volume.drivers import rbd as cinder_volume_drivers_rbd"},{"line_number":151,"context_line":"from cinder.volume.drivers import remotefs as cinder_volume_drivers_remotefs"}],"source_content_type":"text/x-python","patch_set":22,"id":"dfbec78f_9ae31506","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":36},"updated":"2019-05-05 13:02:48.000000000","message":"since the driver doesn\u0027t exist here anymore, we need to remove this","commit_id":"dc1d14065f305949950384e14f98a342df473c61"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"0b948d5910c9a42c377de0ef31195ced0c92b395","unresolved":false,"context_lines":[{"line_number":272,"context_line":"                cinder_volume_drivers_inspur_instorage_instorageiscsi."},{"line_number":273,"context_line":"                instorage_mcs_iscsi_opts,"},{"line_number":274,"context_line":"                cinder_volume_drivers_osnexus_quantastor.QS_OPTS,"},{"line_number":275,"context_line":"                cinder_volume_drivers_quantastor.QS_OPTS,"},{"line_number":276,"context_line":"                cinder_volume_drivers_storpool.storpool_opts,"},{"line_number":277,"context_line":"                cinder_volume_drivers_veritas_access_veritasiscsi.VA_VOL_OPTS,"},{"line_number":278,"context_line":"                cinder_volume_manager.volume_manager_opts,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dfbec78f_3af0e9c9","line":275,"range":{"start_line":275,"start_character":16,"end_line":275,"end_character":56},"updated":"2019-05-05 13:02:48.000000000","message":"same","commit_id":"dc1d14065f305949950384e14f98a342df473c61"}],"cinder/volume/drivers/osnexus/quantastor.py":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ba6cf1cec6233e8a304cfa65c954a2fd1a8ba45a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 OSNEXUS"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"#    you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":24,"id":"bfb3d3c7_5a837305","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2019-05-17 15:44:59.000000000","message":"Should probably update this to 2019","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"22820fd06b5450f3786c0582555f6c968d2372ea","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder import exception"},{"line_number":22,"context_line":"from cinder.i18n import _"},{"line_number":23,"context_line":"from cinder import interface"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from cinder.volume.drivers.osnexus import quantastor_api"},{"line_number":26,"context_line":"from cinder.volume.drivers.san import san"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"dfbec78f_6cadc1e7","line":24,"updated":"2019-05-14 13:04:09.000000000","message":"Extra blank line should be removed.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"22820fd06b5450f3786c0582555f6c968d2372ea","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def check_for_setup_error(self):"},{"line_number":71,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met\"\"\""},{"line_number":72,"context_line":"        try:"},{"line_number":73,"context_line":"            LOG.info(\"Checking for setup errors...\")"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"            sys_info \u003d self.qs_sys_get()"},{"line_number":76,"context_line":"            pool_info \u003d self.qs_pool_get()"}],"source_content_type":"text/x-python","patch_set":24,"id":"dfbec78f_2cb3494f","line":73,"range":{"start_line":73,"start_character":16,"end_line":73,"end_character":20},"updated":"2019-05-14 13:04:09.000000000","message":"This should be debug level.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ba6cf1cec6233e8a304cfa65c954a2fd1a8ba45a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                      pool_info._name)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":82,"context_line":"            exception_message \u003d _(\"Quantastor driver is not working.\")"},{"line_number":83,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def create_cloned_volume(self, volume, src_vref):"}],"source_content_type":"text/x-python","patch_set":24,"id":"bfb3d3c7_1acbbb53","line":82,"range":{"start_line":82,"start_character":53,"end_line":82,"end_character":68},"updated":"2019-05-17 15:44:59.000000000","message":"This is a pretty weak message.  Given where this is in the code I think something like: \"is not configured properly.\" is more appropriate.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ba6cf1cec6233e8a304cfa65c954a2fd1a8ba45a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        qs_vol \u003d out._id"},{"line_number":111,"context_line":"        if qs_vol is None:"},{"line_number":112,"context_line":"            exception_message \u003d _("},{"line_number":113,"context_line":"                \"Error: Failed to load volume information\")"},{"line_number":114,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":115,"context_line":"        LOG.debug(\"Volume \u003d %s was successfully created\", qs_vol)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"bfb3d3c7_7db671dc","line":113,"range":{"start_line":113,"start_character":17,"end_line":113,"end_character":57},"updated":"2019-05-17 15:44:59.000000000","message":"Messages like this should include the volume in question.  Makes them more useful and it easier to debug failures.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"}],"cinder/volume/drivers/osnexus/quantastor_api.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"22820fd06b5450f3786c0582555f6c968d2372ea","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                    raise QuantastorAPIException(msg)"},{"line_number":99,"context_line":"            if i \u003d\u003d 10:"},{"line_number":100,"context_line":"                break"},{"line_number":101,"context_line":"        raise Exception(\"Task %s did not complete\" % task_id)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    # Storage System APIs"},{"line_number":104,"context_line":"    def storage_system_noflag_get(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"dfbec78f_2c458943","line":101,"range":{"start_line":101,"start_character":14,"end_line":101,"end_character":23},"updated":"2019-05-14 13:04:09.000000000","message":"Would be good to use something more specific than Exception for these.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"22820fd06b5450f3786c0582555f6c968d2372ea","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    # Host Group management APIs"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def host_group_parse(self, json_output):"},{"line_number":179,"context_line":"        if \u0027obj\u0027 in json_output.keys() and \u0027id\u0027 in json_output[\u0027obj\u0027].keys():"},{"line_number":180,"context_line":"            json_output \u003d json_output[\u0027obj\u0027]"},{"line_number":181,"context_line":"        host_list \u003d []"},{"line_number":182,"context_line":"        if \u0027hostList\u0027 in json_output:"}],"source_content_type":"text/x-python","patch_set":24,"id":"dfbec78f_0c61a5d3","line":179,"range":{"start_line":179,"start_character":69,"end_line":179,"end_character":76},"updated":"2019-05-14 13:04:09.000000000","message":"No need to call keys() here.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"}],"cinder/volume/drivers/quantastor.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\"\"\""},{"line_number":2,"context_line":"QuantaStor Volume Driver for Cinder."},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"Paths to remember:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_4e7f37de","line":1,"updated":"2018-11-13 10:25:41.000000000","message":"The initial comments should contain the apache license header.\nExample : https://github.com/openstack/cinder/blob/stable/ocata/cinder/volume/drivers/lvm.py#L1","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"import os"},{"line_number":29,"context_line":"import time"},{"line_number":30,"context_line":"import requests"},{"line_number":31,"context_line":"from cinder import exception"},{"line_number":32,"context_line":"from cinder.i18n import _"},{"line_number":33,"context_line":"from cinder.volume import driver"},{"line_number":34,"context_line":"from oslo_concurrency import processutils"},{"line_number":35,"context_line":"from oslo_config import cfg"},{"line_number":36,"context_line":"from oslo_log import log as logging"},{"line_number":37,"context_line":"#from quantastor_api import QuantastorClient"},{"line_number":38,"context_line":"from cinder.volume.drivers.quantastor_api import QuantastorClient"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_6e59d38e","line":38,"range":{"start_line":28,"start_character":0,"end_line":38,"end_character":65},"updated":"2018-11-13 10:25:41.000000000","message":"The imports should be ordered according to pep8 guidelines.\nhttps://docs.openstack.org/hacking/latest/user/hacking.html","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"CONF \u003d cfg.CONF"},{"line_number":62,"context_line":"CONF.register_opts(QS_OPTS)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class DotDict(dict):"},{"line_number":65,"context_line":"    \"\"\"dot.notation access to dictionary attributes\"\"\""},{"line_number":66,"context_line":"    __getattr__ \u003d dict.__getitem__"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_0907f917","line":63,"updated":"2018-11-13 10:25:41.000000000","message":"two spaces are required here","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    __delattr__ \u003d dict.__delitem__"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"class QuantaStorDriver(driver.ISCSIDriver):"},{"line_number":72,"context_line":"    \"\"\"Executes commands relating to QuantaStor Volumes\"\"\""},{"line_number":73,"context_line":"    VERSION \u003d \"0.9.0\""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_892469b3","line":71,"updated":"2018-11-13 10:25:41.000000000","message":"this class should contain @interface.volumedriver decorator","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":76,"context_line":"        self.logMessage(\"Initializing..\")"},{"line_number":77,"context_line":"        driver.ISCSIDriver.__init__(self, *args, **kwargs)"},{"line_number":78,"context_line":"        self.configuration.append_config_values(QS_OPTS)"},{"line_number":79,"context_line":"        self.logMessage(self.configuration.qs_ip)"},{"line_number":80,"context_line":"        self.logMessage(self.configuration.qs_user)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_09a379ff","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":58},"updated":"2018-11-13 10:25:41.000000000","message":"i think we can use super(QuantaStorDriver, self).__init__(*args, **kwargs)","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"\"\"Create client for QUANTASTOR request manager.\"\"\""},{"line_number":85,"context_line":"        LOG.debug(\"Enter in QuantastorDriver do_setup.\")"},{"line_number":86,"context_line":"        module \u003d {"},{"line_number":87,"context_line":"            \u0027params\u0027 : {"},{"line_number":88,"context_line":"                \u0027quantastor_hostname\u0027 : self.configuration.qs_ip,"},{"line_number":89,"context_line":"                \u0027quantastor_username\u0027 : self.configuration.qs_user,"},{"line_number":90,"context_line":"                \u0027quantastor_password\u0027 : self.configuration.qs_password"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_2938b59c","line":87,"range":{"start_line":87,"start_character":20,"end_line":87,"end_character":21},"updated":"2018-11-13 10:25:41.000000000","message":"there shouldn\u0027t be any blank space before \u0027:\u0027","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":95,"context_line":"    def check_for_setup_error(self):"},{"line_number":96,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met\"\"\""},{"line_number":97,"context_line":"        try:"},{"line_number":98,"context_line":"            self.logMessage(\"Checking for setup errors...\")"},{"line_number":99,"context_line":"            if self.configuration.qs_ip \u003d\u003d \"\":"},{"line_number":100,"context_line":"                errorMessage \u003d (\u0027Error: The IP address of a QuantaStor \u0027"},{"line_number":101,"context_line":"                                \u0027system must be specified.\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_09d1395b","line":98,"range":{"start_line":98,"start_character":12,"end_line":98,"end_character":59},"updated":"2018-11-13 10:25:41.000000000","message":"can we use LOG.info instead ?","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def create_cloned_volume(self, volume, src_vref):"},{"line_number":138,"context_line":"        self.logMessage(\"Creating cloned volume\")"},{"line_number":139,"context_line":"        out \u003d self.client.storage_create_cloned_volume(src_vref[\u0027name\u0027], volume[\u0027name\u0027], \\"},{"line_number":140,"context_line":"                                                       self.configuration.qs_pool_id)"},{"line_number":141,"context_line":"        qs_clone \u003d out._id"},{"line_number":142,"context_line":"        if qs_clone is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_a941253a","line":139,"range":{"start_line":139,"start_character":88,"end_line":139,"end_character":90},"updated":"2018-11-13 10:25:41.000000000","message":"this isn\u0027t needed","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.logMessage(\"Creating snapshot\")"},{"line_number":203,"context_line":"        storage_volume \u003d snapshot[\u0027volume_name\u0027]"},{"line_number":204,"context_line":"        snapshot_name \u003d snapshot[\u0027name\u0027]"},{"line_number":205,"context_line":"        out \u003d self.client.storage_create_snapshot(storage_volume, snapshot_name, \\"},{"line_number":206,"context_line":"\t                                          self.configuration.qs_pool_id)"},{"line_number":207,"context_line":"        qs_snap \u003d out._id"},{"line_number":208,"context_line":"        if qs_snap is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_692ead5c","line":205,"range":{"start_line":205,"start_character":80,"end_line":205,"end_character":82},"updated":"2018-11-13 10:25:41.000000000","message":"not required","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        storage_volume \u003d snapshot[\u0027volume_name\u0027]"},{"line_number":204,"context_line":"        snapshot_name \u003d snapshot[\u0027name\u0027]"},{"line_number":205,"context_line":"        out \u003d self.client.storage_create_snapshot(storage_volume, snapshot_name, \\"},{"line_number":206,"context_line":"\t                                          self.configuration.qs_pool_id)"},{"line_number":207,"context_line":"        qs_snap \u003d out._id"},{"line_number":208,"context_line":"        if qs_snap is None:"},{"line_number":209,"context_line":"            exception_message \u003d _("}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_a94b6527","line":206,"range":{"start_line":206,"start_character":0,"end_line":206,"end_character":43},"updated":"2018-11-13 10:25:41.000000000","message":"please replace this with blank spaces","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        self.logMessage(\"Calling initialize connection\")"},{"line_number":257,"context_line":"        self.initialize_connection(volume, connector)"},{"line_number":258,"context_line":"        # return {\u0027provider_location\u0027: self._get_provider_location(volume)}"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def remove_export(self, context, volume):"},{"line_number":261,"context_line":"        \"\"\"Removes an export for a logical volume\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_69254d5e","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":10},"updated":"2018-11-13 10:25:41.000000000","message":"i think this should be uncommented","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        self.logMessage(\"Work done in terminate connection\")"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":266,"context_line":"        # TODO(dont add if it already is assigned to host)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        self.logMessage(\"Initialize connection\")"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_091619f5","line":266,"range":{"start_line":266,"start_character":10,"end_line":266,"end_character":14},"updated":"2018-11-13 10:25:41.000000000","message":"name should be written with TODO","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                \u0027target_iqn\u0027: str(qs_vol._iqn),"},{"line_number":317,"context_line":"                \u0027target_portal\u0027: portal,"},{"line_number":318,"context_line":"                \u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":319,"context_line":"                \u0027access_mode\u0027: \u0027rw\u0027"},{"line_number":320,"context_line":"            }"},{"line_number":321,"context_line":"        }"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_49d97153","line":319,"range":{"start_line":319,"start_character":31,"end_line":319,"end_character":35},"updated":"2018-11-13 10:25:41.000000000","message":"any case where it can be read only?","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            pass"},{"line_number":415,"context_line":"        LOG.debug(\"adt_quantastor: \" + str(message))"},{"line_number":416,"context_line":"        return message"},{"line_number":417,"context_line":"    @classmethod"},{"line_number":418,"context_line":"    def gb_to_b_size(cls, size_gb):"},{"line_number":419,"context_line":"        return str(int(size_gb) * 1024 * 1024 * 1024)"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    @classmethod"},{"line_number":422,"context_line":"    def b_to_gb_size(cls, size_b):"},{"line_number":423,"context_line":"        return str(int(size_b) / 1024 / 1024 / 1024)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def qs_vol_get(self, vol_name):"},{"line_number":426,"context_line":"        self.logMessage(\"volume get\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_898b0915","line":423,"range":{"start_line":417,"start_character":4,"end_line":423,"end_character":52},"updated":"2018-11-13 10:25:41.000000000","message":"can we use oslo_utils.units here?","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"473705d3ff0918e3e3a526fedb5ea742394ed57f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\"\"\""},{"line_number":2,"context_line":"QuantaStor Volume Driver for Cinder."},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"Paths to remember:"},{"line_number":5,"context_line":"/opt/stack/cinder/cinder/volume/drivers"},{"line_number":6,"context_line":"/usr/local/lib/python2.7/dist-packages/cinder/volume/drivers/"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_9955bb53","line":3,"updated":"2018-11-27 20:22:43.000000000","message":"Most of this shouldn\u0027t be in the actual driver.","commit_id":"ad64a02f769c8ec4740d246460ec3673e931eb0b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"473705d3ff0918e3e3a526fedb5ea742394ed57f","unresolved":false,"context_lines":[{"line_number":42,"context_line":"QS_OPTS \u003d ["},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027qs_ip\u0027, default\u003d\"\","},{"line_number":44,"context_line":"               help\u003d\u0027The IP address of the QuantaStor system \u0027"},{"line_number":45,"context_line":"                    \u0027being used for storage\u0027),"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    cfg.StrOpt(\u0027qs_pool_id\u0027,"},{"line_number":48,"context_line":"               default\u003d\"\","}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_594ba3b0","line":45,"updated":"2018-11-27 20:22:43.000000000","message":"Can you connect via a DNS hostname too, or only IPs?","commit_id":"ad64a02f769c8ec4740d246460ec3673e931eb0b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"473705d3ff0918e3e3a526fedb5ea742394ed57f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    \u0027to be used by cinder\u0027),"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    cfg.StrOpt(\u0027qs_password\u0027,"},{"line_number":57,"context_line":"               default\u003d\"password\","},{"line_number":58,"context_line":"               help\u003d\u0027The password for the QuantaStor account being used\u0027), ]"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_f945cf9c","line":57,"updated":"2018-11-27 20:22:43.000000000","message":"Must be marked secret.","commit_id":"ad64a02f769c8ec4740d246460ec3673e931eb0b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"473705d3ff0918e3e3a526fedb5ea742394ed57f","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        stats[\"volume_backend_name\"] \u003d \u0027qstor\u0027"},{"line_number":365,"context_line":"        stats[\u0027vendor_name\u0027] \u003d \u0027OSNEXUS\u0027"},{"line_number":366,"context_line":"        stats[\u0027dirver_version\u0027] \u003d self.VERSION"},{"line_number":367,"context_line":"        stats[\u0027storage_protocol\u0027] \u003d \u0027iSCSI\u0027"},{"line_number":368,"context_line":"        stats[\u0027total_capacity_gb\u0027] \u003d \u0027unknown\u0027"},{"line_number":369,"context_line":"        stats[\u0027free_capacity_gb\u0027] \u003d \u0027unknown\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_99ca9b15","line":366,"range":{"start_line":366,"start_character":15,"end_line":366,"end_character":21},"updated":"2018-11-27 20:22:43.000000000","message":"Typo","commit_id":"ad64a02f769c8ec4740d246460ec3673e931eb0b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"473705d3ff0918e3e3a526fedb5ea742394ed57f","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    @classmethod"},{"line_number":408,"context_line":"    def logMessage(cls, message):"},{"line_number":409,"context_line":"        try:"},{"line_number":410,"context_line":"            if os.path.exists(\"/var/log/qs_cinder.log\"):"},{"line_number":411,"context_line":"                f \u003d open(\u0027/var/log/qs_cinder.log\u0027, \u0027a\u0027)"},{"line_number":412,"context_line":"                f.write(\u0027{%s, adt_quantastor} %s\\n\u0027 % (time.ctime(), message))"},{"line_number":413,"context_line":"        except Exception:"},{"line_number":414,"context_line":"            pass"},{"line_number":415,"context_line":"        LOG.debug(\"adt_quantastor: \" + str(message))"},{"line_number":416,"context_line":"        return message"},{"line_number":417,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_d9ed738d","line":414,"range":{"start_line":409,"start_character":8,"end_line":414,"end_character":16},"updated":"2018-11-27 20:22:43.000000000","message":"This all needs to be redone to just use regular Cinder log facilities.","commit_id":"ad64a02f769c8ec4740d246460ec3673e931eb0b"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    VERSION \u003d \"0.9.0\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":66,"context_line":"        LOG.info(\"Initializing..\")"},{"line_number":67,"context_line":"        super(QuantaStorDriver, self).__init__(*args, **kwargs)"},{"line_number":68,"context_line":"        self.configuration.append_config_values(QS_OPTS)"},{"line_number":69,"context_line":"        LOG.info(self.configuration.qs_ip)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_f6770a3b","line":66,"updated":"2018-11-28 14:32:39.000000000","message":"This is a debug message, not info.","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        LOG.info(\"Initializing..\")"},{"line_number":67,"context_line":"        super(QuantaStorDriver, self).__init__(*args, **kwargs)"},{"line_number":68,"context_line":"        self.configuration.append_config_values(QS_OPTS)"},{"line_number":69,"context_line":"        LOG.info(self.configuration.qs_ip)"},{"line_number":70,"context_line":"        LOG.info(self.configuration.qs_user)"},{"line_number":71,"context_line":"        LOG.info(self.configuration.qs_password)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def do_setup(self, context):"},{"line_number":74,"context_line":"        \"\"\"Create client for QUANTASTOR request manager.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_567d9e1a","line":71,"range":{"start_line":69,"start_character":0,"end_line":71,"end_character":48},"updated":"2018-11-28 14:32:39.000000000","message":"These are not needed, they\u0027ll be logged by the volume service at startup anyway.\n\nAlso this will log a password in plaintext which is not ok.","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def create_volume(self, volume):"},{"line_number":143,"context_line":"        \"\"\"Creates a volume\"\"\""},{"line_number":144,"context_line":"        LOG.info(\"creating a volume\")"},{"line_number":145,"context_line":"        name \u003d volume[\u0027name\u0027]"},{"line_number":146,"context_line":"        size \u003d self.gb_to_b_size(volume[\u0027size\u0027])"},{"line_number":147,"context_line":"        description \u003d \u0027volume creation\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_7689ba1b","line":144,"range":{"start_line":144,"start_character":8,"end_line":144,"end_character":16},"updated":"2018-11-28 14:32:39.000000000","message":"debug","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                \"Error: Failed to load volume information\")"},{"line_number":156,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        LOG.info(\"Volume was successfully created\")"},{"line_number":159,"context_line":"        return"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_968c962d","line":158,"range":{"start_line":158,"start_character":8,"end_line":158,"end_character":16},"updated":"2018-11-28 14:32:39.000000000","message":"debug","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":162,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":163,"context_line":"        LOG.info(\"Create volume from snapshot\")"},{"line_number":164,"context_line":"        LOG.info(\"storageVolumeClone?\u0026storageVolume\u003d\" +"},{"line_number":165,"context_line":"                 snapshot[\u0027name\u0027] +"},{"line_number":166,"context_line":"                 \"\u0026cloneName\u003d\" +"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_56927e4a","line":163,"range":{"start_line":163,"start_character":8,"end_line":163,"end_character":16},"updated":"2018-11-28 14:32:39.000000000","message":"debug","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":162,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":163,"context_line":"        LOG.info(\"Create volume from snapshot\")"},{"line_number":164,"context_line":"        LOG.info(\"storageVolumeClone?\u0026storageVolume\u003d\" +"},{"line_number":165,"context_line":"                 snapshot[\u0027name\u0027] +"},{"line_number":166,"context_line":"                 \"\u0026cloneName\u003d\" +"},{"line_number":167,"context_line":"                 volume[\u0027name\u0027] +"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_16988664","line":164,"range":{"start_line":164,"start_character":8,"end_line":164,"end_character":16},"updated":"2018-11-28 14:32:39.000000000","message":"debug (and may need some text...)","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"19cd65b9f67026a2f721ee8805ebbc4cab49a6be","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                \"Error: Failed to load clone information\")"},{"line_number":178,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.info(\"Cloned volume was successfully created\")"},{"line_number":181,"context_line":"        return"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def delete_volume(self, volume):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_b6a2f296","line":180,"range":{"start_line":180,"start_character":12,"end_line":180,"end_character":16},"updated":"2018-11-28 14:32:39.000000000","message":"debug","commit_id":"2629d8c03b3fc9fcb94228d543a231b59d1dc184"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from cinder.i18n import _"},{"line_number":23,"context_line":"from cinder import interface"},{"line_number":24,"context_line":"from cinder.volume import driver"},{"line_number":25,"context_line":"from cinder.volume.drivers.quantastor_api import QuantastorClient"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2f88b223","line":25,"updated":"2018-11-29 15:49:45.000000000","message":"Do not import classes.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"QS_OPTS \u003d ["},{"line_number":31,"context_line":"    cfg.StrOpt(\u0027qs_ip\u0027, default\u003dNone,"},{"line_number":32,"context_line":"               help\u003d\u0027The IP/FQDN of the Quantastor system \u0027"},{"line_number":33,"context_line":"                    \u0027being used for storage\u0027),"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_8f80e6fb","line":31,"updated":"2018-11-29 15:49:45.000000000","message":"Use the existing san_ip config option. We want to limit the number of new config options introduced. Existing config options should be used as much as possible.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"QS_OPTS \u003d ["},{"line_number":31,"context_line":"    cfg.StrOpt(\u0027qs_ip\u0027, default\u003dNone,"},{"line_number":32,"context_line":"               help\u003d\u0027The IP/FQDN of the Quantastor system \u0027"},{"line_number":33,"context_line":"                    \u0027being used for storage\u0027),"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_badd3ede","line":31,"in_reply_to":"3f79a3b5_8f80e6fb","updated":"2019-03-07 12:08:37.000000000","message":"yes, now we are using existing SanISCSIDriver class. By using this, new config options are not getting introduced.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"               default\u003dNone,"},{"line_number":37,"context_line":"               help\u003d\u0027The ID of the Quantastor pool or tier to use.\u0027),"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    cfg.StrOpt(\u0027qs_user\u0027,"},{"line_number":40,"context_line":"               default\u003dNone,"},{"line_number":41,"context_line":"               help\u003d\u0027The account on the Quantastor system \u0027"},{"line_number":42,"context_line":"                    \u0027to be used by cinder\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4f7ace27","line":39,"range":{"start_line":39,"start_character":16,"end_line":39,"end_character":23},"updated":"2018-11-29 15:49:45.000000000","message":"san_login","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"               help\u003d\u0027The account on the Quantastor system \u0027"},{"line_number":42,"context_line":"                    \u0027to be used by cinder\u0027),"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027qs_password\u0027,"},{"line_number":45,"context_line":"               default\u003dNone,"},{"line_number":46,"context_line":"               help\u003d\u0027The password for the Quantastor account being used\u0027,"},{"line_number":47,"context_line":"               secret\u003dTrue)]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_cfa25e99","line":44,"range":{"start_line":44,"start_character":16,"end_line":44,"end_character":28},"updated":"2018-11-29 15:49:45.000000000","message":"san_password","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"class QuantaStorDriver(driver.ISCSIDriver):"},{"line_number":62,"context_line":"    \"\"\"Executes commands relating to QuantaStor Volumes\"\"\""},{"line_number":63,"context_line":"    VERSION \u003d \"0.9.0\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":66,"context_line":"        super(QuantaStorDriver, self).__init__(*args, **kwargs)"},{"line_number":67,"context_line":"        self.configuration.append_config_values(QS_OPTS)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4fddee10","line":64,"updated":"2018-11-29 15:49:45.000000000","message":"Please also add CI_WIKI_NAME used for tracking driver to maintainers. For example:\n\nhttp://git.openstack.org/cgit/openstack/cinder/tree/cinder/volume/drivers/rbd.py#n201","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                error_message \u003d (\u0027Error: The IP address of a Quantastor\u0027"},{"line_number":87,"context_line":"                                 \u0027system must be specified.\u0027)"},{"line_number":88,"context_line":"                LOG.error(error_message)"},{"line_number":89,"context_line":"                raise error_message"},{"line_number":90,"context_line":"            if self.configuration.qs_pool_id \u003d\u003d \"\":"},{"line_number":91,"context_line":"                error_message \u003d (\u0027Error: The pool ID of a Quantastor\u0027"},{"line_number":92,"context_line":"                                 \u0027system must be specified.\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_efcdda5b","line":89,"range":{"start_line":89,"start_character":22,"end_line":89,"end_character":35},"updated":"2018-11-29 15:49:45.000000000","message":"Raise exceptions, not strings. Exception messages should also be put in _() so the strings are extracted and translated.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"            sys_info \u003d self.qs_sys_get()"},{"line_number":107,"context_line":"            pool_info \u003d self.qs_pool_get()"},{"line_number":108,"context_line":"            LOG.debug(\"connected to Quantastor system \" + sys_info._name"},{"line_number":109,"context_line":"                      + \"Found pool with ID \" +"},{"line_number":110,"context_line":"                      pool_info._id +"},{"line_number":111,"context_line":"                      \" named \" +"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ef14fa9b","line":108,"range":{"start_line":108,"start_character":55,"end_line":108,"end_character":58},"updated":"2018-11-29 15:49:45.000000000","message":"Use string formatting, with the formatting values passed in as arguments to the logging call so it can perform the formatting only if needed. Best to avoid string concatenation and do string formatting whenever possible.\n\nExample:\n\nLOG.debug(\"This is a log message: %s\", \"Value to include\")\n\nor if there are multiple values:\n\nLOG.debug(\"One %(one)s, two %(two)s, three %(three)s\",\n          {\"one\": \"first value\",\n           \"two\": \"second value\",\n           \"three\": \"third\"})","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                      pool_info._id +"},{"line_number":111,"context_line":"                      \" named \" +"},{"line_number":112,"context_line":"                      pool_info._name)"},{"line_number":113,"context_line":"            LOG.info("},{"line_number":114,"context_line":"                \"No setup errors found. Quantastor driver is ready for use.\")"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        except processutils.ProcessExecutionError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_8f6f862e","line":113,"updated":"2018-11-29 15:49:45.000000000","message":"This is not useful and should be removed.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        LOG.debug(\"Cloned volume %s was successfully created\", qs_clone)"},{"line_number":132,"context_line":"        return"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def create_volume(self, volume):"},{"line_number":135,"context_line":"        \"\"\"Creates a volume\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_6f7eaae3","line":132,"updated":"2018-11-29 15:49:45.000000000","message":"This return is not needed.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \"Error: Failed to load volume information\")"},{"line_number":147,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":148,"context_line":"        LOG.debug(\"Volume \u003d %s was successfully created\", qs_vol)"},{"line_number":149,"context_line":"        return"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":152,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ea694823","line":149,"range":{"start_line":149,"start_character":8,"end_line":149,"end_character":14},"updated":"2018-11-29 15:49:45.000000000","message":"Remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":152,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":153,"context_line":"        out \u003d self.client.storage_create_cloned_volume(snapshot[\u0027name\u0027],"},{"line_number":154,"context_line":"                                                       volume[\u0027name\u0027],"},{"line_number":155,"context_line":"                                                       self.configuration"},{"line_number":156,"context_line":"                                                       .qs_pool_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_eaf06863","line":153,"updated":"2018-11-29 15:49:45.000000000","message":"I don\u0027t see anything handling the case where the new volume being requested is larger than the snapshot. The driver needs to recognize this and handle making sure the new volume is created larger, extended, or whatever operation needs to happen with the given backend to make sure the right size is provided.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def create_volume_from_snapshot(self, volume, snapshot):"},{"line_number":152,"context_line":"        \"\"\"Creates a volume from a snapshot.\"\"\""},{"line_number":153,"context_line":"        out \u003d self.client.storage_create_cloned_volume(snapshot[\u0027name\u0027],"},{"line_number":154,"context_line":"                                                       volume[\u0027name\u0027],"},{"line_number":155,"context_line":"                                                       self.configuration"},{"line_number":156,"context_line":"                                                       .qs_pool_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_da0da23e","line":153,"in_reply_to":"3f79a3b5_eaf06863","updated":"2019-03-07 12:08:37.000000000","message":"yes, this case has been handled and also we have tested it.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        LOG.debug(\"Cloned volume %s was successfully created\", qs_clone)"},{"line_number":164,"context_line":"        return"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def delete_volume(self, volume):"},{"line_number":167,"context_line":"        \"\"\"Deletes a logical volume\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ca456c9e","line":164,"range":{"start_line":164,"start_character":8,"end_line":164,"end_character":14},"updated":"2018-11-29 15:49:45.000000000","message":"remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        LOG.debug(\"verifying that volume no longer exists\")"},{"line_number":173,"context_line":"        vol \u003d self.client.storage_volume_get(name)"},{"line_number":174,"context_line":"        if vol is not None:"},{"line_number":175,"context_line":"            exception_message \u003d _(\"Error: Failed to delete snapshot\")"},{"line_number":176,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":177,"context_line":"        LOG.debug(\"Volume \u003d%s was successfully deleted\", vol)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0a7fe4bd","line":174,"range":{"start_line":174,"start_character":8,"end_line":174,"end_character":27},"updated":"2018-11-29 15:49:45.000000000","message":"Is this really necessary?","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":177,"context_line":"        LOG.debug(\"Volume \u003d%s was successfully deleted\", vol)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        return"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":182,"context_line":"        storage_volume \u003d snapshot[\u0027volume_name\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2a7c20c6","line":179,"updated":"2018-11-29 15:49:45.000000000","message":"remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        LOG.debug(\"Snapshot \u003d%s was successfully created\", qs_snap)"},{"line_number":195,"context_line":"        return"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def delete_snapshot(self, snapshot):"},{"line_number":198,"context_line":"        \"\"\"Deletes a snapshot\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4aae3c32","line":195,"updated":"2018-11-29 15:49:45.000000000","message":"remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        LOG.debug(\"verifying that snapshot no longer exists\")"},{"line_number":204,"context_line":"        out \u003d self.client.storage_volume_get(name)"},{"line_number":205,"context_line":"        vol \u003d out._id"},{"line_number":206,"context_line":"        if vol is not None:"},{"line_number":207,"context_line":"            exception_message \u003d _(\"Error: Failed to delete snapshot\")"},{"line_number":208,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_caa1ec3d","line":206,"updated":"2018-11-29 15:49:45.000000000","message":"Is it expected with Quanta store that requests to delete things won\u0027t actually be honored?","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        LOG.debug(\"Snapshot \u003d%s was successfully deleted\", vol)"},{"line_number":211,"context_line":"        return"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def local_path(self, volume):"},{"line_number":214,"context_line":"        # We dont use local path"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ea9e28f9","line":211,"updated":"2018-11-29 15:49:45.000000000","message":"remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        LOG.debug(\"Snapshot \u003d%s was successfully deleted\", vol)"},{"line_number":211,"context_line":"        return"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def local_path(self, volume):"},{"line_number":214,"context_line":"        # We dont use local path"},{"line_number":215,"context_line":"        raise NotImplementedError()"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def ensure_export(self, context, volume):"},{"line_number":218,"context_line":"        \"\"\"Safely and synchronously recreates an export for a logical volume\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_6a41b862","line":215,"range":{"start_line":213,"start_character":4,"end_line":215,"end_character":33},"updated":"2018-11-29 15:49:45.000000000","message":"This can be removed.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def ensure_export(self, context, volume):"},{"line_number":218,"context_line":"        \"\"\"Safely and synchronously recreates an export for a logical volume\"\"\""},{"line_number":219,"context_line":"        LOG.debug(volume[\"provider_location\"])"},{"line_number":220,"context_line":"        LOG.debug(volume[\"host\"])"},{"line_number":221,"context_line":"        LOG.debug(volume[\"attached_host\"])"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def create_export(self, context, volume, connector):"},{"line_number":224,"context_line":"        \"\"\"Exports the volume\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ca4fac8b","line":221,"range":{"start_line":219,"start_character":8,"end_line":221,"end_character":42},"updated":"2018-11-29 15:49:45.000000000","message":"Get rid of this.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def create_export(self, context, volume, connector):"},{"line_number":224,"context_line":"        \"\"\"Exports the volume\"\"\""},{"line_number":225,"context_line":"        LOG.debug(str(context))"},{"line_number":226,"context_line":"        LOG.debug(str(volume))"},{"line_number":227,"context_line":"        LOG.debug(str(connector))"},{"line_number":228,"context_line":"        self.initialize_connection(volume, connector)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def remove_export(self, context, volume):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4a315c09","line":227,"range":{"start_line":225,"start_character":8,"end_line":227,"end_character":33},"updated":"2018-11-29 15:49:45.000000000","message":"Get rid of this.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def remove_export(self, context, volume):"},{"line_number":231,"context_line":"        \"\"\"Removes an export for a logical volume\"\"\""},{"line_number":232,"context_line":"        LOG.debug(\"Work done in terminate connection\")"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":235,"context_line":"        \"\"\"attaching volume to host\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_6a369804","line":232,"range":{"start_line":232,"start_character":8,"end_line":232,"end_character":54},"updated":"2018-11-29 15:49:45.000000000","message":"Get rid of this.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        \"\"\"Removes an export for a logical volume\"\"\""},{"line_number":232,"context_line":"        LOG.debug(\"Work done in terminate connection\")"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":235,"context_line":"        \"\"\"attaching volume to host\"\"\""},{"line_number":236,"context_line":"        initiator \u003d connector[\"initiator\"]"},{"line_number":237,"context_line":"        host_name \u003d \"ostack-\" + initiator[initiator.rfind(\":\") + 1:]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_252f718b","line":234,"updated":"2018-11-29 15:49:45.000000000","message":"It\u0027s possible this can be called multiple times for the same volume/host. I can\u0027t really tell, but make sure this handles that appropriately so subsequent calls don\u0027t fail and still return the right connection information.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        \"\"\"Removes an export for a logical volume\"\"\""},{"line_number":232,"context_line":"        LOG.debug(\"Work done in terminate connection\")"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":235,"context_line":"        \"\"\"attaching volume to host\"\"\""},{"line_number":236,"context_line":"        initiator \u003d connector[\"initiator\"]"},{"line_number":237,"context_line":"        host_name \u003d \"ostack-\" + initiator[initiator.rfind(\":\") + 1:]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_98b28705","line":234,"in_reply_to":"3f79a3b5_252f718b","updated":"2019-03-07 12:08:37.000000000","message":"yes, It do tells the right connection information","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        host_name \u003d \"ostack-\" + initiator[initiator.rfind(\":\") + 1:]"},{"line_number":238,"context_line":"        ip_addr \u003d connector[\"ip\"]"},{"line_number":239,"context_line":"        volume_name \u003d volume[\"name\"]"},{"line_number":240,"context_line":"        LOG.debug(ip_addr)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        # Get the volume from the system to verify that it still exists"},{"line_number":243,"context_line":"        name \u003d volume_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ea2148b4","line":240,"range":{"start_line":240,"start_character":17,"end_line":240,"end_character":26},"updated":"2018-11-29 15:49:45.000000000","message":"Either remove this or add a message to make this useful.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        try:"},{"line_number":253,"context_line":"            host_obj \u003d out._id"},{"line_number":254,"context_line":"        except BaseException:"},{"line_number":255,"context_line":"            LOG.debug(\"Host with specified iqn not found. Creating \\"},{"line_number":256,"context_line":"                             new host\")"},{"line_number":257,"context_line":"            out \u003d self.client.host_add(host_name, initiator)"},{"line_number":258,"context_line":"            host_obj \u003d out._id"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0a04c419","line":255,"range":{"start_line":255,"start_character":67,"end_line":255,"end_character":68},"updated":"2018-11-29 15:49:45.000000000","message":"Do not use \\ to span lines, especially in the middle of strings. Just close it with a \" on this line and open it on the next one. Or line break after the opening ( to have enough room to have it on one line.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            out \u003d self.client.host_add(host_name, initiator)"},{"line_number":258,"context_line":"            host_obj \u003d out._id"},{"line_number":259,"context_line":"            if host_obj is None:"},{"line_number":260,"context_line":"                exception_message \u003d _(\"Error: Failed to create \\"},{"line_number":261,"context_line":"                                      host entry in QuantaStor\")"},{"line_number":262,"context_line":"                raise exception.VolumeBackendAPIException("},{"line_number":263,"context_line":"                    data\u003dexception_message)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2a018009","line":260,"range":{"start_line":260,"start_character":63,"end_line":260,"end_character":64},"updated":"2018-11-29 15:49:45.000000000","message":"Same.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            LOG.warning(\"Warning: Unable to find volume\")"},{"line_number":295,"context_line":"            return"},{"line_number":296,"context_line":"        vol_id \u003d vol_info._id"},{"line_number":297,"context_line":"        initiator \u003d connector[\"initiator\"]"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # remove the acl assignment for the volume/host"},{"line_number":300,"context_line":"        self.client.storage_volume_dettach(vol_id, initiator)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_65524914","line":297,"range":{"start_line":297,"start_character":20,"end_line":297,"end_character":29},"updated":"2018-11-29 15:49:45.000000000","message":"connector may be None in the case of force detach. The driver needs to handle this and remove all connections if that is the case.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            LOG.warning(\"Warning: Unable to find volume\")"},{"line_number":295,"context_line":"            return"},{"line_number":296,"context_line":"        vol_id \u003d vol_info._id"},{"line_number":297,"context_line":"        initiator \u003d connector[\"initiator\"]"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # remove the acl assignment for the volume/host"},{"line_number":300,"context_line":"        self.client.storage_volume_dettach(vol_id, initiator)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_1d056410","line":297,"range":{"start_line":297,"start_character":20,"end_line":297,"end_character":29},"in_reply_to":"3f79a3b5_65524914","updated":"2019-03-07 12:08:37.000000000","message":"yes, we are removing all the host connections for that volume, in case of force detach","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # remove the acl assignment for the volume/host"},{"line_number":300,"context_line":"        self.client.storage_volume_dettach(vol_id, initiator)"},{"line_number":301,"context_line":"        return"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def _update_volume_stats(self):"},{"line_number":304,"context_line":"        stats \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0537d5de","line":301,"updated":"2018-11-29 15:49:45.000000000","message":"Remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                \"Error: Failed to get volume information\")"},{"line_number":340,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        if str(qs_size) !\u003d str(self.gb_to_b_size(new_size)):"},{"line_number":343,"context_line":"            exception_message \u003d _(\"Error: Failed to extend volume\")"},{"line_number":344,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0541150a","line":342,"range":{"start_line":342,"start_character":15,"end_line":342,"end_character":22},"updated":"2018-11-29 15:49:45.000000000","message":"Is out._size a string or integer? Seems like this could be improved to have both compared as integers or strings without extra conversion.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                \"Error: Failed to get volume information\")"},{"line_number":340,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        if str(qs_size) !\u003d str(self.gb_to_b_size(new_size)):"},{"line_number":343,"context_line":"            exception_message \u003d _(\"Error: Failed to extend volume\")"},{"line_number":344,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_a596219f","line":342,"range":{"start_line":342,"start_character":27,"end_line":342,"end_character":30},"updated":"2018-11-29 15:49:45.000000000","message":"This appears to be unnecessary since gb_to_b_size does it internally.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":344,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        LOG.debug(\"Volume was successfully extended to %s\", qs_size)"},{"line_number":347,"context_line":"        return"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @classmethod"},{"line_number":350,"context_line":"    def gb_to_b_size(cls, size_gb):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_056035d1","line":347,"updated":"2018-11-29 15:49:45.000000000","message":"remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def qs_vol_get(self, vol_name):"},{"line_number":360,"context_line":"        \"\"\"volume info\"\"\""},{"line_number":361,"context_line":"        LOG.debug(\"volume get\")"},{"line_number":362,"context_line":"        vol \u003d self.client.storage_volume_get(vol_name)"},{"line_number":363,"context_line":"        if vol._id is None:"},{"line_number":364,"context_line":"            exception_message \u003d _(\"Error: Failed to load volume information\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_a50061b2","line":361,"updated":"2018-11-29 15:49:45.000000000","message":"This doesn\u0027t seem like useful debug messaging.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                                                 attr)"},{"line_number":81,"context_line":"            sys_info \u003d self.qs_sys_get()"},{"line_number":82,"context_line":"            pool_info \u003d self.qs_pool_get()"},{"line_number":83,"context_line":"            LOG.debug(\"connected to Quantastor system \u003d%s\""},{"line_number":84,"context_line":"                      \"Found pool with ID \u003d%s\""},{"line_number":85,"context_line":"                      \" named %s\", sys_info._name, pool_info._id,"},{"line_number":86,"context_line":"                      pool_info._name)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_1925d3c2","line":83,"range":{"start_line":83,"start_character":57,"end_line":83,"end_character":58},"updated":"2019-03-08 04:21:52.000000000","message":"Missing trailing spaces.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def create_export(self, context, volume, connector):"},{"line_number":187,"context_line":"        \"\"\"Exports the volume\"\"\""},{"line_number":188,"context_line":"        self.initialize_connection(volume, connector)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def remove_export(self, context, volume):"},{"line_number":191,"context_line":"        \"\"\"Removes an export for a logical volume\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_991a237b","line":188,"updated":"2019-03-08 04:21:52.000000000","message":"create_export is a different operation than initialize_connection, and might not be needed for your type of storage.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        try:"},{"line_number":210,"context_line":"            host_obj \u003d out._id"},{"line_number":211,"context_line":"        except BaseException:"},{"line_number":212,"context_line":"            LOG.debug(\"Host with specified iqn not found. Creating\""},{"line_number":213,"context_line":"                      \"new host\")"},{"line_number":214,"context_line":"            out \u003d self.client.host_add(host_name, initiator)"},{"line_number":215,"context_line":"            host_obj \u003d out._id"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_b91d9f74","line":212,"range":{"start_line":212,"start_character":66,"end_line":212,"end_character":67},"updated":"2019-03-08 04:21:52.000000000","message":"Missing trailing space.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        except BaseException:"},{"line_number":212,"context_line":"            LOG.debug(\"Host with specified iqn not found. Creating\""},{"line_number":213,"context_line":"                      \"new host\")"},{"line_number":214,"context_line":"            out \u003d self.client.host_add(host_name, initiator)"},{"line_number":215,"context_line":"            host_obj \u003d out._id"},{"line_number":216,"context_line":"            if host_obj is None:"},{"line_number":217,"context_line":"                exception_message \u003d _(\"Error: Failed to create\""}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_5409e229","line":214,"updated":"2019-03-08 04:21:52.000000000","message":"This call can be made multiple times, so operations should be idempotent. I can\u0027t tell, but this needs to handle the case where host_add has already been called for a given host_name and initiator.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            out \u003d self.client.host_add(host_name, initiator)"},{"line_number":215,"context_line":"            host_obj \u003d out._id"},{"line_number":216,"context_line":"            if host_obj is None:"},{"line_number":217,"context_line":"                exception_message \u003d _(\"Error: Failed to create\""},{"line_number":218,"context_line":"                                      \"host entry in QuantaStor\")"},{"line_number":219,"context_line":"                raise exception.VolumeBackendAPIException("},{"line_number":220,"context_line":"                    data\u003dexception_message)"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_5914bb4e","line":217,"range":{"start_line":217,"start_character":62,"end_line":217,"end_character":63},"updated":"2019-03-08 04:21:52.000000000","message":"Missing trailing space.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f3cd4b44fed077ee9a218fa4545d8e8b1516e194","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                \"Error: Failed to assign volume to host\")"},{"line_number":225,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dexception_message)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        portal \u003d self.configuration.san_ip + \":3260\""},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        result \u003d {"},{"line_number":230,"context_line":"            \u0027driver_volume_type\u0027: \u0027iscsi\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"5fc1f717_bb02a908","line":227,"range":{"start_line":227,"start_character":43,"end_line":227,"end_character":52},"updated":"2019-04-15 18:10:12.000000000","message":"This will break if san_ip is an IPv6 address.","commit_id":"9c06accf8f2cec8ef3b53b5f34d282e4c1aa872d"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"65ef54098281a48b60fc9ffa48706e747aad83b9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            pool_info \u003d self.qs_pool_get()"},{"line_number":83,"context_line":"            LOG.debug(\"connected to Quantastor system \u003d%s \""},{"line_number":84,"context_line":"                      \"Found pool with ID \u003d%s\""},{"line_number":85,"context_line":"                      \" named %s\", sys_info._name, pool_info._id,"},{"line_number":86,"context_line":"                      pool_info._name)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        except processutils.ProcessExecutionError:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_a4ddf470","line":85,"range":{"start_line":85,"start_character":22,"end_line":85,"end_character":24},"updated":"2019-04-09 19:03:28.000000000","message":"For consistency, would be best to include trailing space at the end of the previous line. Though looking at this, all text should be able to fit on just the two lines.","commit_id":"5c6cccb2ad1a609fd73ebbf18fca648063871294"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f3cd4b44fed077ee9a218fa4545d8e8b1516e194","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            for attr in required_config:"},{"line_number":78,"context_line":"                if not getattr(self.configuration, attr, None):"},{"line_number":79,"context_line":"                    raise exception.InvalidInput(reason\u003d_(\u0027%s is not set.\u0027) %"},{"line_number":80,"context_line":"                                                 attr)"},{"line_number":81,"context_line":"            sys_info \u003d self.qs_sys_get()"},{"line_number":82,"context_line":"            pool_info \u003d self.qs_pool_get()"},{"line_number":83,"context_line":"            LOG.debug(\"connected to Quantastor system \u003d%s Found pool with \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3fce034c_ba282686","line":80,"updated":"2019-04-15 18:10:12.000000000","message":"check_for_setup_error() is called after do_setup(), so presumably the QuantastorClient call at line 69 would have already failed w/ a bad login before this check ever detects anything.\n\nYou need to move this check into do_setup() before the call out to the client, I think.","commit_id":"d176e21312b229a65f834a2f35d2e851316d5058"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"7e0d554a0b0ebb5ef276fcb598fef7469febe63f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        for attr in required_config:"},{"line_number":65,"context_line":"            if not getattr(self.configuration, attr, None):"},{"line_number":66,"context_line":"                raise exception.InvalidInput(reason\u003d_(\u0027%s is not set.\u0027) %"},{"line_number":67,"context_line":"                                                    attr)"},{"line_number":68,"context_line":"        module \u003d {"},{"line_number":69,"context_line":"            \u0027params\u0027: {"},{"line_number":70,"context_line":"                \u0027qs_hostname\u0027: self.configuration.san_ip,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fce034c_9392e94a","line":67,"range":{"start_line":67,"start_character":45,"end_line":67,"end_character":52},"updated":"2019-04-16 11:10:20.000000000","message":"remove these spaces.\nattr should be written just below the opening bracket\n\nraise exception.InvalidInput(reason\u003d_(\u0027%s is not set.\u0027) %\n                             attr)","commit_id":"b304d91b66973eb0297a9eceff00fe6d10d59565"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"ea248296a8234017c64c426ae4d54b499a0e74f8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from cinder.i18n import _"},{"line_number":23,"context_line":"from cinder import interface"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from cinder.volume.drivers import quantastor_api"},{"line_number":26,"context_line":"from cinder.volume.drivers.san import san"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_7e9f55b4","line":25,"updated":"2019-05-02 21:33:06.000000000","message":"This file should not in the main driver/volume/drivers directory.","commit_id":"f1e75cfeee6f46d3a18191919a273151bf60e2e9"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"ea248296a8234017c64c426ae4d54b499a0e74f8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\"dot.notation access to dictionary attributes\"\"\""},{"line_number":42,"context_line":"    __getattr__ \u003d dict.__getitem__"},{"line_number":43,"context_line":"    __setattr__ \u003d dict.__setitem__"},{"line_number":44,"context_line":"    __delattr__ \u003d dict.__delitem__"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"@interface.volumedriver"}],"source_content_type":"text/x-python","patch_set":20,"id":"dfbec78f_5e9a91c5","line":44,"updated":"2019-05-02 21:33:06.000000000","message":"I don\u0027t see the need for this magic class.","commit_id":"f1e75cfeee6f46d3a18191919a273151bf60e2e9"}],"cinder/volume/drivers/quantastor_api.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (c) 2018, OSNEXUS Corporation (eng@osnexus.com)"},{"line_number":2,"context_line":"# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import json"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_89b469d5","line":1,"updated":"2018-11-13 10:25:41.000000000","message":"apache license header missing","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (c) 2018, OSNEXUS Corporation (eng@osnexus.com)"},{"line_number":2,"context_line":"# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import json"},{"line_number":5,"context_line":"import time"},{"line_number":6,"context_line":"from os import environ"},{"line_number":7,"context_line":"import requests"},{"line_number":8,"context_line":"import eventlet"},{"line_number":9,"context_line":"from requests.auth import HTTPBasicAuth"},{"line_number":10,"context_line":"import urllib3"},{"line_number":11,"context_line":"from oslo_log import log as logging"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_a9a3659c","line":11,"range":{"start_line":4,"start_character":0,"end_line":11,"end_character":35},"updated":"2018-11-13 10:25:41.000000000","message":"refer to import guide on previous file","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"def quantastor_sdk_enabled():"},{"line_number":18,"context_line":"    return True"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_29a99577","line":16,"updated":"2018-11-13 10:25:41.000000000","message":"2 blank lines required","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        r \u003d requests.get(strURL,  params\u003dpayload, verify\u003dFalse, auth\u003dself._auth)"},{"line_number":56,"context_line":"        print(\"**qstor**\" + r.url)"},{"line_number":57,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":58,"context_line":"            raise Exception(\"Failed to make a request \u0027\" + api + \"\u0027 payload \u0027\" + str(payload) + \"\u0027 status code \u003d \" + str(r.status_code))"},{"line_number":59,"context_line":"        jsonOutput \u003d r.json()"},{"line_number":60,"context_line":"        if isinstance(jsonOutput, dict) and jsonOutput.has_key(\"RestError\") \u003d\u003d True:"},{"line_number":61,"context_line":"            raise Exception(\"Failed to make a request \u0027\" + api + \"\u0027 payload \u0027\" + str(payload) + \"\u0027 RestError \u003d \" + jsonOutput[\u0027RestError\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_89d9c928","line":58,"range":{"start_line":58,"start_character":12,"end_line":58,"end_character":136},"updated":"2018-11-13 10:25:41.000000000","message":"line shouldn\u0027t exceed 79 characters","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"15a2ccf39f23299246569633ed2a8dac2441e4a4","unresolved":false,"context_lines":[{"line_number":313,"context_line":"                    return self.storage_volume_parse(jsonOutput)"},{"line_number":314,"context_line":"        except:"},{"line_number":315,"context_line":"           pass"},{"line_number":316,"context_line":"        return None"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    #Storage Volume ACL assignement management APIs"},{"line_number":319,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_497f31de","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":19},"updated":"2018-11-13 10:25:41.000000000","message":"the default return value is None in python, i think this can be removed","commit_id":"717a452158b60c0eef7765b66209cd3491cabb9a"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import eventlet"},{"line_number":20,"context_line":"import requests"},{"line_number":21,"context_line":"from requests.auth import HTTPBasicAuth"},{"line_number":22,"context_line":"import urllib3"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0518351e","line":21,"updated":"2018-11-29 15:49:45.000000000","message":"Import modules, not classes.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from requests.auth import HTTPBasicAuth"},{"line_number":22,"context_line":"import urllib3"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def quantastor_sdk_enabled():"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_a5ce218c","line":24,"updated":"2018-11-29 15:49:45.000000000","message":"This should not be necessary. See https://review.openstack.org/#/c/267870/5/cinder/volume/manager.py","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from requests.auth import HTTPBasicAuth"},{"line_number":22,"context_line":"import urllib3"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def quantastor_sdk_enabled():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_9d5f140e","line":24,"in_reply_to":"3f79a3b5_a5ce218c","updated":"2019-03-07 12:08:37.000000000","message":"yes, this has been removed now and setting suppress_requests_ssl_warnings(default \u003d True)","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def quantastor_sdk_enabled():"},{"line_number":28,"context_line":"    \"\"\"returns true\"\"\""},{"line_number":29,"context_line":"    return True"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def quantastor_argument_spec():"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_05dd953f","line":29,"updated":"2018-11-29 15:49:45.000000000","message":"Why is this needed?","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        qs_password \u003d module.params[\u0027quantastor_password\u0027]"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if environ.get(\u0027QS_HOSTNAME\u0027):"},{"line_number":60,"context_line":"            qs_hostname \u003d environ.get(\u0027QS_HOSTNAME\u0027)"},{"line_number":61,"context_line":"        if environ.get(\u0027QS_USERNAME\u0027):"},{"line_number":62,"context_line":"            qs_username \u003d environ.get(\u0027QS_USERNAME\u0027)"},{"line_number":63,"context_line":"        if environ.get(\u0027QS_PASSWORD\u0027):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_c5bf9dc9","line":60,"updated":"2018-11-29 15:49:45.000000000","message":"Shouldn\u0027t these values be read from the config options in cinder.conf? If not, it\u0027s not clear what is being done here.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        \"\"\"makes http request\"\"\""},{"line_number":71,"context_line":"        str_url \u003d self._base_url + api"},{"line_number":72,"context_line":"        r \u003d requests.get(str_url, params\u003dpayload,"},{"line_number":73,"context_line":"                         verify\u003dFalse, auth\u003dself._auth)"},{"line_number":74,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":75,"context_line":"            raise Exception(\"Failed to make a request \u0027\" + api +"},{"line_number":76,"context_line":"                            \"\u0027 payload \u0027\" + str(payload) +"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_2571b147","line":73,"range":{"start_line":73,"start_character":25,"end_line":73,"end_character":37},"updated":"2018-11-29 15:49:45.000000000","message":"Is there no way to configure this?","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        r \u003d requests.get(str_url, params\u003dpayload,"},{"line_number":73,"context_line":"                         verify\u003dFalse, auth\u003dself._auth)"},{"line_number":74,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":75,"context_line":"            raise Exception(\"Failed to make a request \u0027\" + api +"},{"line_number":76,"context_line":"                            \"\u0027 payload \u0027\" + str(payload) +"},{"line_number":77,"context_line":"                            \"\u0027 status code \u003d \" + str(r.status_code))"},{"line_number":78,"context_line":"        json_output \u003d r.json()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_458f0d21","line":75,"range":{"start_line":75,"start_character":18,"end_line":75,"end_character":27},"updated":"2018-11-29 15:49:45.000000000","message":"Something more specific should be raised than Exception.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                         verify\u003dFalse, auth\u003dself._auth)"},{"line_number":74,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":75,"context_line":"            raise Exception(\"Failed to make a request \u0027\" + api +"},{"line_number":76,"context_line":"                            \"\u0027 payload \u0027\" + str(payload) +"},{"line_number":77,"context_line":"                            \"\u0027 status code \u003d \" + str(r.status_code))"},{"line_number":78,"context_line":"        json_output \u003d r.json()"},{"line_number":79,"context_line":"        if isinstance(json_output, dict) and \"RestError\" in json_output:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_c56d5d69","line":76,"range":{"start_line":76,"start_character":43,"end_line":76,"end_character":47},"updated":"2018-11-29 15:49:45.000000000","message":"Use string formatting to avoid all this concatenation and conversion.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def wait_on_task(self, json_output):"},{"line_number":86,"context_line":"        \"\"\"waits for the task\"\"\""},{"line_number":87,"context_line":"        if \u0027task\u0027 not in json_output.keys():"},{"line_number":88,"context_line":"            raise Exception(\"Task object not found in jsonOutput\", )"},{"line_number":89,"context_line":"        task \u003d json_output[\"task\"]"},{"line_number":90,"context_line":"        task_id \u003d str(task[\"id\"])"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_e56ad94e","line":88,"range":{"start_line":88,"start_character":65,"end_line":88,"end_character":67},"updated":"2018-11-29 15:49:45.000000000","message":"Remove","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                    json_output[\"description\"] + \")\u0027\")"},{"line_number":109,"context_line":"            if i \u003d\u003d 10:"},{"line_number":110,"context_line":"                break"},{"line_number":111,"context_line":"            time.sleep(i * 2)"},{"line_number":112,"context_line":"        raise Exception(\"Task \u0027\" + task_id + \"\u0027 did not complete.\u0027\")"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Helper methods"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_85ae8581","line":111,"range":{"start_line":111,"start_character":12,"end_line":111,"end_character":29},"updated":"2018-11-29 15:49:45.000000000","message":"Make sure this is mocked in unit tests. Or better yet, use the retry decorator.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        raise Exception(\"Task \u0027\" + task_id + \"\u0027 did not complete.\u0027\")"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Helper methods"},{"line_number":115,"context_line":"    def size_in_bytes(self, size):"},{"line_number":116,"context_line":"        multiplier \u003d 1"},{"line_number":117,"context_line":"        if \u0027KiB\u0027 in size:"},{"line_number":118,"context_line":"            multiplier \u003d 1024"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_05c27537","line":115,"updated":"2018-11-29 15:49:45.000000000","message":"This is duplicated from other existing methods.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                   \u0027hostType\u0027: 3, \u0027flags\u0027: 1}"},{"line_number":166,"context_line":"        json_output \u003d self.make_call(\"hostAdd\", payload)"},{"line_number":167,"context_line":"        eventlet.sleep(2)"},{"line_number":168,"context_line":"        if json_output and json_output[\u0027task\u0027] and \\"},{"line_number":169,"context_line":"                \u0027id\u0027 in json_output[\u0027task\u0027].keys():"},{"line_number":170,"context_line":"            self.wait_on_task(json_output)"},{"line_number":171,"context_line":"        return self.host_get(hostname)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_202f5f8b","line":168,"range":{"start_line":168,"start_character":51,"end_line":168,"end_character":52},"updated":"2018-11-29 15:49:45.000000000","message":"Wrap conditions in () to span lines instead of using \\","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import requests"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def retry(ExceptionToCheck, tries\u003d6, delay\u003d3, backoff\u003d2):"},{"line_number":24,"context_line":"    def deco_retry(f):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        @wraps(f)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_f5a66cab","line":23,"updated":"2019-01-29 13:17:43.000000000","message":"Please use the existing utils.retry decorator.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import requests"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def retry(ExceptionToCheck, tries\u003d6, delay\u003d3, backoff\u003d2):"},{"line_number":24,"context_line":"    def deco_retry(f):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        @wraps(f)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_9dbb940d","line":23,"in_reply_to":"9fdfeff1_f5a66cab","updated":"2019-03-07 12:08:37.000000000","message":"yes, using","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        r \u003d requests.get(str_url, params\u003dpayload,"},{"line_number":63,"context_line":"                         verify\u003dFalse, auth\u003dself._auth)"},{"line_number":64,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":65,"context_line":"            raise Exception(\"Failed to make a request \u0027%s\u0027 payload \u0027%s\u0027 \""},{"line_number":66,"context_line":"                            \"status code %d\" %"},{"line_number":67,"context_line":"                            (api, str(payload), r.status_code))"},{"line_number":68,"context_line":"        json_output \u003d r.json()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_d5c24834","line":65,"updated":"2019-01-29 13:17:43.000000000","message":"Something more specific than Exception should be raised.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":65,"context_line":"            raise Exception(\"Failed to make a request \u0027%s\u0027 payload \u0027%s\u0027 \""},{"line_number":66,"context_line":"                            \"status code %d\" %"},{"line_number":67,"context_line":"                            (api, str(payload), r.status_code))"},{"line_number":68,"context_line":"        json_output \u003d r.json()"},{"line_number":69,"context_line":"        if isinstance(json_output, dict) and \"RestError\" in json_output:"},{"line_number":70,"context_line":"            raise Exception(\"Failed to make a request \u0027%s\u0027 payload \u0027%s\u0027\""}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_75b4bcd1","line":67,"range":{"start_line":67,"start_character":34,"end_line":67,"end_character":38},"updated":"2019-01-29 13:17:43.000000000","message":"You are already formatting into a string (%s) so this is redundant to call str() on the value.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                   \u0027provisionableId\u0027: provisionable_id,"},{"line_number":269,"context_line":"                   \u0027newSizeInBytes\u0027: size}"},{"line_number":270,"context_line":"        json_output \u003d self.make_call(\u0027storageVolumeResize\u0027, payload)"},{"line_number":271,"context_line":"        eventlet.sleep(2)"},{"line_number":272,"context_line":"        custom_id \u003d self.wait_on_task(json_output)"},{"line_number":273,"context_line":"        return self.storage_volume_get(custom_id)"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_b5e304d9","line":271,"range":{"start_line":271,"start_character":8,"end_line":271,"end_character":25},"updated":"2019-01-29 13:17:43.000000000","message":"Is this really needed? I didn\u0027t check, but make sure any unit tests that cover this path mock this out so the tests do not take an artificially long time.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":29499,"name":"Yachika_Ralhan","email":"eng.openstack.codereview@osnexus.com","username":"yachika_ralhan"},"change_message_id":"dc77101acd1d795cb272cdcac14a1855b756d0b9","unresolved":false,"context_lines":[{"line_number":268,"context_line":"                   \u0027provisionableId\u0027: provisionable_id,"},{"line_number":269,"context_line":"                   \u0027newSizeInBytes\u0027: size}"},{"line_number":270,"context_line":"        json_output \u003d self.make_call(\u0027storageVolumeResize\u0027, payload)"},{"line_number":271,"context_line":"        eventlet.sleep(2)"},{"line_number":272,"context_line":"        custom_id \u003d self.wait_on_task(json_output)"},{"line_number":273,"context_line":"        return self.storage_volume_get(custom_id)"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_3d84e8d2","line":271,"range":{"start_line":271,"start_character":8,"end_line":271,"end_character":25},"in_reply_to":"9fdfeff1_b5e304d9","updated":"2019-03-07 12:08:37.000000000","message":"yes,this is needed and unit tests cases are not taking long time","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":284,"context_line":"        try:"},{"line_number":285,"context_line":"            json_output \u003d self.make_call(\"storageVolumeGet\", payload)"},{"line_number":286,"context_line":"            if json_output:"},{"line_number":287,"context_line":"                if \u0027obj\u0027 in json_output.keys() and \\"},{"line_number":288,"context_line":"                        \u0027id\u0027 in json_output[\u0027obj\u0027].keys():"},{"line_number":289,"context_line":"                    obj \u003d json_output[\u0027obj\u0027]"},{"line_number":290,"context_line":"                    return self.storage_volume_parse(obj)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_15d21001","line":287,"range":{"start_line":287,"start_character":51,"end_line":287,"end_character":52},"updated":"2019-01-29 13:17:43.000000000","message":"Please don\u0027t use \\ to span multiple lines. Wrap the conditionals in () if you need to.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        r \u003d requests.get(str_url, params\u003dpayload,"},{"line_number":48,"context_line":"                         verify\u003dself.verify, auth\u003dself._auth)"},{"line_number":49,"context_line":"        if r.status_code !\u003d 200:"},{"line_number":50,"context_line":"            msg \u003d _(\"Failed to make a request\""},{"line_number":51,"context_line":"                    \"%(api)s : %(payload)s : %(code)s\") % {"},{"line_number":52,"context_line":"                \u0027api\u0027: api,"},{"line_number":53,"context_line":"                \u0027payload\u0027: payload,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_7425feaa","line":50,"updated":"2019-03-08 04:21:52.000000000","message":"Missing trailing space.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        json_output \u003d r.json()"},{"line_number":58,"context_line":"        if isinstance(json_output, dict) and \"RestError\" in json_output:"},{"line_number":59,"context_line":"            msg \u003d _(\"Failed to execute api\""},{"line_number":60,"context_line":"                    \"%(api)s : %(payload)s : %(code)s\") % {"},{"line_number":61,"context_line":"                \u0027api\u0027: api,"},{"line_number":62,"context_line":"                \u0027payload\u0027: payload,"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_343776e6","line":59,"updated":"2019-03-08 04:21:52.000000000","message":"Missing trailing space.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        return json_output"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @utils.retry(QuantastorAPIException, 2, 3)"},{"line_number":69,"context_line":"    def wait_on_task(self, json_output):"},{"line_number":70,"context_line":"        \"\"\"waits for the task\"\"\""},{"line_number":71,"context_line":"        if \u0027task\u0027 not in json_output.keys():"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_5457a203","line":68,"range":{"start_line":68,"start_character":41,"end_line":68,"end_character":45},"updated":"2019-03-08 04:21:52.000000000","message":"These are kwargs, so this should give the assignment for which parameter they are intended for.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                if task_state \u003d\u003d 5:  # OSN_TASKSTATE_COMPLETED"},{"line_number":84,"context_line":"                    return json_output[\"customId\"]"},{"line_number":85,"context_line":"                elif task_state \u003d\u003d 4:  # OSN_TASKSTATE_CANCELLED"},{"line_number":86,"context_line":"                    msg \u003d _(\"ERROR: Task %(task_id)d cancelled\""},{"line_number":87,"context_line":"                            \"at state : %(json_output)s\") % {"},{"line_number":88,"context_line":"                        \u0027task_id\u0027: task_id,"},{"line_number":89,"context_line":"                        \u0027json_output\u0027: json_output[\"description\"]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_745ade2a","line":86,"updated":"2019-03-08 04:21:52.000000000","message":"Trailing space needed.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                    raise QuantastorAPIException(msg)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"                elif task_state \u003d\u003d 3:  # OSN_TASKSTATE_FAILED"},{"line_number":93,"context_line":"                    msg \u003d _(\"ERROR: Task %(task_id)d failed\""},{"line_number":94,"context_line":"                            \"with error : %(json_output)s\") % {"},{"line_number":95,"context_line":"                        \u0027task_id\u0027: task_id,"},{"line_number":96,"context_line":"                        \u0027json_output\u0027: json_output[\"description\"]}"}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_d44ab253","line":93,"updated":"2019-03-08 04:21:52.000000000","message":"Trailing space needed.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        if \u0027name\u0027 in json_output.keys() and \u0027id\u0027 in json_output.keys():"},{"line_number":107,"context_line":"            system \u003d StorageSystem(json_output[\"name\"], json_output[\"id\"])"},{"line_number":108,"context_line":"            return system"},{"line_number":109,"context_line":"        raise Exception(\"Failed to gather QuantaStor storage system\""},{"line_number":110,"context_line":"                        \"information for system with ID \u0027%d\u0027.\""},{"line_number":111,"context_line":"                        % json_output.id)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5fc1f717_f4456e44","line":109,"updated":"2019-03-08 04:21:52.000000000","message":"Trailing space needed.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"65ef54098281a48b60fc9ffa48706e747aad83b9","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        json_output \u003d r.json()"},{"line_number":58,"context_line":"        if isinstance(json_output, dict) and \"RestError\" in json_output:"},{"line_number":59,"context_line":"            msg \u003d _(\"Failed to execute api\""},{"line_number":60,"context_line":"                    \"%(api)s : %(payload)s : %(code)s\") % {"},{"line_number":61,"context_line":"                \u0027api\u0027: api,"},{"line_number":62,"context_line":"                \u0027payload\u0027: payload,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5fc1f717_c4460022","line":59,"range":{"start_line":59,"start_character":42,"end_line":59,"end_character":43},"updated":"2019-04-09 19:03:28.000000000","message":"Missing trailing space.","commit_id":"5c6cccb2ad1a609fd73ebbf18fca648063871294"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"596db9d451642d5f5e621c6b8550408cf50541e1","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def __init__(self, module, verify):"},{"line_number":36,"context_line":"        self._module \u003d module"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        qs_hostname \u003d self.build_tgt_ip(module.params[\u0027qs_hostname\u0027])"},{"line_number":39,"context_line":"        qs_username \u003d module.params[\u0027qs_username\u0027]"},{"line_number":40,"context_line":"        qs_password \u003d module.params[\u0027qs_password\u0027]"},{"line_number":41,"context_line":"        self.verify \u003d verify"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fce034c_e2d6eec3","line":38,"updated":"2019-04-16 19:36:58.000000000","message":"Are DNS hostnames not supported for some reason?","commit_id":"e22aa17e2554722822efad94597938abcdf0ee06"},{"author":{"_account_id":29484,"name":"Ashish Koushik","email":"ashish.koushik@msystechnologies.com","username":"ms-ashishnk"},"change_message_id":"0dd32cf3ca3e7563993d04462019c12540a37703","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def __init__(self, module, verify):"},{"line_number":36,"context_line":"        self._module \u003d module"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        qs_hostname \u003d self.build_tgt_ip(module.params[\u0027qs_hostname\u0027])"},{"line_number":39,"context_line":"        qs_username \u003d module.params[\u0027qs_username\u0027]"},{"line_number":40,"context_line":"        qs_password \u003d module.params[\u0027qs_password\u0027]"},{"line_number":41,"context_line":"        self.verify \u003d verify"}],"source_content_type":"text/x-python","patch_set":15,"id":"3fce034c_de41460d","line":38,"in_reply_to":"3fce034c_e2d6eec3","updated":"2019-04-17 02:20:29.000000000","message":"They are, but In the interest of the future scope, it was a design decision to stick with IP address as HA pools and san_ip_api is planned for next phase.","commit_id":"e22aa17e2554722822efad94597938abcdf0ee06"}],"doc/source/configuration/block-storage/drivers/quantastor-volume-driver.rst":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":9,"context_line":"QuantaStor\u0027s Cinder driver provides iSCSI block storage to OpenStack managed"},{"line_number":10,"context_line":"virtual machines."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"QuantaStor\u0027s Cinder driver is compatible with"},{"line_number":13,"context_line":"OpenStack\u0027s latest maintained version i.e. Rocky"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Supported operations"},{"line_number":16,"context_line":"~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_8043d346","line":13,"range":{"start_line":12,"start_character":0,"end_line":13,"end_character":48},"updated":"2018-11-29 15:49:45.000000000","message":"This should be removed.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":".. note::"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"   Single back-end configuration users do not need to create the volume type."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":".. code-block:: console"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_806c33d3","line":68,"updated":"2018-11-29 15:49:45.000000000","message":"Whether to create volume types or not is not necessarily tied to multiple backend ocnfigurations. I think this note should be removed.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":65,"context_line":"   $ openstack volume type create QuantaStor_VOLUME_TYPE"},{"line_number":66,"context_line":"   $ openstack volume type set --property volume_backend_name\u003dQuantaStor_BACKEND_NAME QuantaStor_VOLUME_TYPE"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"  .. note::"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"     Restart the ``cinder-api``, ``cinder-scheduler``, and ``cinder-volume``"},{"line_number":71,"context_line":"     services after updating the ``cinder.conf`` file."}],"source_content_type":"text/x-rst","patch_set":9,"id":"5fc1f717_547002a6","line":68,"updated":"2019-03-08 04:21:52.000000000","message":"This line should not be indented.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"}],"doc/source/reference/support-matrix.ini":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"ba6cf1cec6233e8a304cfa65c954a2fd1a8ba45a","unresolved":false,"context_lines":[{"line_number":604,"context_line":"driver.prophetstor\u003dcomplete"},{"line_number":605,"context_line":"driver.pure\u003dcomplete"},{"line_number":606,"context_line":"driver.qnap\u003dmissing"},{"line_number":607,"context_line":"driver.quantastor\u003dcomplete"},{"line_number":608,"context_line":"driver.quobyte\u003dmissing"},{"line_number":609,"context_line":"driver.rbd\u003dmissing"},{"line_number":610,"context_line":"driver.sheepdog\u003dmissing"}],"source_content_type":"text/x-properties","patch_set":24,"id":"bfb3d3c7_7aa3d750","line":607,"range":{"start_line":607,"start_character":18,"end_line":607,"end_character":26},"updated":"2019-05-17 15:44:59.000000000","message":"Is this right?  I didn\u0027t see any code for handling CGs.","commit_id":"906435b09b5aa7ea4dfc4b02fd1626a5342bbc50"}],"releasenotes/notes/Quantastor-driver-a358dfed506f83b1.yaml":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"dd87487a460d99118b2b937ceaacb4811efc962c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"    This is the first release of OSNexus Quantastor iscsi Cinder Driver."},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"features:"},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3f79a3b5_60a0f7f3","line":4,"range":{"start_line":2,"start_character":0,"end_line":4,"end_character":54},"updated":"2018-11-29 15:49:45.000000000","message":"This is not correct, remove the prelude section. This should be under the features section and just state something like:\n\nDriver added for OSNexus Quantastore iSCSI storage.","commit_id":"069edf340bfb4ac98b15ca30e50f7aa23e54b49c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"19aad142d17bf427f5f2a3b9e3617373818ea1d8","unresolved":false,"context_lines":[{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"    Driver added for OSNexus Quantastor iSCSI storage"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    Features the driver supports are-"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Volume Attach/Detach to Instances"},{"line_number":9,"context_line":"    Snapshot Create/Delete"},{"line_number":10,"context_line":"    Create Volume from Snapshot"},{"line_number":11,"context_line":"    Get Volume Stats"},{"line_number":12,"context_line":"    Copy Image to Volume"},{"line_number":13,"context_line":"    Copy Volume to Image"},{"line_number":14,"context_line":"    Clone Volume"},{"line_number":15,"context_line":"    Extend Volume"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":7,"id":"9fdfeff1_55fdf86b","line":15,"range":{"start_line":6,"start_character":0,"end_line":15,"end_character":17},"updated":"2019-01-29 13:17:43.000000000","message":"All of this can be removed.","commit_id":"d41960ee8879b50d00a2ec963fc248d1bbcb87ed"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"    Driver added for OSNexus Quantastor iSCSI storage"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"5fc1f717_7473beb2","line":2,"updated":"2019-03-08 04:21:52.000000000","message":"Remove extra blank line.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"52c4e5ad49b5de31068bde90ea497ecbcc0e52a5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"features:"},{"line_number":4,"context_line":"    Driver added for OSNexus Quantastor iSCSI storage"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"5fc1f717_146a7ab2","line":4,"updated":"2019-03-08 04:21:52.000000000","message":"Nit: End the sentence with a period to be consistent with other notes.","commit_id":"f984eb6698be34018885c306afe0f40a87f674dc"}]}
