)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"b9286e5ddf932ea6d1d93cb0b1c56967436a96a7","unresolved":false,"context_lines":[{"line_number":11,"context_line":"protocol is FibreChannel. The new driver includes the minimum"},{"line_number":12,"context_line":"set of features required by Mitaka release plus a few more"},{"line_number":13,"context_line":"such as manage/unmanage, consistency groups, and retype."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint netapp-flashray-driver"},{"line_number":16,"context_line":"Change-Id: Ie424fba7b5d08f9918745b082b31686d9eed4a41"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5a710552_e62744c8","line":14,"updated":"2015-12-16 16:54:58.000000000","message":"DocImpact tag should be included here.","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"protocol is FibreChannel. The new driver includes the minimum"},{"line_number":12,"context_line":"set of features required by Mitaka release plus a few more"},{"line_number":13,"context_line":"such as manage/unmanage, consistency groups, and retype."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint netapp-flashray-driver"},{"line_number":16,"context_line":"Change-Id: Ie424fba7b5d08f9918745b082b31686d9eed4a41"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a7e1126_98a9e892","line":14,"in_reply_to":"5a710552_e62744c8","updated":"2015-12-18 21:02:31.000000000","message":"Done","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"}],"cinder/tests/unit/volume/drivers/netapp/mars/test_api.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.client._init_session()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        self.assertEqual(self.client.session_token, fake.TOKEN)"},{"line_number":135,"context_line":"        self.assertGreater(self.client.session_expiration_time, self._now())"},{"line_number":136,"context_line":"        self.assertEqual(1, mock_update_session_expiration_time.call_count)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_1715779a","line":134,"updated":"2015-12-09 01:37:11.000000000","message":"Please swap args.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        self.client._init_session()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        self.assertEqual(self.client.session_token, fake.TOKEN)"},{"line_number":135,"context_line":"        self.assertGreater(self.client.session_expiration_time, self._now())"},{"line_number":136,"context_line":"        self.assertEqual(1, mock_update_session_expiration_time.call_count)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_59641be4","line":134,"in_reply_to":"7a740942_1715779a","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":505,"context_line":"            headers\u003d{\u0027x-webmapi-version\u0027: \u00272.0\u0027},"},{"line_number":506,"context_line":"            data\u003d\u0027{\"username\": \"user\", \"password\": \"cGFzc3dvcmQ\u003d\"}\u0027,"},{"line_number":507,"context_line":"            timeout\u003d10)"},{"line_number":508,"context_line":"        self.assertEqual(result[\u0027result\u0027], fake.TOKEN)"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def test_get_session_token_no_data(self):"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d70a8f78","line":508,"updated":"2015-12-09 01:37:11.000000000","message":"Same.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":505,"context_line":"            headers\u003d{\u0027x-webmapi-version\u0027: \u00272.0\u0027},"},{"line_number":506,"context_line":"            data\u003d\u0027{\"username\": \"user\", \"password\": \"cGFzc3dvcmQ\u003d\"}\u0027,"},{"line_number":507,"context_line":"            timeout\u003d10)"},{"line_number":508,"context_line":"        self.assertEqual(result[\u0027result\u0027], fake.TOKEN)"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def test_get_session_token_no_data(self):"},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d99ecbb7","line":508,"in_reply_to":"7a740942_d70a8f78","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"}],"cinder/tests/unit/volume/drivers/netapp/mars/test_library.py":[{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cinder.volume.drivers.netapp.mars import api"},{"line_number":31,"context_line":"from cinder.volume.drivers.netapp.mars import client"},{"line_number":32,"context_line":"from cinder.volume.drivers.netapp.mars import library"},{"line_number":33,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":34,"context_line":"    NetAppMarsBlockStorageLibrary as mars_lib"},{"line_number":35,"context_line":"from cinder.zonemanager import utils as fczm_utils"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_5322ba02","line":33,"updated":"2015-12-10 20:59:59.000000000","message":"nit, you should import the module not the class","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":30,"context_line":"from cinder.volume.drivers.netapp.mars import api"},{"line_number":31,"context_line":"from cinder.volume.drivers.netapp.mars import client"},{"line_number":32,"context_line":"from cinder.volume.drivers.netapp.mars import library"},{"line_number":33,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":34,"context_line":"    NetAppMarsBlockStorageLibrary as mars_lib"},{"line_number":35,"context_line":"from cinder.zonemanager import utils as fczm_utils"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d92fab3c","line":33,"in_reply_to":"7a740942_5322ba02","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"}],"cinder/volume/drivers/netapp/common.py":[{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027fc\u0027: ESERIES_PATH + \u0027.fc_driver.NetAppEseriesFibreChannelDriver\u0027"},{"line_number":53,"context_line":"    },"},{"line_number":54,"context_line":"    \u0027mars\u0027: {"},{"line_number":55,"context_line":"        \u0027fc\u0027: MARS_PATH + \u0027.fc_driver.NetAppMarsFibreChannelDriver\u0027"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_13ee72b4","line":55,"updated":"2015-12-10 20:59:59.000000000","message":"same as below :P","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \u0027fc\u0027: ESERIES_PATH + \u0027.fc_driver.NetAppEseriesFibreChannelDriver\u0027"},{"line_number":53,"context_line":"    },"},{"line_number":54,"context_line":"    \u0027mars\u0027: {"},{"line_number":55,"context_line":"        \u0027fc\u0027: MARS_PATH + \u0027.fc_driver.NetAppMarsFibreChannelDriver\u0027"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_b9d3bf37","line":55,"in_reply_to":"7a740942_13ee72b4","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    },"},{"line_number":54,"context_line":"    \u0027mars\u0027: {"},{"line_number":55,"context_line":"        \u0027fc\u0027: MARS_PATH + \u0027.fc_driver.NetAppMarsFibreChannelDriver\u0027"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_9301026d","line":56,"updated":"2015-12-10 20:59:59.000000000","message":"If I wanted, I could ding you here, you need a \u0027,\u0027 at the end of the line","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    },"},{"line_number":54,"context_line":"    \u0027mars\u0027: {"},{"line_number":55,"context_line":"        \u0027fc\u0027: MARS_PATH + \u0027.fc_driver.NetAppMarsFibreChannelDriver\u0027"},{"line_number":56,"context_line":"    }"},{"line_number":57,"context_line":"}"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_99e043fc","line":56,"in_reply_to":"7a740942_9301026d","updated":"2015-12-14 15:59:27.000000000","message":"OK, I fixed all the wrapping issues \u0026 line endings in this dictionary.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"}],"cinder/volume/drivers/netapp/mars/api.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":48,"context_line":"CG_DELETE_CG_NOT_FOUND \u003d \u00274011\u0027"},{"line_number":49,"context_line":"LUN_MAP_LUN_ALREADY_MAPPED_TO_IGROUP \u003d \u002727007\u0027"},{"line_number":50,"context_line":"LUN_DESTROY_LUN_NOT_FOUND \u003d \u002727046\u0027"},{"line_number":51,"context_line":"SNAPSHOT_DELETE_OBJ_NOT_FOUND \u003d \u002742024\u0027"},{"line_number":52,"context_line":"SNAPSHOT_DELETE_SNAP_NOT_FOUND \u003d \u002742025\u0027"},{"line_number":53,"context_line":"SNAPSHOT_SHOW_SNAP_NOT_FOUND \u003d \u002742033\u0027"},{"line_number":54,"context_line":"SNAPSHOT_SHOW_OBJ_NOT_FOUND \u003d \u002742034\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_8be13e2c","line":51,"updated":"2015-12-09 03:30:18.000000000","message":"Can you add some comments about SNAPSHOT_DELETE_OBJ_NOT_FOUND?  I found it confusing.  In the code, sometimes it means volume not found and sometimes CG not found.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":48,"context_line":"CG_DELETE_CG_NOT_FOUND \u003d \u00274011\u0027"},{"line_number":49,"context_line":"LUN_MAP_LUN_ALREADY_MAPPED_TO_IGROUP \u003d \u002727007\u0027"},{"line_number":50,"context_line":"LUN_DESTROY_LUN_NOT_FOUND \u003d \u002727046\u0027"},{"line_number":51,"context_line":"SNAPSHOT_DELETE_OBJ_NOT_FOUND \u003d \u002742024\u0027"},{"line_number":52,"context_line":"SNAPSHOT_DELETE_SNAP_NOT_FOUND \u003d \u002742025\u0027"},{"line_number":53,"context_line":"SNAPSHOT_SHOW_SNAP_NOT_FOUND \u003d \u002742033\u0027"},{"line_number":54,"context_line":"SNAPSHOT_SHOW_OBJ_NOT_FOUND \u003d \u002742034\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_74aeb999","line":51,"in_reply_to":"7a740942_8be13e2c","updated":"2015-12-14 15:59:27.000000000","message":"No problem.  And it\u0027s similar to the one on line 54, so I added comments for each of the error codes in this section.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        self.session_token \u003d result.get(\u0027result\u0027, None)"},{"line_number":129,"context_line":"        if not self.session_token:"},{"line_number":130,"context_line":"            raise exception.NetAppDriverException(_(\"Failed to get token\"))"},{"line_number":131,"context_line":"        self.session_expiration_time \u003d timeutils.utcnow() + \\"},{"line_number":132,"context_line":"            datetime.timedelta(minutes\u003d5)"},{"line_number":133,"context_line":"        self._update_session_expiration_time()"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d7b4cf82","line":131,"updated":"2015-12-09 01:37:11.000000000","message":"Please wrap in () to avoid the use of \\.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        self.session_token \u003d result.get(\u0027result\u0027, None)"},{"line_number":129,"context_line":"        if not self.session_token:"},{"line_number":130,"context_line":"            raise exception.NetAppDriverException(_(\"Failed to get token\"))"},{"line_number":131,"context_line":"        self.session_expiration_time \u003d timeutils.utcnow() + \\"},{"line_number":132,"context_line":"            datetime.timedelta(minutes\u003d5)"},{"line_number":133,"context_line":"        self._update_session_expiration_time()"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_b9b65fda","line":131,"in_reply_to":"7a740942_d7b4cf82","updated":"2015-12-14 15:59:27.000000000","message":"Fixed here and on line 156.  No other avoidable occurrences appear in this patch.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        }"},{"line_number":187,"context_line":"        LOG.debug(\"Invoking REST with method: %(m)s, path: %(p)s,\""},{"line_number":188,"context_line":"                  \" data: %(d)s, timeout: %(t)s,\""},{"line_number":189,"context_line":"                  \" verify: %(v)s, kwargs: %(k)s.\" % params)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        url \u003d self._get_resource_url(path, **kwargs)"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_f76eabfe","line":189,"updated":"2015-12-09 01:37:11.000000000","message":"Switch % to , so the string is only formatted if at debug level.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        }"},{"line_number":187,"context_line":"        LOG.debug(\"Invoking REST with method: %(m)s, path: %(p)s,\""},{"line_number":188,"context_line":"                  \" data: %(d)s, timeout: %(t)s,\""},{"line_number":189,"context_line":"                  \" verify: %(v)s, kwargs: %(k)s.\" % params)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        url \u003d self._get_resource_url(path, **kwargs)"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_19d773ee","line":189,"in_reply_to":"7a740942_f76eabfe","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1e0880bde56407ed03239af13a61da12ec07051c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"SNAPSHOT_SHOW_OBJ_NOT_FOUND \u003d \u002742034\u0027"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class MarsWebMAPIError(Exception):"},{"line_number":65,"context_line":"    \"\"\"Base exception class for NetApp API errors.\"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, code\u003d\u0027unknown\u0027, message\u003d\u0027unknown\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_2b06b2ce","line":64,"updated":"2015-12-17 15:14:20.000000000","message":"Should it be moved to cinder.exception?","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"SNAPSHOT_SHOW_OBJ_NOT_FOUND \u003d \u002742034\u0027"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class MarsWebMAPIError(Exception):"},{"line_number":65,"context_line":"    \"\"\"Base exception class for NetApp API errors.\"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def __init__(self, code\u003d\u0027unknown\u0027, message\u003d\u0027unknown\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_6721374d","line":64,"in_reply_to":"3a7e1126_2b06b2ce","updated":"2015-12-18 21:02:31.000000000","message":"Honestly, I don\u0027t think so.  This exception is limited to this driver, so there is little benefit to moving to an unrelated place.  There are similar examples in other drivers:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/netapp/dataontap/client/api.py#L523\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/netapp/eseries/exception.py#L30\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/zfssa/restclient.py#L112","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1e0880bde56407ed03239af13a61da12ec07051c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def _init_webservice_version(self):"},{"line_number":107,"context_line":"        \"\"\"Get the API version.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.webservice_version \u003d None"},{"line_number":110,"context_line":"        result \u003d self._get_webmapi_versions(timeout\u003d10)"},{"line_number":111,"context_line":"        version \u003d result[\u0027result\u0027][\u0027x-webmapi-version\u0027]"},{"line_number":112,"context_line":"        self.webservice_version \u003d self._version_string_to_tuple(version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_0b865613","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":12},"updated":"2015-12-17 15:14:20.000000000","message":"You override this in the line #112, so this line is not needed","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    def _init_webservice_version(self):"},{"line_number":107,"context_line":"        \"\"\"Get the API version.\"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.webservice_version \u003d None"},{"line_number":110,"context_line":"        result \u003d self._get_webmapi_versions(timeout\u003d10)"},{"line_number":111,"context_line":"        version \u003d result[\u0027result\u0027][\u0027x-webmapi-version\u0027]"},{"line_number":112,"context_line":"        self.webservice_version \u003d self._version_string_to_tuple(version)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_078cf333","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":12},"in_reply_to":"3a7e1126_0b865613","updated":"2015-12-18 21:02:31.000000000","message":"Done, thanks.","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1e0880bde56407ed03239af13a61da12ec07051c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return False"},{"line_number":153,"context_line":"        if self.session_expiration_time \u003c\u003d timeutils.utcnow():"},{"line_number":154,"context_line":"            return False"},{"line_number":155,"context_line":"        return True"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _update_session_expiration_time(self):"},{"line_number":158,"context_line":"        \"\"\"Renew the session expiration time.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_2b323211","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":14},"updated":"2015-12-17 15:14:20.000000000","message":"This function could be simplified to:\nreturn all([self.session_token, self.session_expiration_time \u003c\u003d timeutils.utcnow()])","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            return False"},{"line_number":153,"context_line":"        if self.session_expiration_time \u003c\u003d timeutils.utcnow():"},{"line_number":154,"context_line":"            return False"},{"line_number":155,"context_line":"        return True"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _update_session_expiration_time(self):"},{"line_number":158,"context_line":"        \"\"\"Renew the session expiration time.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_07bab3c0","line":155,"range":{"start_line":155,"start_character":8,"end_line":155,"end_character":14},"in_reply_to":"3a7e1126_2b323211","updated":"2015-12-18 21:02:31.000000000","message":"That\u0027s not the same logic, but this works:\n\n        return all([self.session_token is not None,\n                   self.session_expiration_time \u003e timeutils.utcnow()])","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1e0880bde56407ed03239af13a61da12ec07051c","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self.session_expiration_time \u003d ("},{"line_number":164,"context_line":"                timeutils.utcnow() +"},{"line_number":165,"context_line":"                datetime.timedelta(seconds\u003dexpiration_seconds))"},{"line_number":166,"context_line":"        except Exception:"},{"line_number":167,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":168,"context_line":"                LOG.warning(_LW(\u0027Failed to get session expiration time.\u0027))"},{"line_number":169,"context_line":"                self._invalidate_token()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_cbfe0e38","line":166,"range":{"start_line":166,"start_character":15,"end_line":166,"end_character":24},"updated":"2015-12-17 15:14:20.000000000","message":"Can we catch more specific exception here?","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self.session_expiration_time \u003d ("},{"line_number":164,"context_line":"                timeutils.utcnow() +"},{"line_number":165,"context_line":"                datetime.timedelta(seconds\u003dexpiration_seconds))"},{"line_number":166,"context_line":"        except Exception:"},{"line_number":167,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":168,"context_line":"                LOG.warning(_LW(\u0027Failed to get session expiration time.\u0027))"},{"line_number":169,"context_line":"                self._invalidate_token()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_9533f161","line":166,"range":{"start_line":166,"start_character":15,"end_line":166,"end_character":24},"in_reply_to":"3a7e1126_cbfe0e38","updated":"2015-12-18 21:02:31.000000000","message":"Sure, after careful analysis this can be covered by 4 named exceptions.  Done.","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"}],"cinder/volume/drivers/netapp/mars/fc_driver.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from cinder.volume import driver"},{"line_number":20,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":21,"context_line":"    NetAppMarsBlockStorageLibrary as MarsLibrary"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_77295b9a","line":20,"updated":"2015-12-09 01:37:11.000000000","message":"Use () instead of \\.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from cinder.volume import driver"},{"line_number":20,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":21,"context_line":"    NetAppMarsBlockStorageLibrary as MarsLibrary"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_7326d669","line":20,"updated":"2015-12-10 20:59:59.000000000","message":"actually, import the module not the class. \n\nfrom cinder.volume.drivers.netapp.mars.library as mars_library\n\nthen do \n\nmars_library.NetAppMarsBlockStorageLibrary","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from cinder.volume import driver"},{"line_number":20,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":21,"context_line":"    NetAppMarsBlockStorageLibrary as MarsLibrary"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_b9bc1f6d","line":20,"in_reply_to":"7a740942_7326d669","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from cinder.volume import driver"},{"line_number":20,"context_line":"from cinder.volume.drivers.netapp.mars.library import \\"},{"line_number":21,"context_line":"    NetAppMarsBlockStorageLibrary as MarsLibrary"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d9bfab5e","line":20,"in_reply_to":"7a740942_77295b9a","updated":"2015-12-14 15:59:27.000000000","message":"Fixed using Alex\u0027s suggestion.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"1e0880bde56407ed03239af13a61da12ec07051c","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":36,"context_line":"        super(NetAppMarsFibreChannelDriver, self).__init__(*args, **kwargs)"},{"line_number":37,"context_line":"        self.library \u003d library.NetAppMarsBlockStorageLibrary("},{"line_number":38,"context_line":"            self.DRIVER_NAME, self.DRIVER_PROTOCOL, **kwargs)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_aecb9052","line":37,"updated":"2015-12-17 15:14:20.000000000","message":"Can we just add NetAppMarsBlockStorageLibrary to the parent classes?","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"68b7b234be6683b92bdd613498c659b5980abe5e","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":36,"context_line":"        super(NetAppMarsFibreChannelDriver, self).__init__(*args, **kwargs)"},{"line_number":37,"context_line":"        self.library \u003d library.NetAppMarsBlockStorageLibrary("},{"line_number":38,"context_line":"            self.DRIVER_NAME, self.DRIVER_PROTOCOL, **kwargs)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a7e1126_f5511537","line":37,"in_reply_to":"3a7e1126_aecb9052","updated":"2015-12-18 21:02:31.000000000","message":"This driver fits the same pattern that many vendor\u0027s Cinder drivers do:  interface shim --\u003e library --\u003e API layer.  This allows us to create another driver (an iSCSI variant, for example) by merely adding a new shim and very minor changes in the library.  We are future-proofing by following the established pattern now.","commit_id":"3253a786e438b4de7728afeaa4f33e517236070a"}],"cinder/volume/drivers/netapp/mars/library.py":[{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":156,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"},{"line_number":157,"context_line":"                LOG.error(error_msg, error_msg_args)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            LOG.info(_LI(\u0027Deleted volume %s.\u0027), volume_name)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_2fe78841","line":157,"updated":"2015-12-10 20:59:59.000000000","message":"We may want to double check, but i\u0027m pretty sure that LOG.error will automatically log the exception message and traceback so we don\u0027t need to put ex in the error_msg","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":156,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"},{"line_number":157,"context_line":"                LOG.error(error_msg, error_msg_args)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            LOG.info(_LI(\u0027Deleted volume %s.\u0027), volume_name)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_b4ffc400","line":157,"in_reply_to":"7a740942_2fe78841","updated":"2015-12-14 15:59:27.000000000","message":"Fixed using Sean\u0027s feedback.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"78f4ad5a9ac3612ac6b54aefb2094c59dbc191ae","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":156,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"},{"line_number":157,"context_line":"                LOG.error(error_msg, error_msg_args)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            LOG.info(_LI(\u0027Deleted volume %s.\u0027), volume_name)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_5f507b5e","line":157,"in_reply_to":"7a740942_2fe78841","updated":"2015-12-10 22:14:58.000000000","message":"You\u0027re actually thinking of LOG.exception. That is the same as LOG.error with the additional benefit that it will log the details of whatever exception is in scope automatically. So adding ex to error_msg_args could be skipped in these cases of LOG.error is changed to LOG.exception.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":156,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"},{"line_number":157,"context_line":"                LOG.error(error_msg, error_msg_args)"},{"line_number":158,"context_line":"        else:"},{"line_number":159,"context_line":"            LOG.info(_LI(\u0027Deleted volume %s.\u0027), volume_name)"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_c7ad7d89","line":157,"in_reply_to":"7a740942_5f507b5e","updated":"2015-12-14 15:59:27.000000000","message":"Thanks, Sean!  I had wondered what the difference was, and using LOG.exception is a simplification, so I\u0027ve adopted it everywhere.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                LOG.warning(_LW(\"Snapshot %s does not exist.\"), snapshot_name)"},{"line_number":225,"context_line":"                return"},{"line_number":226,"context_line":"            elif ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":227,"context_line":"                LOG.warning(_LW(\"Volume %s does not exist.\"), volume_name)"},{"line_number":228,"context_line":"                return"},{"line_number":229,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":230,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_f081d1c3","line":227,"updated":"2015-12-09 03:30:18.000000000","message":"Can you log the snapshot_name here as well?\n\n\"Source volume xxxx for snapshot xxxx does not exist.\"","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                LOG.warning(_LW(\"Snapshot %s does not exist.\"), snapshot_name)"},{"line_number":225,"context_line":"                return"},{"line_number":226,"context_line":"            elif ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":227,"context_line":"                LOG.warning(_LW(\"Volume %s does not exist.\"), volume_name)"},{"line_number":228,"context_line":"                return"},{"line_number":229,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":230,"context_line":"                error_msg_args[\u0027ex\u0027] \u003d ex"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_eafdbcb1","line":227,"in_reply_to":"7a740942_f081d1c3","updated":"2015-12-14 15:59:27.000000000","message":"Done, both here and the one other place I handle this error code.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                self.client.extend_lun(child_volume_name, child_volume_size)"},{"line_number":264,"context_line":"            except Exception as ex:"},{"line_number":265,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":266,"context_line":"                    error_msg \u003d _LE(\u0027Error extending clone of volume \u0027"},{"line_number":267,"context_line":"                                    \u0027%(vol)s: %(ex)s\u0027)"},{"line_number":268,"context_line":"                    error_msg_args \u003d {\u0027vol\u0027: parent_volume_name, \u0027ex\u0027: ex}"},{"line_number":269,"context_line":"                    LOG.error(error_msg, error_msg_args)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_30caf91b","line":266,"updated":"2015-12-09 03:30:18.000000000","message":"Can you make it clear in the error message this happened during create volume from snapshot operation?","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                self.client.extend_lun(child_volume_name, child_volume_size)"},{"line_number":264,"context_line":"            except Exception as ex:"},{"line_number":265,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":266,"context_line":"                    error_msg \u003d _LE(\u0027Error extending clone of volume \u0027"},{"line_number":267,"context_line":"                                    \u0027%(vol)s: %(ex)s\u0027)"},{"line_number":268,"context_line":"                    error_msg_args \u003d {\u0027vol\u0027: parent_volume_name, \u0027ex\u0027: ex}"},{"line_number":269,"context_line":"                    LOG.error(error_msg, error_msg_args)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_4f53bf6b","line":266,"in_reply_to":"7a740942_30caf91b","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"aaafdcda8d9f5eb30bac32a37cef409bd0b7a1cb","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            model_update[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":315,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":316,"context_line":"            if ex.code \u003d\u003d api.CG_DELETE_CG_NOT_FOUND:"},{"line_number":317,"context_line":"                LOG.warning(_LI(\"Consistency group %s does not exist.\"),"},{"line_number":318,"context_line":"                            cg_name)"},{"line_number":319,"context_line":"                model_update[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":320,"context_line":"                return model_update, volumes"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_da071616","line":317,"updated":"2015-12-09 01:37:11.000000000","message":"Needs _LW() instead of _LI().","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            model_update[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":315,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":316,"context_line":"            if ex.code \u003d\u003d api.CG_DELETE_CG_NOT_FOUND:"},{"line_number":317,"context_line":"                LOG.warning(_LI(\"Consistency group %s does not exist.\"),"},{"line_number":318,"context_line":"                            cg_name)"},{"line_number":319,"context_line":"                model_update[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":320,"context_line":"                return model_update, volumes"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_8fea0773","line":317,"in_reply_to":"7a740942_da071616","updated":"2015-12-14 15:59:27.000000000","message":"Good catch, thanks.  Fixed.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        for volume in volumes:"},{"line_number":335,"context_line":"            try:"},{"line_number":336,"context_line":"                self.delete_volume(volume)"},{"line_number":337,"context_line":"                volume[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":338,"context_line":"            except Exception as ex:"},{"line_number":339,"context_line":"                any_error \u003d True"},{"line_number":340,"context_line":"                volume[\u0027status\u0027] \u003d \u0027error_deleting\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d0ae152d","line":337,"updated":"2015-12-09 03:30:18.000000000","message":"\"volumes\" returned here should be a list of dictionaries.  Please don\u0027t modify the passed in \"volumes\".","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        for volume in volumes:"},{"line_number":335,"context_line":"            try:"},{"line_number":336,"context_line":"                self.delete_volume(volume)"},{"line_number":337,"context_line":"                volume[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":338,"context_line":"            except Exception as ex:"},{"line_number":339,"context_line":"                any_error \u003d True"},{"line_number":340,"context_line":"                volume[\u0027status\u0027] \u003d \u0027error_deleting\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_ddc2fee8","line":337,"in_reply_to":"7a740942_d0ae152d","updated":"2015-12-14 15:59:27.000000000","message":"Done.  I adopted the \"volumes_model_update\" nomenclature found in other drivers.  Same with similar comments below.  This required some adjustments to the unit tests as well.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            self.client.create_cg_snapshot(cg_name, cg_snapshot_name)"},{"line_number":356,"context_line":"            for snapshot in snapshots:"},{"line_number":357,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027available\u0027"},{"line_number":358,"context_line":"        except Exception as ex:"},{"line_number":359,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":360,"context_line":"                error_msg \u003d _LE(\u0027Error creating snapshot %(cg_snap)s for \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_907badbd","line":357,"updated":"2015-12-09 03:30:18.000000000","message":"Similarly, please return a list of dictionaries rather than modifying the passed in \"snapshots\".","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        try:"},{"line_number":355,"context_line":"            self.client.create_cg_snapshot(cg_name, cg_snapshot_name)"},{"line_number":356,"context_line":"            for snapshot in snapshots:"},{"line_number":357,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027available\u0027"},{"line_number":358,"context_line":"        except Exception as ex:"},{"line_number":359,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":360,"context_line":"                error_msg \u003d _LE(\u0027Error creating snapshot %(cg_snap)s for \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_71a76ea7","line":357,"in_reply_to":"7a740942_907badbd","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                                           cg_snapshot_name,"},{"line_number":391,"context_line":"                                           force\u003dTrue)"},{"line_number":392,"context_line":"            for snapshot in snapshots:"},{"line_number":393,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":394,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":395,"context_line":"            if ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":396,"context_line":"                LOG.warning(_LW(\"Consistency group %s does not exist.\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_5050e531","line":393,"updated":"2015-12-09 03:30:18.000000000","message":"Same","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                                           cg_snapshot_name,"},{"line_number":391,"context_line":"                                           force\u003dTrue)"},{"line_number":392,"context_line":"            for snapshot in snapshots:"},{"line_number":393,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":394,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":395,"context_line":"            if ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":396,"context_line":"                LOG.warning(_LW(\"Consistency group %s does not exist.\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_8938aed4","line":393,"in_reply_to":"7a740942_5050e531","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":394,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":395,"context_line":"            if ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":396,"context_line":"                LOG.warning(_LW(\"Consistency group %s does not exist.\"),"},{"line_number":397,"context_line":"                            cg_name)"},{"line_number":398,"context_line":"                for snapshot in snapshots:"},{"line_number":399,"context_line":"                    snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_301bd982","line":396,"updated":"2015-12-09 03:30:18.000000000","message":"Could this also mean volume not found?  See line 226.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"},{"line_number":394,"context_line":"        except api.MarsWebMAPIError as ex:"},{"line_number":395,"context_line":"            if ex.code \u003d\u003d api.SNAPSHOT_DELETE_OBJ_NOT_FOUND:"},{"line_number":396,"context_line":"                LOG.warning(_LW(\"Consistency group %s does not exist.\"),"},{"line_number":397,"context_line":"                            cg_name)"},{"line_number":398,"context_line":"                for snapshot in snapshots:"},{"line_number":399,"context_line":"                    snapshot[\u0027status\u0027] \u003d \u0027deleted\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_d27af687","line":396,"in_reply_to":"7a740942_301bd982","updated":"2015-12-14 15:59:27.000000000","message":"I adjusted the error message similarly to line 226.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            \u0027netapp_thin_provisioned\u0027: \u0027true\u0027,"},{"line_number":560,"context_line":"            \u0027consistencygroup_support\u0027: True,"},{"line_number":561,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":562,"context_line":"            \u0027thin_provisioning_support\u0027: True,"},{"line_number":563,"context_line":"        }"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        backend_name \u003d self.configuration.safe_get(\u0027volume_backend_name\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_cb38a6d5","line":562,"updated":"2015-12-09 03:30:18.000000000","message":"Why do you need both \"thin_provisioning_support\" and \"netapp_thin_provisioned\"?","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            \u0027netapp_thin_provisioned\u0027: \u0027true\u0027,"},{"line_number":560,"context_line":"            \u0027consistencygroup_support\u0027: True,"},{"line_number":561,"context_line":"            \u0027thick_provisioning_support\u0027: False,"},{"line_number":562,"context_line":"            \u0027thin_provisioning_support\u0027: True,"},{"line_number":563,"context_line":"        }"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        backend_name \u003d self.configuration.safe_get(\u0027volume_backend_name\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_492734ca","line":562,"in_reply_to":"7a740942_cb38a6d5","updated":"2015-12-14 15:59:27.000000000","message":"OK, after further deliberation I have removed \"netapp_thin_provisioned\".\n\nI included that for compatibility and consistency with the vendor-specific extra specs in our other drivers, but because there is a Cinder standard value, I\u0027m fine to start the deprecation process by not including \"netapp_thin_provisioned\" in a new driver.\n\nIf Cinder ever defines standard extra specs for Compression and Dedupe, we\u0027re glad to adopt those as well.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":177,"name":"Alex Meade","email":"mr.alex.meade@gmail.com","username":"alex-meade"},"change_message_id":"aa08ea326fc9fd5468889dd947c13ad585a9c0d8","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        Does not delete the underlying backend storage object."},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        For most drivers, this will not need to do anything.  However, some"},{"line_number":653,"context_line":"        drivers might use this call as an opportunity to clean up any"},{"line_number":654,"context_line":"        Cinder-specific configuration that they have associated with the"},{"line_number":655,"context_line":"        backend storage object."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_2a2693ce","line":652,"updated":"2015-12-10 20:59:59.000000000","message":"We don\u0027t need this general paragraph. Perhaps a paragraph saying it add the umanaged suffix and call it a day.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        Does not delete the underlying backend storage object."},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        For most drivers, this will not need to do anything.  However, some"},{"line_number":653,"context_line":"        drivers might use this call as an opportunity to clean up any"},{"line_number":654,"context_line":"        Cinder-specific configuration that they have associated with the"},{"line_number":655,"context_line":"        backend storage object."}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_a9281834","line":652,"in_reply_to":"7a740942_2a2693ce","updated":"2015-12-14 15:59:27.000000000","message":"Done","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"103dd79327e38c243432b9fb75991851e52c6744","unresolved":false,"context_lines":[{"line_number":852,"context_line":"                \u0027target_discovered\u0027: True,"},{"line_number":853,"context_line":"                \u0027target_lun\u0027: lun_id,"},{"line_number":854,"context_line":"                \u0027target_wwn\u0027: target_wwpns,"},{"line_number":855,"context_line":"                \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":856,"context_line":"                \u0027initiator_target_map\u0027: initiator_target_map,"},{"line_number":857,"context_line":"            }"},{"line_number":858,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_cbad06ea","line":855,"updated":"2015-12-09 03:30:18.000000000","message":"You should not set \"access_mode\" to be \"rw\".  This will prevent read-only volume from working.  The manager is taking care of the \"access_mode\".","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"ee02ef4c83ce91710148061cd5c2ffd33ffa9837","unresolved":false,"context_lines":[{"line_number":852,"context_line":"                \u0027target_discovered\u0027: True,"},{"line_number":853,"context_line":"                \u0027target_lun\u0027: lun_id,"},{"line_number":854,"context_line":"                \u0027target_wwn\u0027: target_wwpns,"},{"line_number":855,"context_line":"                \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":856,"context_line":"                \u0027initiator_target_map\u0027: initiator_target_map,"},{"line_number":857,"context_line":"            }"},{"line_number":858,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_e90aa089","line":855,"in_reply_to":"7a740942_cbad06ea","updated":"2015-12-14 15:59:27.000000000","message":"Done, thanks.  I didn\u0027t realize this, and there are a number of FC drivers (including others from NetApp) that set access_mode to \"rw\".  I don\u0027t see a Launchpad bug concerning access_mode; perhaps there ought to be.","commit_id":"a403ef45d3d6bc6cf0355b40b05cfa97b6d4f6e0"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ea4388998f4fd16f83f8cc29848368d61a117aa3","unresolved":false,"context_lines":[{"line_number":799,"context_line":"                    \u0027target_discovered\u0027: True,"},{"line_number":800,"context_line":"                    \u0027target_lun\u0027: 1,"},{"line_number":801,"context_line":"                    \u0027target_wwn\u0027: \u0027500a098280feeba5\u0027,"},{"line_number":802,"context_line":"                    \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":803,"context_line":"                    \u0027initiator_target_map\u0027: {"},{"line_number":804,"context_line":"                        \u002721000024ff406cc3\u0027: [\u0027500a098280feeba5\u0027],"},{"line_number":805,"context_line":"                        \u002721000024ff406cc2\u0027: [\u0027500a098280feeba5\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a710552_5e58aafa","line":802,"updated":"2015-12-15 15:13:46.000000000","message":"nit: Please remove the above line if you need to do another patch.","commit_id":"c69de501b0a9823786d678718483b25816f0e714"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"df2be27ef79744d2a39a55f22e0ddc11b06f8485","unresolved":false,"context_lines":[{"line_number":799,"context_line":"                    \u0027target_discovered\u0027: True,"},{"line_number":800,"context_line":"                    \u0027target_lun\u0027: 1,"},{"line_number":801,"context_line":"                    \u0027target_wwn\u0027: \u0027500a098280feeba5\u0027,"},{"line_number":802,"context_line":"                    \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":803,"context_line":"                    \u0027initiator_target_map\u0027: {"},{"line_number":804,"context_line":"                        \u002721000024ff406cc3\u0027: [\u0027500a098280feeba5\u0027],"},{"line_number":805,"context_line":"                        \u002721000024ff406cc2\u0027: [\u0027500a098280feeba5\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a710552_5f4adbc6","line":802,"in_reply_to":"5a710552_5e58aafa","updated":"2015-12-15 18:32:34.000000000","message":"Done","commit_id":"c69de501b0a9823786d678718483b25816f0e714"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"ea4388998f4fd16f83f8cc29848368d61a117aa3","unresolved":false,"context_lines":[{"line_number":816,"context_line":"                    \u0027target_lun\u0027: 1,"},{"line_number":817,"context_line":"                    \u0027target_wwn\u0027: [\u0027500a098280feeba5\u0027, \u0027500a098290feeba5\u0027,"},{"line_number":818,"context_line":"                                   \u0027500a098190feeba5\u0027, \u0027500a098180feeba5\u0027],"},{"line_number":819,"context_line":"                    \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":820,"context_line":"                    \u0027initiator_target_map\u0027: {"},{"line_number":821,"context_line":"                        \u002721000024ff406cc3\u0027: [\u0027500a098280feeba5\u0027,"},{"line_number":822,"context_line":"                                             \u0027500a098290feeba5\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a710552_fe69568c","line":819,"updated":"2015-12-15 15:13:46.000000000","message":"same","commit_id":"c69de501b0a9823786d678718483b25816f0e714"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"df2be27ef79744d2a39a55f22e0ddc11b06f8485","unresolved":false,"context_lines":[{"line_number":816,"context_line":"                    \u0027target_lun\u0027: 1,"},{"line_number":817,"context_line":"                    \u0027target_wwn\u0027: [\u0027500a098280feeba5\u0027, \u0027500a098290feeba5\u0027,"},{"line_number":818,"context_line":"                                   \u0027500a098190feeba5\u0027, \u0027500a098180feeba5\u0027],"},{"line_number":819,"context_line":"                    \u0027access_mode\u0027: \u0027rw\u0027,"},{"line_number":820,"context_line":"                    \u0027initiator_target_map\u0027: {"},{"line_number":821,"context_line":"                        \u002721000024ff406cc3\u0027: [\u0027500a098280feeba5\u0027,"},{"line_number":822,"context_line":"                                             \u0027500a098290feeba5\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a710552_7f4557b1","line":819,"in_reply_to":"5a710552_fe69568c","updated":"2015-12-15 18:32:34.000000000","message":"Done","commit_id":"c69de501b0a9823786d678718483b25816f0e714"}]}
