)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"f950feb1d467baddf59b56de2e410eb2a8a8f1bf","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"cb_confirm_volume_delete_retry_interval\""},{"line_number":17,"context_line":"\"cb_confirm_volume_delete_retries\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I8139ecfb1b49c0b69ed956e3a53b5bb895ffc1fa"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9a41bdd9_6f3321ac","line":18,"updated":"2015-07-14 13:52:58.000000000","message":"Should have a DocImpact for the new options.","commit_id":"ce8f8cc9db3af141fd7f8c25d462f80678724748"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"4101ff03b3d347b04dffcb2fd081e06e0f70ea29","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Deleting volumes in CloudByte Storage is an asynchronous process."},{"line_number":10,"context_line":"So, the driver needs to wait till the job/process is completed."},{"line_number":11,"context_line":"The driver uses the jobid in a wait loop for a cofigured interval"},{"line_number":12,"context_line":"of time, till the volume deletion is completed."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Added two new config options for this operation:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9a41bdd9_e1ffa6a8","line":11,"updated":"2015-07-17 04:37:08.000000000","message":"s/cofigured/configured","commit_id":"98b5347f0b956bffa23e41d2c927a4d37abc1b50"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"9dc055706b7a7469a999e3507553857874e554e8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Abhishek Shrivastava \u003cabhishek@cloudbyte.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-20 17:33:33 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adding delete wait loop for CloudByte ISCSI volumes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Deleting volumes in CloudByte Storage is an asynchronous process."},{"line_number":10,"context_line":"So, the driver needs to wait till the job/process is completed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"3a50d1a3_f16e392e","line":7,"updated":"2015-07-21 19:56:36.000000000","message":"The first line should be limited to 50 characters and should not end with a period.\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"}],"cinder/tests/unit/test_cloudbyte.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"41bf041fa8837a8b7a1b9d945640b54f6176bbb7","unresolved":false,"context_lines":[{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    def _side_effect_api_req(self, cmd, params, version\u003d\u00271.0\u0027):"},{"line_number":671,"context_line":"        \"\"\"This is a side effect function."},{"line_number":672,"context_line":""},{"line_number":673,"context_line":"        The return value is determined based on cmd argument."},{"line_number":674,"context_line":"        The signature matches exactly with the method it tries"},{"line_number":675,"context_line":"        to mock."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a41bdd9_6c9367fb","side":"PARENT","line":672,"updated":"2015-07-17 17:32:59.000000000","message":"This line should be left there for better readability.","commit_id":"db0cca532b774970b2fa15776ab935b276c40838"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\" Test class for cloudbyte\u0027s cinder driver."},{"line_number":17,"context_line":"This involves mocking of elasticenter\u0027s json responses"},{"line_number":18,"context_line":"when a method of this driver is unit tested."},{"line_number":19,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_2c995a7c","line":16,"updated":"2015-08-06 17:32:33.000000000","message":"Blank line should actually have been kept.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        self.driver.configuration.san_ip \u003d None"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        # Now run the test \u0026 assert the exception"},{"line_number":843,"context_line":"        with testtools.ExpectedException("},{"line_number":844,"context_line":"                exception.InvalidInput,"},{"line_number":845,"context_line":"                \"Invalid input received: cb_apikey, cb_account_name,\""},{"line_number":846,"context_line":"                \" cb_tsm_name, san_ip must be set for CloudByte Storage.\"):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_0cd6def0","line":843,"updated":"2015-08-06 17:32:33.000000000","message":"Use self.assertRaises for this.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e2edc6580ed0eac28f953d198fa918a8abf47166","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        self.driver.configuration.san_ip \u003d None"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        # Now run the test \u0026 assert the exception"},{"line_number":843,"context_line":"        with testtools.ExpectedException("},{"line_number":844,"context_line":"                exception.InvalidInput,"},{"line_number":845,"context_line":"                \"Invalid input received: cb_apikey, cb_account_name,\""},{"line_number":846,"context_line":"                \" cb_tsm_name, san_ip must be set for CloudByte Storage.\"):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_ec1c8015","line":843,"in_reply_to":"1a4dcd0f_0cd6def0","updated":"2015-08-08 20:09:59.000000000","message":"+1","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"8ccbb2e6b8074dd879aacc3880c6da8b2cb70dfe","unresolved":false,"context_lines":[{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        # assert that no api calls were invoked"},{"line_number":918,"context_line":"        self.assertEqual(0, mock_api_req.call_count)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        # Test-III"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"        # re-configure the dependencies"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_626db097","line":919,"updated":"2015-08-04 14:48:35.000000000","message":"Writing UT for _wait_for_volume_deletion and _retry_volume_operation will be of no use, but I have covered the unit test for the exception raised in those functions.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"925128f2f37143def9faa5ac944047cd3851165d","unresolved":false,"context_lines":[{"line_number":916,"context_line":""},{"line_number":917,"context_line":"        # assert that no api calls were invoked"},{"line_number":918,"context_line":"        self.assertEqual(0, mock_api_req.call_count)"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        # Test-III"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"        # re-configure the dependencies"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_addc09e5","line":919,"in_reply_to":"1a4dcd0f_626db097","updated":"2015-08-04 15:10:19.000000000","message":"OK.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            self._side_effect_api_req_to_delete_file_system)"},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"        # run the test"},{"line_number":933,"context_line":"        with testtools.ExpectedException("},{"line_number":934,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":935,"context_line":"                \"Bad or unexpected response from the storage \""},{"line_number":936,"context_line":"                \"volume backend API: Null response received while \""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_8c00ae67","line":933,"updated":"2015-08-06 17:32:33.000000000","message":"Same as above.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":951,"context_line":"            self._side_effect_api_req_to_query_asyncjob_response)"},{"line_number":952,"context_line":""},{"line_number":953,"context_line":"        # now run the test"},{"line_number":954,"context_line":"        with testtools.ExpectedException("},{"line_number":955,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":956,"context_line":"                \"Bad or unexpected response from the storage \""},{"line_number":957,"context_line":"                \"volume backend API: Null response received while \""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_ecf13296","line":954,"updated":"2015-08-06 17:32:33.000000000","message":"Same.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"        # now run the test"},{"line_number":1254,"context_line":"        with testtools.ExpectedException("},{"line_number":1255,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":1256,"context_line":"                \"Bad or unexpected response from the storage volume \""},{"line_number":1257,"context_line":"                \"backend API: Null response received while creating volume \""},{"line_number":1258,"context_line":"                \"\\[c93df32e3a9934918e10cf318a7f9b7f\\] at CloudByte storage.\"):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_6c344249","line":1255,"updated":"2015-08-06 17:32:33.000000000","message":"Same.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"214f731e21f74642c4b2ec2f592d1389a894774c","unresolved":false,"context_lines":[{"line_number":1268,"context_line":"            self._side_effect_api_req_to_query_asyncjob_response)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"        # now run the test"},{"line_number":1271,"context_line":"        with testtools.ExpectedException("},{"line_number":1272,"context_line":"                exception.VolumeBackendAPIException,"},{"line_number":1273,"context_line":"                \"Bad or unexpected response from the storage volume \""},{"line_number":1274,"context_line":"                \"backend API: Null response received while querying for\""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a4dcd0f_4c25c606","line":1271,"updated":"2015-08-06 17:32:33.000000000","message":"Same.","commit_id":"8bc2fbb7630de7bc8f8b912c1054d568ca8a477e"}],"cinder/volume/drivers/cloudbyte/cloudbyte.py":[{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"10bbc96e9894313548c1c55ba443fac3f9bada21","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    def _retry_volume_operation(self, operation, retries,"},{"line_number":281,"context_line":"                                max_retries, jobid,"},{"line_number":282,"context_line":"                                cb_vol):"},{"line_number":283,"context_line":"        \"\"\"CloudByte async calls via the FixedIntervalLoopingCall\"\"\""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        # Query the CloudByte storage with this jobid"},{"line_number":286,"context_line":"        volume_response \u003d self._queryAsyncJobResult_request(jobid)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a41bdd9_32235507","line":283,"updated":"2015-07-14 05:28:45.000000000","message":"nit: End docstring with \".\"","commit_id":"f44f735b5a8f1765288ff9b633166cc8c37532ef"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"fb28675f3617cc5575585382472d27ecdc57b6e2","unresolved":false,"context_lines":[{"line_number":306,"context_line":"                         \"volume [%(cb_vol)s].\"),"},{"line_number":307,"context_line":"                     {\u0027operation\u0027: operation, \u0027cb_vol\u0027: cb_vol})"},{"line_number":308,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        elif retries \u003d\u003d max_retries:"},{"line_number":311,"context_line":"            # All attempts exhausted"},{"line_number":312,"context_line":"            LOG.error(_LE(\"CloudByte operation [%(operation)s] failed\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_2bff5b35","line":309,"updated":"2015-07-14 09:25:47.000000000","message":"Is there needed a blank line?","commit_id":"e19aef179f63048f9248bc7f46ed4c5fe2e9ba77"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"fb28675f3617cc5575585382472d27ecdc57b6e2","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                       \u0027vol\u0027: cb_vol,"},{"line_number":317,"context_line":"                       \u0027max\u0027: retries})"},{"line_number":318,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dFalse)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        else:"},{"line_number":321,"context_line":"            retries +\u003d 1"},{"line_number":322,"context_line":"            LOG.debug(\"CloudByte operation [%(operation)s] for\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a41bdd9_cbfd8f3b","line":319,"updated":"2015-07-14 09:25:47.000000000","message":"here too.","commit_id":"e19aef179f63048f9248bc7f46ed4c5fe2e9ba77"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"f950feb1d467baddf59b56de2e410eb2a8a8f1bf","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from six.moves import urllib"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from cinder import exception"},{"line_number":27,"context_line":"from cinder.i18n import _"},{"line_number":28,"context_line":"from cinder.i18n import _LE"},{"line_number":29,"context_line":"from cinder.i18n import _LI"},{"line_number":30,"context_line":"from cinder.volume.drivers.cloudbyte import options"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_af5049d5","line":27,"updated":"2015-07-14 13:52:58.000000000","message":"What was wrong with keeping the imports in the same line as before?","commit_id":"ce8f8cc9db3af141fd7f8c25d462f80678724748"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"48727e35f1e1e73120f32dcb5fd1dda5f5af6096","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                       \u0027max\u0027: retries})"},{"line_number":317,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dFalse)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            retries +\u003d 1"},{"line_number":320,"context_line":"            LOG.debug(\"CloudByte operation [%(operation)s] for\""},{"line_number":321,"context_line":"                      \" volume [%(vol)s]: retry [%(retry)s] of [%(max)s].\","},{"line_number":322,"context_line":"                      {\u0027operation\u0027: operation,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a41bdd9_c4a242fd","line":319,"updated":"2015-07-14 18:35:18.000000000","message":"I don\u0027t think you will get updated retries here.  The loopingcall code doesn\u0027t provide a facility for passing in the same values between calls.  You\u0027ll need to use self.retries \u003d self.retries + 1","commit_id":"ce8f8cc9db3af141fd7f8c25d462f80678724748"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"29fc162cfb9f18385280cfa600d7a03a0f9d0a54","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":214,"context_line":"        if not (self.configuration.cb_apikey):"},{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set\"))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_87bf2e60","line":216,"updated":"2015-07-15 13:46:56.000000000","message":"\".\" at EOL","commit_id":"fceb6a151e9ad2d01315b2a3c609fdaad532368a"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"29fc162cfb9f18385280cfa600d7a03a0f9d0a54","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("},{"line_number":220,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_account_name must be set\"))"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if not (self.configuration.cb_tsm_name):"},{"line_number":223,"context_line":"            raise exception.InvalidInput("}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_a7c272e7","line":220,"updated":"2015-07-15 13:46:56.000000000","message":"\".\" at EOL","commit_id":"fceb6a151e9ad2d01315b2a3c609fdaad532368a"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"29fc162cfb9f18385280cfa600d7a03a0f9d0a54","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        if not (self.configuration.cb_tsm_name):"},{"line_number":223,"context_line":"            raise exception.InvalidInput("},{"line_number":224,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_tsm_name must be set\"))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        # The san_ip must always be set, because we use it for the target"},{"line_number":227,"context_line":"        if not self.configuration.san_ip:"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_07b47e7d","line":224,"updated":"2015-07-15 13:46:56.000000000","message":"\".\" at EOL","commit_id":"fceb6a151e9ad2d01315b2a3c609fdaad532368a"},{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"29fc162cfb9f18385280cfa600d7a03a0f9d0a54","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        # The san_ip must always be set, because we use it for the target"},{"line_number":227,"context_line":"        if not self.configuration.san_ip:"},{"line_number":228,"context_line":"            raise exception.InvalidInput(reason\u003d_("},{"line_number":229,"context_line":"                \"CloudByte Storage\u0027s san_ip must be set\"))"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _create_volume_request(self, volume, datasetid, qosgroupid,"},{"line_number":232,"context_line":"                               tsmid, volume_name):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a41bdd9_e7a4fa4b","line":229,"updated":"2015-07-15 13:46:56.000000000","message":"\".\" at EOL","commit_id":"fceb6a151e9ad2d01315b2a3c609fdaad532368a"},{"author":{"_account_id":14377,"name":"Apoorva","email":"apps.desh@gmail.com","username":"apoorvad"},"change_message_id":"4101ff03b3d347b04dffcb2fd081e06e0f70ea29","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        retry_interval \u003d ("},{"line_number":382,"context_line":"            self.configuration.cb_confirm_volume_delete_retry_interval)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        max_retries \u003d ("},{"line_number":385,"context_line":"            self.configuration.cb_confirm_volume_delete_retries)"},{"line_number":386,"context_line":"        retries \u003d {\u0027count\u0027: 0}"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a41bdd9_a193de4e","line":384,"updated":"2015-07-17 04:37:08.000000000","message":"Instead of querying max_retries multiple times from config (#347) and passing to _retry_volume_operation functions, can you make it as class variable?","commit_id":"98b5347f0b956bffa23e41d2c927a4d37abc1b50"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"6614975548a4dba1fa0b040237a1feb86a51124e","unresolved":false,"context_lines":[{"line_number":381,"context_line":"        retry_interval \u003d ("},{"line_number":382,"context_line":"            self.configuration.cb_confirm_volume_delete_retry_interval)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        max_retries \u003d ("},{"line_number":385,"context_line":"            self.configuration.cb_confirm_volume_delete_retries)"},{"line_number":386,"context_line":"        retries \u003d {\u0027count\u0027: 0}"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a41bdd9_c01b5c1b","line":384,"in_reply_to":"9a41bdd9_a193de4e","updated":"2015-07-17 16:08:45.000000000","message":"Making max_retries as class variable will be no help cause its been used in two functions and taking two different values from config.","commit_id":"98b5347f0b956bffa23e41d2c927a4d37abc1b50"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"41bf041fa8837a8b7a1b9d945640b54f6176bbb7","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"addQosGroup\", params)"},{"line_number":210,"context_line":"        return data"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def check_for_setup_error(self):"},{"line_number":213,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":214,"context_line":"        if not (self.configuration.cb_apikey):"},{"line_number":215,"context_line":"            raise exception.InvalidInput("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a41bdd9_4082e753","line":212,"updated":"2015-07-17 17:32:59.000000000","message":"Could you add a unit test for this check?  I do not see one in test_cloudbyte.py.","commit_id":"4c63cdbd47ce394ee99ef6aa70b4cf756f8fac27"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"9dc055706b7a7469a999e3507553857874e554e8","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        return data"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def check_for_setup_error(self):"},{"line_number":213,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":214,"context_line":"        if not (self.configuration.cb_apikey):"},{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set.\"))"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_c7eedfb3","line":213,"updated":"2015-07-21 19:56:36.000000000","message":"can we use a variable list here?\nvariable_list \u003d []\nif not variable1:\n    variable_list.append(\u0027variable1\u0027)\nif not variable2:\n    variable_list.append(\u0027variable2\u0027)\n\nif variable_list:\n   raise exception.InvalidInput(reason\u003d_(\"%s must be set for CloudByte Storage.\") % \u0027, \u0027.join(variable_list))","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"90648d0a3c21503bc7ade99895d3dc77e4815111","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set.\"))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("},{"line_number":220,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_account_name must be set.\"))"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_ff685489","line":218,"updated":"2015-07-21 14:05:52.000000000","message":"An elif is better because each of these if conditions raises an exception.","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"381880e2bfcb0a3489e75ac6ead00a1d789cab78","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set.\"))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("},{"line_number":220,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_account_name must be set.\"))"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_c43587f7","line":218,"in_reply_to":"3a50d1a3_7516a356","updated":"2015-07-21 16:09:52.000000000","message":"The purpose of raising separate exception with separate if condition is to make sure that the user is aware of what he/she has missed, also if we take two parameters at once and raise a single exception then it would create an ambiguity for the user (like which parameter he/she has missed).","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"c648a63acd3655a6af8c74d3f88b7584df99ec76","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set.\"))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("},{"line_number":220,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_account_name must be set.\"))"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_7516a356","line":218,"in_reply_to":"3a50d1a3_bfcbac1d","updated":"2015-07-21 14:46:12.000000000","message":"The way the code is written now, it would not make a difference.  Unless, this method is changed to check for all missing values in one run, I still believe an elif is better.\n\nSo my suggestion is to check for all of these options in one run, instead of one at a time.  For example, if cb_account_name and cb_tsm_name are both not set, the user would get one message instead of getting them one at a time on each restart.","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"d3c7d852a8f8a0aab131d6aec3e19350f0c0e840","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            raise exception.InvalidInput("},{"line_number":216,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_apikey must be set.\"))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if not (self.configuration.cb_account_name):"},{"line_number":219,"context_line":"            raise exception.InvalidInput("},{"line_number":220,"context_line":"                reason\u003d_(\"CloudByte Storage\u0027s cb_account_name must be set.\"))"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_bfcbac1d","line":218,"in_reply_to":"3a50d1a3_ff685489","updated":"2015-07-21 14:12:07.000000000","message":"Hm, not sure I agree with that or if it would make a difference.","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"9dc055706b7a7469a999e3507553857874e554e8","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        if volume_response is not None:"},{"line_number":291,"context_line":"            result_res \u003d volume_response.get(\u0027queryasyncjobresultresponse\u0027)"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        if volume_response is None or result_res is None:"},{"line_number":294,"context_line":"            msg \u003d (_("},{"line_number":295,"context_line":"                \"Null response received while querying \""},{"line_number":296,"context_line":"                \"for [%(operation)s] based job [%(job)s] \""}],"source_content_type":"text/x-python","patch_set":12,"id":"3a50d1a3_2ab74a87","line":293,"updated":"2015-07-21 19:56:36.000000000","message":"if volume_response is None in line 291, then result_res will be None, so you could use only result_res in if condition in line 293","commit_id":"6d52b954483066a1f0b2489f667fcc34565a0598"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"e39424eece80416ab39d9976154b1fd42b11b43b","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"addQosGroup\", params)"},{"line_number":210,"context_line":"        return data"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def check_for_setup_error(self):"},{"line_number":213,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":214,"context_line":"        prerequisites \u003d []"},{"line_number":215,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a50d1a3_9ab1de03","line":212,"updated":"2015-07-22 14:30:50.000000000","message":"I don\u0027t see unit test for this method.","commit_id":"496edbe5a8546af9e88c29bd2c4a1dff4130dd97"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"e39424eece80416ab39d9976154b1fd42b11b43b","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        return tsmdetails"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _retry_volume_operation(self, operation, retries,"},{"line_number":283,"context_line":"                                max_retries, jobid,"},{"line_number":284,"context_line":"                                cb_vol):"},{"line_number":285,"context_line":"        \"\"\"CloudByte async calls via the FixedIntervalLoopingCall.\"\"\""},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a50d1a3_baadba9c","line":283,"updated":"2015-07-22 14:30:50.000000000","message":"Unit test coverage?","commit_id":"496edbe5a8546af9e88c29bd2c4a1dff4130dd97"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"3eca58f89147be3f051e233ee091f39dab1b2770","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                       \u0027max\u0027: max_retries})"},{"line_number":318,"context_line":"            raise loopingcall.LoopingCallDone(retvalue\u003dFalse)"},{"line_number":319,"context_line":"        else:"},{"line_number":320,"context_line":"            count \u003d count + 1"},{"line_number":321,"context_line":"            retries[\u0027count\u0027] \u003d count"},{"line_number":322,"context_line":"            LOG.debug(\"CloudByte operation [%(operation)s] for\""},{"line_number":323,"context_line":"                      \" volume [%(vol)s]: retry [%(retry)s] of [%(max)s].\","}],"source_content_type":"text/x-python","patch_set":13,"id":"3a50d1a3_2ac9dcac","line":320,"updated":"2015-07-24 14:13:28.000000000","message":"count +\u003d 1","commit_id":"496edbe5a8546af9e88c29bd2c4a1dff4130dd97"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"e39424eece80416ab39d9976154b1fd42b11b43b","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            cb_volume_name)"},{"line_number":360,"context_line":"        timer.start(interval\u003dretry_interval).wait()"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def _wait_for_volume_deletion(self, volume_response, cb_volume_id):"},{"line_number":363,"context_line":"        \"\"\"Given the job wait for it to complete.\"\"\""},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        vol_res \u003d volume_response.get(\u0027deleteFileSystemResponse\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a50d1a3_facd8231","line":362,"updated":"2015-07-22 14:30:50.000000000","message":"UT coverage?","commit_id":"496edbe5a8546af9e88c29bd2c4a1dff4130dd97"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"707d1960c90c2a6fa2ba076921803ee72c12deb4","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return data"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def check_for_setup_error(self):"},{"line_number":212,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":213,"context_line":"        prerequisites \u003d []"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        if not self.configuration.cb_apikey:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_29a05f41","line":212,"updated":"2015-08-12 22:34:00.000000000","message":"This seems unrelated to the rest of this patch.","commit_id":"a9cfa196b30718a73af4c846e987c124e3df0d83"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"17e0fb1c6a40a2f42b362726acf0da4bb6b02a97","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        return data"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def check_for_setup_error(self):"},{"line_number":212,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":213,"context_line":"        prerequisites \u003d []"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        if not self.configuration.cb_apikey:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_9b2d2791","line":212,"in_reply_to":"1a4dcd0f_29a05f41","updated":"2015-08-13 06:43:22.000000000","message":"This function was not present before so instead of putting it in other patch I have put it in the same patch.","commit_id":"a9cfa196b30718a73af4c846e987c124e3df0d83"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"707d1960c90c2a6fa2ba076921803ee72c12deb4","unresolved":false,"context_lines":[{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        if result_res is None:"},{"line_number":295,"context_line":"            msg \u003d (_("},{"line_number":296,"context_line":"                \"Null response received while querying \""},{"line_number":297,"context_line":"                \"for [%(operation)s] based job [%(job)s] \""},{"line_number":298,"context_line":"                \"at CloudByte storage.\") %"},{"line_number":299,"context_line":"                {\u0027operation\u0027: operation, \u0027job\u0027: jobid})"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_e9ffd731","line":296,"updated":"2015-08-12 22:34:00.000000000","message":"Since there is already a -1 on this ... Can you be consistent with your spacing.  If you want to have the empty space at the beginning of the line do that for all the messages here.  Not some of each.\n\nThanks!","commit_id":"a9cfa196b30718a73af4c846e987c124e3df0d83"},{"author":{"_account_id":16883,"name":"huyang","email":"huyang1@huawei.com","username":"huyang"},"change_message_id":"9322fa1a8a52346b9718410a14d79da55a0c7b40","unresolved":false,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if jobid is None:"},{"line_number":376,"context_line":"            msg \u003d (_("},{"line_number":377,"context_line":"                \"Jobid not found in CloudByte\u0027s \""},{"line_number":378,"context_line":"                \"delete volume [%(cb_vol_id)s] response.\") %"},{"line_number":379,"context_line":"                {\u0027cb_vol_id\u0027: cb_volume_id})"},{"line_number":380,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a4dcd0f_8c04857e","line":377,"updated":"2015-08-11 09:53:20.000000000","message":"suggest s/Jobid/Job id","commit_id":"a9cfa196b30718a73af4c846e987c124e3df0d83"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"3e2eac15ddd108861467299efefc2c410f766f2e","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"addQosGroup\", params)"},{"line_number":209,"context_line":"        return data"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def check_for_setup_error(self):"},{"line_number":212,"context_line":"        \"\"\"Returns an error if prerequisites aren\u0027t met.\"\"\""},{"line_number":213,"context_line":"        prerequisites \u003d []"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_44ac2d8c","line":211,"updated":"2015-08-16 05:17:49.000000000","message":"The commit message does not mention anything about this. Consider breaking this out into another commit.","commit_id":"87f03d45cdc17496499a2ec046cf00db1e334f99"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cc44bef6cbdec553100afe404e49551d342cc3fe","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def _retry_volume_operation(self, operation, retries,"},{"line_number":261,"context_line":"                                max_retries, jobid,"},{"line_number":262,"context_line":"                                cb_vol):"},{"line_number":263,"context_line":"        \"\"\"CloudByte async calls via the FixedIntervalLoopingCall.\"\"\""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Query the CloudByte storage with this jobid"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_66f9734d","line":262,"updated":"2015-08-17 15:46:45.000000000","message":"We might want to use \"cb_volume_name\" here instead of \"cb_vol\", as is done in other parts of the code.\n\nAlso, documenting the parameters would be nice.","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"9139842a45cf9e99fed4f848774a440001c2e987","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def _retry_volume_operation(self, operation, retries,"},{"line_number":261,"context_line":"                                max_retries, jobid,"},{"line_number":262,"context_line":"                                cb_vol):"},{"line_number":263,"context_line":"        \"\"\"CloudByte async calls via the FixedIntervalLoopingCall.\"\"\""},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # Query the CloudByte storage with this jobid"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_fc80b348","line":262,"in_reply_to":"fa1b9901_66f9734d","updated":"2015-08-17 17:10:15.000000000","message":"Well, I can change it to cb_volume because it takes cb_volume_name from create_volume function and cb_volume_id from delete_volume function. So, in my thought changing it to cb_volume will be better.","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cc44bef6cbdec553100afe404e49551d342cc3fe","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            self.configuration.cb_confirm_volume_delete_retry_interval)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        max_retries \u003d ("},{"line_number":361,"context_line":"            self.configuration.cb_confirm_volume_delete_retries)"},{"line_number":362,"context_line":"        retries \u003d {\u0027count\u0027: 0}"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall("}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_48879d61","line":361,"updated":"2015-08-17 15:46:45.000000000","message":"Can these config values change during the execution of the process? If not, we might check them in __init__.","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"9139842a45cf9e99fed4f848774a440001c2e987","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            self.configuration.cb_confirm_volume_delete_retry_interval)"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        max_retries \u003d ("},{"line_number":361,"context_line":"            self.configuration.cb_confirm_volume_delete_retries)"},{"line_number":362,"context_line":"        retries \u003d {\u0027count\u0027: 0}"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        timer \u003d loopingcall.FixedIntervalLoopingCall("}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_9c4bb72b","line":361,"in_reply_to":"fa1b9901_48879d61","updated":"2015-08-17 17:10:15.000000000","message":"Yes, they can be changed during the execution, if we mention the following parameters with customized values in cinder.conf:\n1. cb_confirm_volume_delete_retry_interval\n2. cb_confirm_volume_delete_retries","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"}],"cinder/volume/drivers/cloudbyte/options.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"cc44bef6cbdec553100afe404e49551d342cc3fe","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               default\u003dNone,"},{"line_number":29,"context_line":"               help\u003d\"This corresponds to the name of \""},{"line_number":30,"context_line":"                    \"Tenant Storage Machine (TSM) in CloudByte storage. \""},{"line_number":31,"context_line":"                    \"A volume will be created in this TSM.\"),"},{"line_number":32,"context_line":"    cfg.IntOpt(\"cb_confirm_volume_create_retry_interval\","},{"line_number":33,"context_line":"               default\u003d5,"},{"line_number":34,"context_line":"               help\u003d\"A retry value in seconds. Will be used by the driver \""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_e616e354","line":31,"updated":"2015-08-17 15:46:45.000000000","message":"These three changes seem unrelated to this patch, or am I missing something?","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"},{"author":{"_account_id":14059,"name":"Abhishek Shrivastava","email":"abhishek@cloudbyte.com","username":"Abhishek01"},"change_message_id":"9139842a45cf9e99fed4f848774a440001c2e987","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               default\u003dNone,"},{"line_number":29,"context_line":"               help\u003d\"This corresponds to the name of \""},{"line_number":30,"context_line":"                    \"Tenant Storage Machine (TSM) in CloudByte storage. \""},{"line_number":31,"context_line":"                    \"A volume will be created in this TSM.\"),"},{"line_number":32,"context_line":"    cfg.IntOpt(\"cb_confirm_volume_create_retry_interval\","},{"line_number":33,"context_line":"               default\u003d5,"},{"line_number":34,"context_line":"               help\u003d\"A retry value in seconds. Will be used by the driver \""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa1b9901_bc6f9b91","line":31,"in_reply_to":"fa1b9901_e616e354","updated":"2015-08-17 17:10:15.000000000","message":"Well, the three changes are done because we were using None string instead of None object.","commit_id":"c21e87b865d2458c19d81bd8e865c30201e8ac69"}]}
