)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7e56b3210e12bb9d13d2f91de31218adc42453e7","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2014-11-28 17:46:15 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds cinder iscsi driver for CloudByte storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Icd91eff614fa6b3e61e48edccda4bd7bf3955b60"},{"line_number":10,"context_line":"Implements: blueprint CloudByte-ElastiStor-Cinder-Driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"5a890539_ad491eb9","line":8,"updated":"2014-11-28 21:23:19.000000000","message":"Can you please describe briefly what are the key features supported by your driver? Can you also include a link to your certification tests in the commit message so reviewers can take a look easily? (I saw it was in an earlier comments.)","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"f6456ac57cae0c73711f334b2a847526cca2f254","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds cinder iscsi driver for CloudByte storage"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Driver certification results url https://bugs.launchpad.net/cinder/+bug/1380126"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Icd91eff614fa6b3e61e48edccda4bd7bf3955b60"},{"line_number":12,"context_line":"Implements: blueprint CloudByte-ElastiStor-Cinder-Driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"3a961159_f6a7ad4e","line":9,"updated":"2014-12-25 13:48:38.000000000","message":"Better to use Closes-Bug: #1380126. Also, the commit message should contain more details.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"}],"cinder/tests/test_cloudbyte.py":[{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"e444de649b0486945d3b7f141b2e601e65af0644","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_1b9f4551","line":1,"updated":"2014-06-27 06:04:36.000000000","message":"It seems this line is incorrect.\nAt least, 2012 -\u003e 2014.","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"},{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"e444de649b0486945d3b7f141b2e601e65af0644","unresolved":false,"context_lines":[{"line_number":59,"context_line":"      \"numericquota\": 3145728.0,"},{"line_number":60,"context_line":"      \"currentnumericquota\": 1253376.0,"},{"line_number":61,"context_line":"      \"currentavailablequota\": 1892352.0,"},{"line_number":62,"context_line":"      \"revisionnumber\": 1"},{"line_number":63,"context_line":"    }]"},{"line_number":64,"context_line":"    }}\"\"\""},{"line_number":65,"context_line":"# A fake list tsm response of cloudbyte\u0027s elasticenter"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_3b1b21cc","line":62,"updated":"2014-06-27 06:04:36.000000000","message":"It seems the indent from line 40 to 62 are incorrect, even if commented out.","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"},{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"e444de649b0486945d3b7f141b2e601e65af0644","unresolved":false,"context_lines":[{"line_number":209,"context_line":"      \"nfsenabled\": false,"},{"line_number":210,"context_line":"      \"cifsenabled\": false,"},{"line_number":211,"context_line":"      \"iscsienabled\": true,"},{"line_number":212,"context_line":"      \"fcenabled\": false"},{"line_number":213,"context_line":"    }"},{"line_number":214,"context_line":"    },"},{"line_number":215,"context_line":"    \"created\": \"2014-06-16 15:49:49\","}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_3b4961b8","line":212,"updated":"2014-06-27 06:04:36.000000000","message":"same, from 185 to 212","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":623,"context_line":""},{"line_number":624,"context_line":"        # initialize the elasticenter iscsi driver"},{"line_number":625,"context_line":"        driver \u003d CloudByteISCSIDriver(configuration\u003dconfiguration)"},{"line_number":626,"context_line":"        self.driver \u003d driver"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"        # override some parts of driver configuration"},{"line_number":629,"context_line":"        self.driver.configuration.tsm_name \u003d \u0027openstack\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_eafdfe3c","line":626,"updated":"2014-11-18 22:34:00.000000000","message":"Can make this one line.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import mock"},{"line_number":25,"context_line":"import testtools"},{"line_number":26,"context_line":"from testtools import ExpectedException"},{"line_number":27,"context_line":"from testtools.matchers import Contains"},{"line_number":28,"context_line":"from testtools.matchers import Equals"},{"line_number":29,"context_line":"from testtools.matchers import Is"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_141f4a6d","line":26,"updated":"2014-12-19 11:07:02.000000000","message":"According to a hacking rules, please, import modules, not objects","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from cinder.volume.drivers.cloudbyte.cloudbyte import CloudByteISCSIDriver"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# A fake list account response of cloudbyte\u0027s elasticenter"},{"line_number":37,"context_line":"FAKE_LIST_ACCOUNT_RESPONSE \u003d \"\"\"{ \"listAccountResponse\" : {"},{"line_number":38,"context_line":"    \"count\":1 ,"},{"line_number":39,"context_line":"    \"account\" : [{"},{"line_number":40,"context_line":"        \"id\": \"d13a4e9e-0c05-4d2d-8a5e-5efd3ef058e0\","}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_f7000003","line":37,"updated":"2014-12-19 11:07:02.000000000","message":"All fixtures (fakes) are used only once with \u0027json.loads\u0027. Please, define them dictionaries, not strings of JSON.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2b190be237ca49fe1013122d326fab089e091e68","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from cinder.volume.drivers.cloudbyte.cloudbyte import CloudByteISCSIDriver"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"# A fake list account response of cloudbyte\u0027s elasticenter"},{"line_number":37,"context_line":"FAKE_LIST_ACCOUNT_RESPONSE \u003d \"\"\"{ \"listAccountResponse\" : {"},{"line_number":38,"context_line":"    \"count\":1 ,"},{"line_number":39,"context_line":"    \"account\" : [{"},{"line_number":40,"context_line":"        \"id\": \"d13a4e9e-0c05-4d2d-8a5e-5efd3ef058e0\","}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_ad5b2f84","line":37,"in_reply_to":"3a961159_f7000003","updated":"2014-12-24 06:42:09.000000000","message":"Thanks Ivan. I wanted to simulate the storage backend response as much as possible. Hence, the json string \u0026 then conversion to python dictionaries. I will do the change in next release if its really important.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        \"revisionnumber\": 1"},{"line_number":63,"context_line":"    }]"},{"line_number":64,"context_line":"    }}\"\"\""},{"line_number":65,"context_line":"# A fake list tsm response of cloudbyte\u0027s elasticenter"},{"line_number":66,"context_line":"FAKE_LIST_TSM_RESPONSE \u003d \"\"\"{ \"listTsmResponse\" : {"},{"line_number":67,"context_line":"    \"count\":1 ,"},{"line_number":68,"context_line":"    \"listTsm\" : [{"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_54155247","line":65,"updated":"2014-12-19 11:07:02.000000000","message":"Blank line between fixtures will make code more readable","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        return MAP_COMMAND_TO_FAKE_RESPONSE[cmd]"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def _side_effect_api_req_to_list_tsm(self, cmd, params, version\u003d\u00271.0\u0027):"},{"line_number":657,"context_line":"        \"\"\"This is a side effect function.\"\"\""},{"line_number":658,"context_line":"        if cmd \u003d\u003d \u0027listTsm\u0027:"},{"line_number":659,"context_line":"            return {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_b73118ef","line":656,"updated":"2014-12-19 11:07:02.000000000","message":"A lot of similar method with different names and cmd value. Could we make one method instead of them?","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"        # assert the result attributes with respective values"},{"line_number":1252,"context_line":"        self.assertThat(vol_stats[\u0027reserved_percentage\u0027], Equals(0))"},{"line_number":1253,"context_line":"        self.assertThat(vol_stats[\u0027vendor_name\u0027], Equals(\u0027CloudByte\u0027))"},{"line_number":1254,"context_line":"        self.assertThat(vol_stats[\u0027storage_protocol\u0027], Equals(\u0027iSCSI\u0027))"},{"line_number":1255,"context_line":""},{"line_number":1256,"context_line":"        # Test - III"},{"line_number":1257,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_575ab42a","line":1254,"updated":"2014-12-19 11:07:02.000000000","message":"Why do not use self.assertEquals? Same comment for the rest of code","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"f2a6c4e6a4e9ef534a63043af2226d6f8a26230b","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"        # assert the result attributes with respective values"},{"line_number":1252,"context_line":"        self.assertThat(vol_stats[\u0027reserved_percentage\u0027], Equals(0))"},{"line_number":1253,"context_line":"        self.assertThat(vol_stats[\u0027vendor_name\u0027], Equals(\u0027CloudByte\u0027))"},{"line_number":1254,"context_line":"        self.assertThat(vol_stats[\u0027storage_protocol\u0027], Equals(\u0027iSCSI\u0027))"},{"line_number":1255,"context_line":""},{"line_number":1256,"context_line":"        # Test - III"},{"line_number":1257,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_7bae4b9a","line":1254,"in_reply_to":"3a961159_575ab42a","updated":"2014-12-25 08:02:01.000000000","message":"I vagely remember getting some issues due to that. Will try using assertEquals.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        data \u003d self.driver._api_request_for_cloudbyte(\u0027listTsm\u0027, {})"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # assert the data attributes"},{"line_number":768,"context_line":"        self.assertEqual(data[\u0027listTsmResponse\u0027][\u0027count\u0027], 1)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Test - II"},{"line_number":771,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_7239a93e","line":768,"updated":"2015-01-04 07:04:48.000000000","message":"The order of the parameters should be expected, actual. Otherwise, the error message about mismatch will have them reversed as well.\n\nself.assertEqual(1, data[\u0027listTsmResponse\u0027][\u0027count\u0027])","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        data \u003d self.driver._api_request_for_cloudbyte(\u0027listTsm\u0027, {})"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # assert the data attributes"},{"line_number":768,"context_line":"        self.assertEqual(data[\u0027listTsmResponse\u0027][\u0027count\u0027], 1)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Test - II"},{"line_number":771,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_7abdfb01","line":768,"in_reply_to":"3a961159_7239a93e","updated":"2015-01-05 12:07:53.000000000","message":"Done","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"a207d393f4903e0b4847db3331776279b8a78462","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        data \u003d self.driver._api_request_for_cloudbyte(\u0027listTsm\u0027, {})"},{"line_number":766,"context_line":""},{"line_number":767,"context_line":"        # assert the data attributes"},{"line_number":768,"context_line":"        self.assertEqual(data[\u0027listTsmResponse\u0027][\u0027count\u0027], 1)"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Test - II"},{"line_number":771,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_eda03af6","line":768,"in_reply_to":"3a961159_7abdfb01","updated":"2015-01-06 02:44:08.000000000","message":"Also found this problem in cinder/tests/api/contrib/test_admin_actions.py, cinder/tests/api/contrib/test_backups.py, cinder/tests/api/contrib/test_cgsnapshots.py, ... A lot of places.\n\nThere are bugs tracking this problem: https://bugs.launchpad.net/cinder/+bug/1277104 and https://bugs.launchpad.net/cinder/+bug/1259292.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        self.driver.delete_volume(volume)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"        # assert that 2 api calls were invoked"},{"line_number":810,"context_line":"        self.assertEqual(mock_api_req.call_count, 2)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        # Test-II"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_9248d5cd","line":810,"updated":"2015-01-04 07:04:48.000000000","message":"self.assertEqual(2, mock_api_req.call_count)\n\nPlease fix all other places as well.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":807,"context_line":"        self.driver.delete_volume(volume)"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"        # assert that 2 api calls were invoked"},{"line_number":810,"context_line":"        self.assertEqual(mock_api_req.call_count, 2)"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        # Test-II"},{"line_number":813,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_5a6cbf9d","line":810,"in_reply_to":"3a961159_9248d5cd","updated":"2015-01-05 12:07:53.000000000","message":"Done.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 CloudByte Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_29886870","line":1,"updated":"2015-01-06 12:37:36.000000000","message":"2015:)","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"}],"cinder/volume/drivers/cloudbyte/cloudbyte.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2d7682480dfc3546e4cd4ada6a45b4f081bb80c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_5e99cd1d","line":1,"updated":"2014-06-26 18:27:29.000000000","message":"Copyright Header should be 2014 CloudByte  (not OpenStack Foundation)","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"},{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"209fc30566f94923c03581d9a45957491121d9a3","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":"import httplib"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from cinder import context"},{"line_number":21,"context_line":"from cinder import exception"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_2cea48ac","line":18,"updated":"2014-10-15 08:48:03.000000000","message":"import should be done as alphabetical order. \nthis line should be moved to line 16.","commit_id":"26edd6d9ff1802a762582c5c34eb3295a5717b4a"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"a702368cb2f815ea213d8637c2bcbbf46ee18e62","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import time"},{"line_number":18,"context_line":"import httplib"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from cinder import context"},{"line_number":21,"context_line":"from cinder import exception"}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_3524485f","line":18,"in_reply_to":"baa201ad_2cea48ac","updated":"2014-10-15 09:41:19.000000000","message":"Will do the changes.\n\nHowever, when i run the flake8 locally against these py files, i do not get any issues. \n\nThis the version i am using:\n\u003e flake8 --version\n2.2.4 (pep8: 1.5.7, mccabe: 0.2.1, pyflakes: 0.8.1) CPython 2.7.5+ on Linux\n\nAny suggestion for the version or the way to produce these issues locally in my devstack setup.","commit_id":"26edd6d9ff1802a762582c5c34eb3295a5717b4a"},{"author":{"_account_id":9533,"name":"Eiichi Aikawa","email":"aikawa@mxk.nes.nec.co.jp","username":"EiichiAikawa"},"change_message_id":"209fc30566f94923c03581d9a45957491121d9a3","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder.volume.drivers.cloudbyte.options import ("},{"line_number":24,"context_line":"    cloudbyte_create_volume_opts"},{"line_number":25,"context_line":")"},{"line_number":26,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_add_qosgroup_opts"},{"line_number":27,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_connection_opts"},{"line_number":28,"context_line":"from cinder.volume.drivers.san.san import SanISCSIDriver"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"baa201ad_6cf61091","line":26,"updated":"2014-10-15 08:48:03.000000000","message":"mport should be done as alphabetical order. this line should be moved to line 23.\ntoo long as 1 line.","commit_id":"26edd6d9ff1802a762582c5c34eb3295a5717b4a"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            if value is not None:"},{"line_number":57,"context_line":"                url +\u003d \u0027\u0026\u0027 + key + \u0027\u003d\u0027 + str(value)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        LOG.info(\"CloudByte URL to be executed: %s\", url)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # add the apikey"},{"line_number":62,"context_line":"        url \u003d url + \u0027\u0026apiKey\u003d\u0027 + apikey"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_c80ea53a","line":59,"updated":"2014-10-28 15:06:34.000000000","message":"Need to i18n the string","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # extract the error message from error_data"},{"line_number":68,"context_line":"        error_msg \u003d \"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        for key, value in error_data.iteritems():"},{"line_number":71,"context_line":"            error_msg \u003d value.get(\u0027errortext\u0027)"},{"line_number":72,"context_line":"            break"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_2b456b42","line":70,"updated":"2014-10-28 15:06:34.000000000","message":"not sure why a \u0027for\u0027 loop is used if we\u0027re \u0027break\u0027ing without a check","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _api_request_for_cloudbyte(self, cmd, params, version\u003d\u00271.0\u0027):"},{"line_number":108,"context_line":"        \"\"\"Make http calls to CloudByte.\"\"\""},{"line_number":109,"context_line":"        LOG.info(\"Executing CloudByte API for cmd \" + cmd)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # below are retrieved from /etc/cinder/cinder.conf"},{"line_number":112,"context_line":"        apikey \u003d self.configuration.cb_apikey"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_28001101","line":109,"updated":"2014-10-28 15:06:34.000000000","message":"Need to i18n the string","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                http_status \u003d res_obj[\u0027http_status\u0027]"},{"line_number":145,"context_line":"                # check if it was an error response from CloudByte"},{"line_number":146,"context_line":"                if http_status is not 200:"},{"line_number":147,"context_line":"                    error_msg \u003d (\"Failed executing CloudByte API \" + cmd +"},{"line_number":148,"context_line":"                                 \". Http status: \" + str(http_status) +"},{"line_number":149,"context_line":"                                 \", Error: \") + str(error_details)"},{"line_number":150,"context_line":"                    LOG.error(error_msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_8b081729","line":147,"updated":"2014-10-28 15:06:34.000000000","message":"Need to i18n the string","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                    is_retry_call \u003d False"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        except Exception as ex:"},{"line_number":172,"context_line":"            msg \u003d (\"Error executing CloudByte API %(cmd)s, Error: %(err)s\" %"},{"line_number":173,"context_line":"                   {\u0027cmd\u0027: cmd, \u0027err\u0027: ex})"},{"line_number":174,"context_line":"            LOG.error(msg)"},{"line_number":175,"context_line":"            raise exception.VolumeBackendAPIException(msg)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_6b2cd399","line":172,"updated":"2014-10-28 15:06:34.000000000","message":"Need to i18n the string","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"e0e70db077d77a3e9ef6cdb45ff0ff111bb28632","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        if error_msg is not None:"},{"line_number":178,"context_line":"            raise exception.VolumeBackendAPIException(error_msg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.info(\"CloudByte API executed successfully for cmd \" + cmd)"},{"line_number":181,"context_line":"        return data"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _request_tsm_details(self, account_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9aa7fdbe_8b1f375a","line":180,"updated":"2014-10-28 15:06:34.000000000","message":"Need to i18n the string","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"59137d1ac4fc044a2c34430f861ceeaef2ece623","unresolved":false,"context_lines":[{"line_number":773,"context_line":"                         \"[CloudByte Vol: %(cb_vol)s] \""},{"line_number":774,"context_line":"                         \"[OpenStack Vol: %(stack_vol)s]\","},{"line_number":775,"context_line":"                         {\u0027cb_vol\u0027: cb_volume_id,"},{"line_number":776,"context_line":"                          \u0027stack_vol\u0027: source_volume_id})"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"            else:"},{"line_number":779,"context_line":"                LOG.error(\"CloudByte does not have any volume corresponding \""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_11c2fe58","line":776,"updated":"2014-11-14 06:09:17.000000000","message":"As Rushi has mentioned you need to i18n your error, info etc LOG messages.\nApplies to all the LOG.info and LOG.error messages.\nHere are the guidelines: http://docs.openstack.org/developer/oslo.i18n/guidelines.html","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"59137d1ac4fc044a2c34430f861ceeaef2ece623","unresolved":false,"context_lines":[{"line_number":777,"context_line":""},{"line_number":778,"context_line":"            else:"},{"line_number":779,"context_line":"                LOG.error(\"CloudByte does not have any volume corresponding \""},{"line_number":780,"context_line":"                          \"to OpenStack volume %s\", source_volume_id)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"        else:"},{"line_number":783,"context_line":"            LOG.error(\"CloudByte volume metadata not available for\""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_31b37a0b","line":780,"updated":"2014-11-14 06:09:17.000000000","message":"ditto","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"59137d1ac4fc044a2c34430f861ceeaef2ece623","unresolved":false,"context_lines":[{"line_number":781,"context_line":""},{"line_number":782,"context_line":"        else:"},{"line_number":783,"context_line":"            LOG.error(\"CloudByte volume metadata not available for\""},{"line_number":784,"context_line":"                      \" OpenStack volume %s\", source_volume_id)"},{"line_number":785,"context_line":""},{"line_number":786,"context_line":"    def create_snapshot(self, snapshot):"},{"line_number":787,"context_line":"        \"\"\"Creates a snapshot at CloudByte.\"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_51b806e5","line":784,"updated":"2014-11-14 06:09:17.000000000","message":"ditto","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"8b35141fffe7c531361f58b8243313b128178fa4","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                                      \u0027cmd\u0027: cmd,"},{"line_number":158,"context_line":"                                      \u0027status\u0027: http_status,"},{"line_number":159,"context_line":"                                      \u0027error\u0027: error_details"},{"line_number":160,"context_line":"                                  })"},{"line_number":161,"context_line":"                    LOG.error(error_msg)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"                    # Try again if there was no error message from CloudByte"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_0b3b15ec","line":160,"updated":"2014-11-19 15:30:54.000000000","message":"Use _LE().\nThe log marker functions (_LI(), _LW(), _LE(), and _LC()) must only be used when the message is only sent directly to the log.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"e700c21a58845e65b8c6b7be26d7b355dcd525e1","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                                      \u0027cmd\u0027: cmd,"},{"line_number":158,"context_line":"                                      \u0027status\u0027: http_status,"},{"line_number":159,"context_line":"                                      \u0027error\u0027: error_details"},{"line_number":160,"context_line":"                                  })"},{"line_number":161,"context_line":"                    LOG.error(error_msg)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"                    # Try again if there was no error message from CloudByte"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_fa8f552c","line":160,"in_reply_to":"5a890539_0b3b15ec","updated":"2014-11-20 10:44:58.000000000","message":"The error_msg is thrown as an Exception too. Hence, the current code.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"0940b33fba20c7bfbcdc492eb1dd02516ca8dbc3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                                      \u0027cmd\u0027: cmd,"},{"line_number":158,"context_line":"                                      \u0027status\u0027: http_status,"},{"line_number":159,"context_line":"                                      \u0027error\u0027: error_details"},{"line_number":160,"context_line":"                                  })"},{"line_number":161,"context_line":"                    LOG.error(error_msg)"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"                    # Try again if there was no error message from CloudByte"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_ba3eadd8","line":160,"in_reply_to":"5a890539_fa8f552c","updated":"2014-11-20 11:00:22.000000000","message":"Ahh ok, its used down the line to raise an exception. Looks good then.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"762dc795d23f74ba0675be0d32bdeb7a423f8daf","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_0a5425c8","line":233,"updated":"2014-11-18 11:11:08.000000000","message":"It should be noted that I\u0027m against drivers assigning semantic meaning to metadata. I\u0027m aware the Solidfire driver does a similar thing - I\u0027ll add it to the weekly meeting tomorrow to discuss.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"e51ac017c373b0592dd019b87b94f8cdf5b6e615","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_dbe4b10e","line":233,"in_reply_to":"5a890539_0a5425c8","updated":"2014-11-18 12:22:17.000000000","message":"This kind of direct aliasing seems inappropriate. \n\nHowever, in some form or other the volume metadata dictionary will be categorized s.t. they represent something applicable to the specific driver.\ne.g. We need to categorize metadata into \u0027qos\u0027 and \u0027volume properties\u0027 before executing the appropriate commands on our storage. I feel, this makes the driver code easy to understand.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"d1e576b716bc1629b465e342abed412fb0b24f4b","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_4102900a","line":233,"in_reply_to":"5a890539_16f6105d","updated":"2014-11-18 13:05:25.000000000","message":"Yeah, it\u0027s an old interface with little documentation. \n\nI\u0027ve scheduled discussion at the weekly meeting tomorrow so we can work out a way forward on this.\n\nI notice in the Solidfire case that this behaviour can be turned off with a config option.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"e700c21a58845e65b8c6b7be26d7b355dcd525e1","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_fac83577","line":233,"in_reply_to":"5a890539_4102900a","updated":"2014-11-20 10:44:58.000000000","message":"Hi Duncan,\nI will look forward to your proposal on per-volume interface design or spec as discussed on the cinder meet yesterday. Not sure if I should try the \u0027volume type\u0027 procedure for the current driver implementation. It does not meet our storage backend needs in a clean way.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"36584850b91e850a24e37aa2b90aabb07b268fd5","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_16f6105d","line":233,"in_reply_to":"5a890539_56d6d84f","updated":"2014-11-18 13:02:12.000000000","message":"Ahh. I did not know that metadata was introduced to label volumes.\n\nA per-volume tuning interface will definitely be a good thing to have in OpenStack. This along with dynamic backends will make the cinder more versatile.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"9df2f1b9ac77846172c9be35c8edc0f55402a712","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":232,"context_line":"        # Get the user provided QoS values from volume metadata"},{"line_number":233,"context_line":"        qos_params \u003d self._get_volume_metadata(volume)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        # get additional params from configuration if any"},{"line_number":236,"context_line":"        params \u003d self._override_params(qos_params,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_56d6d84f","line":233,"in_reply_to":"5a890539_dbe4b10e","updated":"2014-11-18 12:44:27.000000000","message":"So metadata started off as a completely free-form key-value store for tenants to label their volumes - it had no meaning at all to cinder. The problem with assigning meaning to it is that it breaks workload portability - what works on one cloud may completely break on another. This is something cinder strives to avoid. \n\nIt may be time for us to investigate a proper, designed per-volume tuning interface, but if so I\u0027d like it to be discoverable, error checked, etc. The weaknesses of a free-form config space have been highlighted by the recent attempts to make volume type creation easier in horizon; I\u0027m strongly opposed to making such problems tenant facing.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                \" create volume [%s] response. \") % volume_name)"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        counter \u003d 1"},{"line_number":337,"context_line":"        while True:"},{"line_number":338,"context_line":"            # wait for n seconds -- mentioned in configuration"},{"line_number":339,"context_line":"            time.sleep(self.configuration.confirm_vol_sleep_interval)"},{"line_number":340,"context_line":"            # query the CloudByte with this jobid"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_cacf6256","line":337,"updated":"2014-11-18 22:34:00.000000000","message":"Safer to do\n\nwhile counter \u003c self.configuration.confirm_vol_sleep_counter:","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def _confirm_creation_cloned_volume(self, volume_name):"},{"line_number":367,"context_line":"        counter \u003d 1"},{"line_number":368,"context_line":"        while True:"},{"line_number":369,"context_line":"            # wait for n seconds"},{"line_number":370,"context_line":"            time.sleep(self.configuration.confirm_vol_sleep_interval)"},{"line_number":371,"context_line":"            # list all volumes from CloudByte"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_0ada4a17","line":368,"updated":"2014-11-18 22:34:00.000000000","message":"Safer to do\n\nwhile counter \u003c self.configuration.confirm_vol_sleep_counter:","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        if cloned_volume_name is None or cloned_volume_name \u003d\u003d \u0027\u0027:"},{"line_number":932,"context_line":"            cloned_volume_name \u003d self._generate_clone_name()"},{"line_number":933,"context_line":""},{"line_number":934,"context_line":"        # openstack snapshot id"},{"line_number":935,"context_line":"        snapshot_id \u003d snapshot[\u0027id\u0027]"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"        # get admin context"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_6a7d8ee7","line":934,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":934,"context_line":"        # openstack snapshot id"},{"line_number":935,"context_line":"        snapshot_id \u003d snapshot[\u0027id\u0027]"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"        # get admin context"},{"line_number":938,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"        # Create volume/clone metadata before clone creation."}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_8a82bac6","line":937,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":940,"context_line":"        # Create volume/clone metadata before clone creation."},{"line_number":941,"context_line":"        volume_metadata \u003d {\"cb_volume_id\": \u0027None\u0027}"},{"line_number":942,"context_line":""},{"line_number":943,"context_line":"        # store metadata related to clone"},{"line_number":944,"context_line":"        self.db.volume_admin_metadata_update("},{"line_number":945,"context_line":"            ctxt, cloned_volume_id, volume_metadata, False)"},{"line_number":946,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_ea689e23","line":943,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":948,"context_line":"        volume_admin_metadata \u003d self.db.volume_admin_metadata_get("},{"line_number":949,"context_line":"            ctxt, parent_volume_id)"},{"line_number":950,"context_line":""},{"line_number":951,"context_line":"        # get CloudByte volume id"},{"line_number":952,"context_line":"        cb_volume_id \u003d volume_admin_metadata[\u0027cb_volume_id\u0027]"},{"line_number":953,"context_line":""},{"line_number":954,"context_line":"        # get CloudByte snapshot path"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_0a76ca06","line":951,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"    def delete_snapshot(self, snapshot):"},{"line_number":1001,"context_line":"        \"\"\"Delete a snapshot at CloudByte.\"\"\""},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"        # getting admin context to get \u0026 update volume_admin_metadata"},{"line_number":1004,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        # find source volume id"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_aa5e9674","line":1003,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":1003,"context_line":"        # getting admin context to get \u0026 update volume_admin_metadata"},{"line_number":1004,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"        # find source volume id"},{"line_number":1007,"context_line":"        source_volume_id \u003d snapshot[\u0027volume_id\u0027]"},{"line_number":1008,"context_line":""},{"line_number":1009,"context_line":"        # get volume admin metadata"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_ca520268","line":1006,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"    def extend_volume(self, volume, new_size):"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"        # get admin context"},{"line_number":1067,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"        # find volume id"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_0a4deac4","line":1066,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"    def update_volume_metadata(self, volume, metadata):"},{"line_number":1087,"context_line":"        params \u003d {}"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"        # get admin context"},{"line_number":1090,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":"        # find source volume id"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_2a4aa6ac","line":1089,"updated":"2014-11-18 22:34:00.000000000","message":"Redundant comment","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"473201ad98a5a1ff22d6e72e01388062100b8479","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def _get_url(self, cmd, params, apikey):"},{"line_number":54,"context_line":"        \"\"\"Will prepare URL that connects to CloudByte.\"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        url \u003d (\u0027/client/api?\u0027 + \u0027command\u003d\u0027 + cmd + \u0027\u0026response\u003djson\u0027)"},{"line_number":57,"context_line":"        for key in params:"},{"line_number":58,"context_line":"            value \u003d params[key]"},{"line_number":59,"context_line":"            if value is not None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_02425c3d","line":56,"updated":"2014-12-04 11:31:20.000000000","message":"Please, use urllib.urlencode here","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"473201ad98a5a1ff22d6e72e01388062100b8479","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        res_details \u003d {}"},{"line_number":86,"context_line":"        try:"},{"line_number":87,"context_line":"            # prepare the connection"},{"line_number":88,"context_line":"            connection \u003d httplib.HTTPSConnection(host)"},{"line_number":89,"context_line":"            # make the connection"},{"line_number":90,"context_line":"            connection.request(\u0027GET\u0027, url)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_6243203f","line":87,"updated":"2014-12-04 11:31:20.000000000","message":"Do we need some exception handling here?","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"a17d5aad669b771cc067cdd3b29cd5f720e0cf7d","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        res_details \u003d {}"},{"line_number":86,"context_line":"        try:"},{"line_number":87,"context_line":"            # prepare the connection"},{"line_number":88,"context_line":"            connection \u003d httplib.HTTPSConnection(host)"},{"line_number":89,"context_line":"            # make the connection"},{"line_number":90,"context_line":"            connection.request(\u0027GET\u0027, url)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_f997f28d","line":87,"in_reply_to":"5a890539_6243203f","updated":"2014-12-12 08:03:47.000000000","message":"The caller to this method handles the exception.","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"473201ad98a5a1ff22d6e72e01388062100b8479","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            res_obj \u003d {}"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"            while is_first_call or is_retry_call:"},{"line_number":139,"context_line":"                # reset the first call"},{"line_number":140,"context_line":"                is_first_call \u003d False"},{"line_number":141,"context_line":"                # reset the error message"},{"line_number":142,"context_line":"                error_msg \u003d None"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_a29fc8b2","line":139,"updated":"2014-12-04 11:31:20.000000000","message":"IMO, such detailed comments make code unreadable","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7e56b3210e12bb9d13d2f91de31218adc42453e7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                http_status \u003d res_obj[\u0027http_status\u0027]"},{"line_number":151,"context_line":"                # check if it was an error response from CloudByte"},{"line_number":152,"context_line":"                if http_status is not 200:"},{"line_number":153,"context_line":"                    error_msg \u003d (_(\"Failed to execute CloudByte API [%(cmd)s].\""},{"line_number":154,"context_line":"                                   \" Http status: %(status)s,\""},{"line_number":155,"context_line":"                                   \" Error: %(error)s\") %"},{"line_number":156,"context_line":"                                 {\u0027cmd\u0027: cmd, \u0027status\u0027: http_status,"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_4daefa30","line":153,"updated":"2014-11-28 21:23:19.000000000","message":"Need _LE marker.","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"a17d5aad669b771cc067cdd3b29cd5f720e0cf7d","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                http_status \u003d res_obj[\u0027http_status\u0027]"},{"line_number":151,"context_line":"                # check if it was an error response from CloudByte"},{"line_number":152,"context_line":"                if http_status is not 200:"},{"line_number":153,"context_line":"                    error_msg \u003d (_(\"Failed to execute CloudByte API [%(cmd)s].\""},{"line_number":154,"context_line":"                                   \" Http status: %(status)s,\""},{"line_number":155,"context_line":"                                   \" Error: %(error)s\") %"},{"line_number":156,"context_line":"                                 {\u0027cmd\u0027: cmd, \u0027status\u0027: http_status,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a961159_79d2225d","line":153,"in_reply_to":"5a890539_4daefa30","updated":"2014-12-12 08:03:47.000000000","message":"The same error_msg is used in the raise exception.VolumeBackendAPIException code block later down the line.","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"473201ad98a5a1ff22d6e72e01388062100b8479","unresolved":false,"context_lines":[{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        volume_id \u003d None"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        for vol in volumes:"},{"line_number":558,"context_line":"            if vol[\u0027id\u0027] \u003d\u003d cb_volume_id:"},{"line_number":559,"context_line":"                volume_id \u003d vol[\u0027id\u0027]"},{"line_number":560,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_62dfa066","line":557,"updated":"2014-12-04 11:31:20.000000000","message":"A lot of almost equal code to search in a list of dicts. Need to rethink it and move to function","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"473201ad98a5a1ff22d6e72e01388062100b8479","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        # tricks to get the volume name just for better user experience"},{"line_number":595,"context_line":"        volume_name \u003d None"},{"line_number":596,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":597,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"},{"line_number":598,"context_line":"        else:"},{"line_number":599,"context_line":"            volume_name \u003d volume[\u0027id\u0027].replace(\"-\", \"\")"},{"line_number":600,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_c23e948a","line":597,"updated":"2014-12-04 11:31:20.000000000","message":"if not volume[\u0027display_name\u0027]","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7e56b3210e12bb9d13d2f91de31218adc42453e7","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            data \u003d {}"},{"line_number":1034,"context_line":""},{"line_number":1035,"context_line":"            data[\u0027total_capacity_gb\u0027] \u003d float(\"inf\")"},{"line_number":1036,"context_line":"            data[\u0027free_capacity_gb\u0027] \u003d float(\"inf\")"},{"line_number":1037,"context_line":"            data[\"volume_backend_name\"] \u003d ("},{"line_number":1038,"context_line":"                self.configuration.volume_backend_name)"},{"line_number":1039,"context_line":"            data[\"vendor_name\"] \u003d \u0027CloudByte\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"5a890539_2d48ce86","line":1036,"updated":"2014-11-28 21:23:19.000000000","message":"Setting capacities to infinite is not recommended in Cinder any more because this could lead to over provisioning. Back-ends which report infinite are given the lowest weight (just above 0) since Juno.  There\u0027s work going on to have driver report virtual capacity, etc. See spec: https://review.openstack.org/#/c/129342/.  It is still WIP, so just  FYI.","commit_id":"94d576849acbfd3a2f837ebc59aa145e63e3de3c"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        LOG.info(_LI(\"CloudByte URL to be executed: %s\"), url)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        # add the apikey"},{"line_number":76,"context_line":"        url \u003d url + \u0027\u0026apiKey\u003d\u0027 + apikey"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        return url"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_b5b29be2","line":76,"updated":"2014-12-15 07:10:46.000000000","message":"apikey might also need urlencoding.","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        error_msg \u003d \"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        keys \u003d list(error_data)"},{"line_number":85,"context_line":"        if keys is not None and len(keys) \u003e 0:"},{"line_number":86,"context_line":"            # error_data is a single key value dict"},{"line_number":87,"context_line":"            msg \u003d error_data.get(keys[0])"},{"line_number":88,"context_line":"            # we are interested for the error"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_35d5cbe4","line":85,"updated":"2014-12-15 07:10:46.000000000","message":"keys cannot be None, atleast in Python 3. It can either be an empty list or non-empty. So:\n\n if not keys:\n\nor\n\n if len(keys) \u003e 0\n\nshould suffice as the only condition in the \u0027if\u0027 statement","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        keys \u003d list(error_data)"},{"line_number":85,"context_line":"        if keys is not None and len(keys) \u003e 0:"},{"line_number":86,"context_line":"            # error_data is a single key value dict"},{"line_number":87,"context_line":"            msg \u003d error_data.get(keys[0])"},{"line_number":88,"context_line":"            # we are interested for the error"},{"line_number":89,"context_line":"            error_msg \u003d msg.get(\u0027errortext\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_55e097cc","line":86,"updated":"2014-12-15 07:10:46.000000000","message":"this comment can be moved 2-3 lines above, for better readability..","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return error_msg"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _get_response_details(self, host, url):"},{"line_number":94,"context_line":"        \"\"\"Will prepare response after executing an http request.\"\"\""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        res_details \u003d {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_75311359","line":93,"updated":"2014-12-15 07:10:46.000000000","message":"can be named better, something like _execute_and_get_response_details? Just improves readability, so feel free to ignore","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        return res_details"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _api_request_for_cloudbyte(self, cmd, params, version\u003d\u00271.0\u0027):"},{"line_number":125,"context_line":"        \"\"\"Make http calls to CloudByte.\"\"\""},{"line_number":126,"context_line":"        LOG.info(_LI(\"Executing CloudByte API for command [%s]\"), cmd)"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_5515f799","line":124,"updated":"2014-12-15 07:10:46.000000000","message":"default argument (here \u00271.0\u0027,) shouldn\u0027t be a mutable object. You can make it version\u003dNone, and then set it to \u00271.0\u0027 using a conditional inside the method..","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"                # check if it was an error response from CloudByte"},{"line_number":162,"context_line":"                if http_status is not 200:"},{"line_number":163,"context_line":"                    error_msg \u003d (_(\"Failed to execute CloudByte API [%(cmd)s].\""},{"line_number":164,"context_line":"                                   \" Http status: %(status)s,\""},{"line_number":165,"context_line":"                                   \" Error: %(error)s\") %"},{"line_number":166,"context_line":"                                 {\u0027cmd\u0027: cmd, \u0027status\u0027: http_status,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_358dcbd3","line":163,"updated":"2014-12-15 07:10:46.000000000","message":"Need _LE marker here","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                    is_retry_call \u003d False"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        except Exception as ex:"},{"line_number":188,"context_line":"            msg \u003d (_(\"Error executing CloudByte API [%(cmd)s], \""},{"line_number":189,"context_line":"                     \"Error: %(err)s\") %"},{"line_number":190,"context_line":"                   {\u0027cmd\u0027: cmd, \u0027err\u0027: ex})"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f5ad0332","line":188,"updated":"2014-12-15 07:10:46.000000000","message":"_LE marker required here","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        if error_msg is not None:"},{"line_number":196,"context_line":"            raise exception.VolumeBackendAPIException(error_msg)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        LOG.info(_LI(\"CloudByte API executed successfully for command [%s]\"),"},{"line_number":199,"context_line":"                 cmd)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_956cbf09","line":198,"updated":"2014-12-15 07:10:46.000000000","message":"can end with a dot if you like...","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"listTsm\", params)"},{"line_number":210,"context_line":"        return data"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def _override_params(self, filtered_user_dict, default_dict):"},{"line_number":213,"context_line":"        \"\"\"This method fetches default config values from configuration file."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        These default values are overridden with user provided values."}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_188f2676","line":212,"updated":"2014-12-15 07:10:46.000000000","message":"it\u0027d be slightly more readable, here, and wherever this method is called, if positions of filtered_user_dict and default_dict is reversed.. I got confused later on when I saw this method..","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        These default values are overridden with user provided values."},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        if filtered_user_dict is None or len(filtered_user_dict) \u003d\u003d 0:"},{"line_number":219,"context_line":"            # Nothing to override"},{"line_number":220,"context_line":"            return default_dict"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f5098331","line":218,"updated":"2014-12-15 07:10:46.000000000","message":"I would suggest you write:\n\n if not filtered_user_dict:\n\n(assuming it is a dict). \u0027filtered_user_dict is None\u0027 doesn\u0027t catch if filtered_user_dict \u003d {}","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        # Do not override default_dict"},{"line_number":223,"context_line":"        new_opts_dict \u003d {}"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        for key, value in default_dict.iteritems():"},{"line_number":226,"context_line":"            # fill the dict with default options"},{"line_number":227,"context_line":"            if value is not None:"},{"line_number":228,"context_line":"                new_opts_dict[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_58028e0a","line":225,"updated":"2014-12-15 07:10:46.000000000","message":"items() can be used instead of iteritems() for py3 compatibility. We\u0027re not enforcing this now I think, so you can skip it if you want","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        for key, value in default_dict.iteritems():"},{"line_number":226,"context_line":"            # fill the dict with default options"},{"line_number":227,"context_line":"            if value is not None:"},{"line_number":228,"context_line":"                new_opts_dict[key] \u003d value"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # iterate the user provided dict \u0026 override the new dict"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_b80b7222","line":227,"updated":"2014-12-15 07:10:46.000000000","message":"can \u0027value\u0027 be an empty string? If yes, it\u0027d make more sense to use\n\n if not value:","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                new_opts_dict[key] \u003d value"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        # iterate the user provided dict \u0026 override the new dict"},{"line_number":231,"context_line":"        for key, value in filtered_user_dict.iteritems():"},{"line_number":232,"context_line":"            # override the default dict with user provided dict"},{"line_number":233,"context_line":"            if value is not None:"},{"line_number":234,"context_line":"                new_opts_dict[key] \u003d value"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_382ea28c","line":231,"updated":"2014-12-15 07:10:46.000000000","message":"same recommendation as above regarding iteritems","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        # get qos related params from configuration"},{"line_number":241,"context_line":"        params \u003d self.configuration.add_qosgroup"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        if params is None:"},{"line_number":244,"context_line":"            params \u003d {}"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        params[\u0027name\u0027] \u003d \"QoS_\" + volume_name"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f8ac1aef","line":243,"updated":"2014-12-15 07:10:46.000000000","message":"I\u0027m not sure, but if type of add_qosgroup is dict, there is no chance it will be set to None","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        if vol_res is None:"},{"line_number":298,"context_line":"            raise exception.VolumeBackendAPIException(_("},{"line_number":299,"context_line":"                \"Error: Null response received while creating volume [%s] \""},{"line_number":300,"context_line":"                \"at CloudByte. \") % volume_name)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"        jobid \u003d vol_res.get(\u0027jobid\u0027)"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_b8cc52bc","line":300,"updated":"2014-12-15 07:10:46.000000000","message":"space not needed if it is end of string","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        if jobid is None:"},{"line_number":305,"context_line":"            raise exception.VolumeBackendAPIException(_("},{"line_number":306,"context_line":"                \"Error: Jobid not found in CloudByte\u0027s \""},{"line_number":307,"context_line":"                \" create volume [%s] response. \") % volume_name)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        counter \u003d 1"},{"line_number":310,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_d8c67e99","line":307,"updated":"2014-12-15 07:10:46.000000000","message":"ditto","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"            elif counter \u003d\u003d self.configuration.confirm_volume_create_retries:"},{"line_number":328,"context_line":"                # All attempts exhausted"},{"line_number":329,"context_line":"                msg \u003d _(\"Delay or Error in creating volume [%s] in \""},{"line_number":330,"context_line":"                        \"CloudByte storage.\") % volume_name"},{"line_number":331,"context_line":"                LOG.error(msg)"},{"line_number":332,"context_line":"                raise exception.VolumeBackendAPIException(msg)"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_783d8a8e","line":329,"updated":"2014-12-15 07:10:46.000000000","message":"need _LE marker","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            \u0027%s %s %s\u0027 % (volume[\u0027ipaddress\u0027] + \u0027:3260\u0027, volume[\u0027iqnname\u0027], 0)"},{"line_number":414,"context_line":"        )"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP %s %s\u0027 % (None, None))"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"        LOG.debug(\"CloudByte volume [%(vol)s] properties: [%(props)s]\" %"},{"line_number":419,"context_line":"                  {\u0027vol\u0027: volume[\u0027iqnname\u0027], \u0027props\u0027: model_update})"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_582fee3e","line":416,"updated":"2014-12-15 07:10:46.000000000","message":"why not just write \u0027CHAP None None\u0027 instead of string substitution?","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        # tricks to get the volume name just for better user experience"},{"line_number":643,"context_line":"        volume_name \u003d None"},{"line_number":644,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":645,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"},{"line_number":646,"context_line":"        else:"},{"line_number":647,"context_line":"            volume_name \u003d volume[\u0027id\u0027].replace(\"-\", \"\")"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_18f006c8","line":644,"updated":"2014-12-15 07:10:46.000000000","message":"can be written as one conditional, like so:\n\n if not volume[\u0027display_name\u0027]:","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"f18c284ceaa37b9bfec754ab632360afc1c60369","unresolved":false,"context_lines":[{"line_number":711,"context_line":""},{"line_number":712,"context_line":"        # update volume id in volume_admin_metadata"},{"line_number":713,"context_line":"        self.db.volume_admin_metadata_update("},{"line_number":714,"context_line":"            ctxt, volume[\u0027id\u0027], admin_metadata, False)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # provide the model after successful completion of above steps"},{"line_number":717,"context_line":"        provider \u003d self._build_provider_details_from_response("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_d8283ee4","line":714,"updated":"2014-12-15 05:58:04.000000000","message":"Why do we need to save the id in the admin metadata?   It\u0027s not a hard rule, but generally frowned upon touching the DB from inside a driver unless there is absolutely no other option.","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"8dc933c5dbf4557190cca78e9d767f696c3c4d97","unresolved":false,"context_lines":[{"line_number":711,"context_line":""},{"line_number":712,"context_line":"        # update volume id in volume_admin_metadata"},{"line_number":713,"context_line":"        self.db.volume_admin_metadata_update("},{"line_number":714,"context_line":"            ctxt, volume[\u0027id\u0027], admin_metadata, False)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # provide the model after successful completion of above steps"},{"line_number":717,"context_line":"        provider \u003d self._build_provider_details_from_response("}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f886dab7","line":714,"in_reply_to":"3a961159_d8283ee4","updated":"2014-12-15 06:15:15.000000000","message":"The driver does a mapping of the id understood by OpenStack w.r.t the id or path understood at the storage backend.\n\nIf there is any other alternative to achieve above, we will implement the same.","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":981,"context_line":"        source_volume_id \u003d snapshot[\u0027volume_id\u0027]"},{"line_number":982,"context_line":""},{"line_number":983,"context_line":"        # get volume admin metadata"},{"line_number":984,"context_line":"        adminmetadata \u003d self.db.volume_admin_metadata_get("},{"line_number":985,"context_line":"            ctxt, source_volume_id)"},{"line_number":986,"context_line":""},{"line_number":987,"context_line":"        # get the CloudByte volume that was mapped with openstack volume"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_53dfcfd5","line":984,"updated":"2014-12-15 07:10:46.000000000","message":"I am not remembering if db access in driver was okayed in an older meeting. This is a read-only operation so shouldn\u0027t be an issue I guess, but still leaving a comment to bring it to notice of cores, if this is an issue..","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"f18c284ceaa37b9bfec754ab632360afc1c60369","unresolved":false,"context_lines":[{"line_number":1084,"context_line":"            data \u003d self._get_storage_info(tsm_name)"},{"line_number":1085,"context_line":""},{"line_number":1086,"context_line":"            data[\"volume_backend_name\"] \u003d ("},{"line_number":1087,"context_line":"                self.configuration.volume_backend_name)"},{"line_number":1088,"context_line":"            data[\"vendor_name\"] \u003d \u0027CloudByte\u0027"},{"line_number":1089,"context_line":"            data[\u0027reserved_percentage\u0027] \u003d 0"},{"line_number":1090,"context_line":"            data[\"driver_version\"] \u003d CloudByteISCSIDriver.VERSION"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_d8567e5b","line":1087,"updated":"2014-12-15 05:58:04.000000000","message":"and if volume_backend_name isn\u0027t set?   \n\nthis line is typically like this.\n\nbackend_name \u003d self.configuration.safe_get(\u0027volume_backend_name\u0027)\nstats[\u0027volume_backend_name\u0027] \u003d (backend_name or\n                                            self.__class__.__name__)","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"f18c284ceaa37b9bfec754ab632360afc1c60369","unresolved":false,"context_lines":[{"line_number":1088,"context_line":"            data[\"vendor_name\"] \u003d \u0027CloudByte\u0027"},{"line_number":1089,"context_line":"            data[\u0027reserved_percentage\u0027] \u003d 0"},{"line_number":1090,"context_line":"            data[\"driver_version\"] \u003d CloudByteISCSIDriver.VERSION"},{"line_number":1091,"context_line":"            data[\"storage_protocol\"] \u003d \u0027iSCSI\u0027"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"            LOG.info(_LI(\"CloudByte driver stats: [%s]\"), data)"},{"line_number":1094,"context_line":"            # set this to the instance variable"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_18764606","line":1091,"updated":"2014-12-15 05:58:04.000000000","message":"You are missing a  few items here\ntotal_capacity_gb\nfree_capacity_gb","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"04cacb13e8404f9ba248da6eede122e2a2cb3841","unresolved":false,"context_lines":[{"line_number":1088,"context_line":"            data[\"vendor_name\"] \u003d \u0027CloudByte\u0027"},{"line_number":1089,"context_line":"            data[\u0027reserved_percentage\u0027] \u003d 0"},{"line_number":1090,"context_line":"            data[\"driver_version\"] \u003d CloudByteISCSIDriver.VERSION"},{"line_number":1091,"context_line":"            data[\"storage_protocol\"] \u003d \u0027iSCSI\u0027"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"            LOG.info(_LI(\"CloudByte driver stats: [%s]\"), data)"},{"line_number":1094,"context_line":"            # set this to the instance variable"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f3dfdb66","line":1091,"in_reply_to":"3a961159_18764606","updated":"2014-12-15 06:26:01.000000000","message":"total_capacity_gb \u0026 free_capacity_gb are set when _get_storage_info is called.","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import exception"},{"line_number":23,"context_line":"from cinder.i18n import _"},{"line_number":24,"context_line":"from cinder.i18n import _LE"},{"line_number":25,"context_line":"from cinder.i18n import _LI"},{"line_number":26,"context_line":"from cinder.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_c1ed6927","line":23,"updated":"2014-12-16 21:58:10.000000000","message":"The cinder.i18n imports could be collapsed into one line.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b4b5085ec34d833155a01dfb6e4eacc3de5b7428","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import exception"},{"line_number":23,"context_line":"from cinder.i18n import _"},{"line_number":24,"context_line":"from cinder.i18n import _LE"},{"line_number":25,"context_line":"from cinder.i18n import _LI"},{"line_number":26,"context_line":"from cinder.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_3f02a109","line":23,"in_reply_to":"3a961159_4e4a7628","updated":"2014-12-17 18:58:06.000000000","message":"Strange, you must be in an older version of the source tree.  This is not a show stopper.  If you can please address the other issues so we can get this merged.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"b023f4a39f62e7c3a6240d7a2190b34b71aec93a","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import exception"},{"line_number":23,"context_line":"from cinder.i18n import _"},{"line_number":24,"context_line":"from cinder.i18n import _LE"},{"line_number":25,"context_line":"from cinder.i18n import _LI"},{"line_number":26,"context_line":"from cinder.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_4e4a7628","line":23,"in_reply_to":"3a961159_c1ed6927","updated":"2014-12-17 06:52:57.000000000","message":"Hi Jay,\n\nI get flake8 error: H301 one import per line.\n\nThis was from my laptop which has below version of flake:\n\n$ flake8 --version\n2.1.0 (pep8: 1.5.6, pyflakes: 0.8.1, hacking.core: 0.0.1, GitCheckCommitTitlePer\niodEnding: 0.0.1, ProxyChecker: 0.0.1, GitCheckCommitTitleBug: 0.0.1, GitCheckCo\nmmitTitleLength: 0.0.1, mccabe: 0.2.1) CPython 3.3.2 on Windows","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return url"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _extract_http_error(self, error_data):"},{"line_number":83,"context_line":"        # extract the error message from error_data"},{"line_number":84,"context_line":"        error_msg \u003d \"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # error_data is a single key value dict"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_05885a21","line":83,"updated":"2014-12-16 22:04:58.000000000","message":"Please make the first letter capital in all the comments.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _api_request_for_cloudbyte(self, cmd, params, version\u003dNone):"},{"line_number":127,"context_line":"        \"\"\"Make http calls to CloudByte.\"\"\""},{"line_number":128,"context_line":"        LOG.info(_LI(\"Executing CloudByte API for command [%s]\"), cmd)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        if version is None:"},{"line_number":131,"context_line":"            version \u003d CloudByteISCSIDriver.VERSION"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_a536a6e5","line":128,"updated":"2014-12-16 21:58:10.000000000","message":"Could end this with \u0027.\u0027 to be consistent with elsewhere.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"84e54861ac557c642f84a9e28475b62f27251e3f","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                    # \u0026 it was not a success as well on its first attempt."},{"line_number":183,"context_line":"                    if error_details is None and not is_retry_call:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"                        time.sleep(2)"},{"line_number":186,"context_line":"                        is_retry_call \u003d True"},{"line_number":187,"context_line":"                        LOG.debug(\"Will retry CloudByte API for command [%s].\","},{"line_number":188,"context_line":"                                  cmd)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_e8ba4509","line":185,"updated":"2014-12-16 22:02:52.000000000","message":"You should not use sleep.  This blocks the thread/process from servicing other requests.\n\nPlease look into using the \nfrom cinder.openstack.common import loopingcall \nloopingcall.FixedIntervalLoopingCall() for this mechanism.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3261b83538b5e56dcc308c3a3a8b1c4f5eb03759","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                    # \u0026 it was not a success as well on its first attempt."},{"line_number":183,"context_line":"                    if error_details is None and not is_retry_call:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"                        time.sleep(2)"},{"line_number":186,"context_line":"                        is_retry_call \u003d True"},{"line_number":187,"context_line":"                        LOG.debug(\"Will retry CloudByte API for command [%s].\","},{"line_number":188,"context_line":"                                  cmd)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_9c8803c8","line":185,"in_reply_to":"3a961159_73e0f2cc","updated":"2014-12-17 18:43:28.000000000","message":"We just fixed a bug in the a wait routine that uses loopingcall. Take a look. Hope it helps:\n\nhttps://review.openstack.org/#/c/138878/5/cinder/volume/drivers/emc/emc_vmax_utils.py","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"28fc22420b76a9311ad3260f6ba7b7bc5134f0e6","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                    # \u0026 it was not a success as well on its first attempt."},{"line_number":183,"context_line":"                    if error_details is None and not is_retry_call:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"                        time.sleep(2)"},{"line_number":186,"context_line":"                        is_retry_call \u003d True"},{"line_number":187,"context_line":"                        LOG.debug(\"Will retry CloudByte API for command [%s].\","},{"line_number":188,"context_line":"                                  cmd)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_73e0f2cc","line":185,"in_reply_to":"3a961159_e8ba4509","updated":"2014-12-17 11:28:20.000000000","message":"Thanks for the suggestion. I searched over couple of openstack commits but could not understand the right usage of this method.\nMay be some examples!!\n\nWhere should i call the start method of FixedIntervalLoopingCall?\nI understand that LoopingCallDone will stop it.\n\nI went through below commit but still am confused with the overall logic.\n\nhttps://review.openstack.org/#/c/50984/1/cinder/volume/drivers/storwize_svc.py","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        counter \u003d 1"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        retry_interval \u003d \\"},{"line_number":321,"context_line":"            self.configuration.cb_confirm_volume_create_retry_interval"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        no_of_retries \u003d \\"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_85c36a89","line":320,"updated":"2014-12-16 21:58:10.000000000","message":"Would prefer to have these wrapped with ()","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            self.configuration.cb_confirm_volume_create_retry_interval"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        no_of_retries \u003d \\"},{"line_number":324,"context_line":"            self.configuration.cb_confirm_volume_create_retries"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        while True:"},{"line_number":327,"context_line":"            # wait for n seconds -- mentioned in configuration"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_e5ba6e09","line":324,"updated":"2014-12-16 21:58:10.000000000","message":"Same here","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        no_of_retries \u003d \\"},{"line_number":324,"context_line":"            self.configuration.cb_confirm_volume_create_retries"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        while True:"},{"line_number":327,"context_line":"            # wait for n seconds -- mentioned in configuration"},{"line_number":328,"context_line":"            time.sleep(retry_interval)"},{"line_number":329,"context_line":"            # query the CloudByte with this jobid"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_055e9ae9","line":326,"updated":"2014-12-16 21:58:10.000000000","message":"This really should be implemented as a fixed interval loopingcall.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"84e54861ac557c642f84a9e28475b62f27251e3f","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        no_of_retries \u003d \\"},{"line_number":324,"context_line":"            self.configuration.cb_confirm_volume_create_retries"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        while True:"},{"line_number":327,"context_line":"            # wait for n seconds -- mentioned in configuration"},{"line_number":328,"context_line":"            time.sleep(retry_interval)"},{"line_number":329,"context_line":"            # query the CloudByte with this jobid"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_68465525","line":326,"in_reply_to":"3a961159_055e9ae9","updated":"2014-12-16 22:02:52.000000000","message":"agreed, replace this with loopingcall.FixedIntervalLoopingCall","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        while True:"},{"line_number":327,"context_line":"            # wait for n seconds -- mentioned in configuration"},{"line_number":328,"context_line":"            time.sleep(retry_interval)"},{"line_number":329,"context_line":"            # query the CloudByte with this jobid"},{"line_number":330,"context_line":"            volume_response \u003d self._queryAsyncJobResult_request(jobid)"},{"line_number":331,"context_line":"            # check the status"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_458342cc","line":328,"updated":"2014-12-16 22:04:58.000000000","message":"Suggest change this to use loopingcall instead of sleep because loopingcall is non-blocking. Can be done in a later patch.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                status \u003d result_res.get(\u0027jobstatus\u0027)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"            if status \u003d\u003d 1:"},{"line_number":339,"context_line":"                LOG.debug(\"Volume [%s] created successfully in \""},{"line_number":340,"context_line":"                          \"CloudByte storage.\", volume_name)"},{"line_number":341,"context_line":"                break"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_65467e25","line":339,"updated":"2014-12-16 21:58:10.000000000","message":"This would be good as a LOG.info","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":355,"context_line":"    def _confirm_creation_cloned_volume(self, volume_name):"},{"line_number":356,"context_line":"        counter \u003d 1"},{"line_number":357,"context_line":"        retry_interval \u003d \\"},{"line_number":358,"context_line":"            self.configuration.cb_confirm_volume_create_retry_interval"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        no_of_retries \u003d \\"},{"line_number":361,"context_line":"            self.configuration.cb_confirm_volume_create_retries"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_4558a2fa","line":358,"updated":"2014-12-16 21:58:10.000000000","message":"Use ()","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            self.configuration.cb_confirm_volume_create_retry_interval"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        no_of_retries \u003d \\"},{"line_number":361,"context_line":"            self.configuration.cb_confirm_volume_create_retries"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        while True:"},{"line_number":364,"context_line":"            # wait for n seconds"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_655d9ee9","line":361,"updated":"2014-12-16 21:58:10.000000000","message":"Use  ()","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":361,"context_line":"            self.configuration.cb_confirm_volume_create_retries"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        while True:"},{"line_number":364,"context_line":"            # wait for n seconds"},{"line_number":365,"context_line":"            time.sleep(retry_interval)"},{"line_number":366,"context_line":"            # list all volumes from CloudByte"},{"line_number":367,"context_line":"            cb_volumes \u003d self._api_request_for_cloudbyte(\u0027listFileSystem\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_c56bb283","line":364,"updated":"2014-12-16 21:58:10.000000000","message":"Looping call here as well.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        while True:"},{"line_number":364,"context_line":"            # wait for n seconds"},{"line_number":365,"context_line":"            time.sleep(retry_interval)"},{"line_number":366,"context_line":"            # list all volumes from CloudByte"},{"line_number":367,"context_line":"            cb_volumes \u003d self._api_request_for_cloudbyte(\u0027listFileSystem\u0027,"},{"line_number":368,"context_line":"                                                         params\u003d{})"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_45b6e28b","line":365,"updated":"2014-12-16 22:04:58.000000000","message":"Same suggestion here.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":372,"context_line":""},{"line_number":373,"context_line":"            if volume_id is not None:"},{"line_number":374,"context_line":"                LOG.debug(\"Volume [%s] was created successfully \""},{"line_number":375,"context_line":"                          \"in CloudByte.\", volume_name)"},{"line_number":376,"context_line":"                break"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"            elif counter \u003d\u003d no_of_retries:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_0505bac1","line":375,"updated":"2014-12-16 21:58:10.000000000","message":"LOG.info","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":606,"context_line":"        return snapshot_name"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    def _get_storage_info(self, tsmname):"},{"line_number":609,"context_line":"        \"\"\"Get CloudByte tsm that is associated with openstack.\"\"\""},{"line_number":610,"context_line":""},{"line_number":611,"context_line":"        # list all tsms from CloudByte"},{"line_number":612,"context_line":"        tsm_list \u003d self._api_request_for_cloudbyte(\u0027listTsm\u0027, params\u003d{})"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_456d0204","line":609,"updated":"2014-12-16 22:04:58.000000000","message":"OpenStack","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":636,"context_line":""},{"line_number":637,"context_line":"                data[\u0027total_capacity_gb\u0027] \u003d quota"},{"line_number":638,"context_line":"                data[\u0027free_capacity_gb\u0027] \u003d ("},{"line_number":639,"context_line":"                    int(int(tsms[\u0027availablequota\u0027]) / 1000))"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        # tsm not found in CloudByte"},{"line_number":642,"context_line":"        if flag \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_083791b1","line":639,"updated":"2014-12-16 22:04:58.000000000","message":"Do you need to cast twice here?  Cast it once should be sufficient.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        # extract the qos group id from response"},{"line_number":688,"context_line":"        qosgroupid \u003d qos_data[\u0027addqosgroupresponse\u0027][\u0027qosgroup\u0027][\u0027id\u0027]"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        LOG.debug(\"Successfully created qos group for CloudByte volume [%s]\","},{"line_number":691,"context_line":"                  volume_name)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"        # Send a create volume request to CloudByte API"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_85da8ae7","line":690,"updated":"2014-12-16 21:58:10.000000000","message":"Should end with \u0027.\u0027 for consistency.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":722,"context_line":"        ig_id \u003d self._get_initiator_group_id_from_response("},{"line_number":723,"context_line":"            iscsi_initiator_data)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"        LOG.debug(\"Updating iscsi service for CloudByte volume [%s]\","},{"line_number":726,"context_line":"                  volume_name)"},{"line_number":727,"context_line":""},{"line_number":728,"context_line":"        # update the iscsi service with above fetched iscsi_id \u0026 ig_id"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_65ed9e8b","line":725,"updated":"2014-12-16 21:58:10.000000000","message":"\u0027.\u0027","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":744,"context_line":"            cb_volumes, volume_name)"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        LOG.info(_LI(\"Successfully created a CloudByte volume [%(cb_vol)s] \""},{"line_number":747,"context_line":"                 \"w.r.t openstack volume [%(stack_vol)s]\"),"},{"line_number":748,"context_line":"                 {\u0027cb_vol\u0027: volume_name, \u0027stack_vol\u0027: volume.get(\u0027id\u0027)})"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        return provider"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_259ab614","line":747,"updated":"2014-12-16 21:58:10.000000000","message":"\u0027.\u0027","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":811,"context_line":"        \"\"\"Creates a snapshot at CloudByte.\"\"\""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        # get admin context"},{"line_number":814,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # Create snapshot metadata before snapshot creation."},{"line_number":817,"context_line":"        snapshot_metadata \u003d {\"cb_snapshot_path_\" + snapshot[\u0027id\u0027]: \u0027None\u0027}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_2568f6f4","line":814,"updated":"2014-12-16 21:58:10.000000000","message":"Why switching to admin here?","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"7f382f64708937885c67a7afeebe4cecb154b2c8","unresolved":false,"context_lines":[{"line_number":811,"context_line":"        \"\"\"Creates a snapshot at CloudByte.\"\"\""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        # get admin context"},{"line_number":814,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # Create snapshot metadata before snapshot creation."},{"line_number":817,"context_line":"        snapshot_metadata \u003d {\"cb_snapshot_path_\" + snapshot[\u0027id\u0027]: \u0027None\u0027}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7850d10a","line":814,"in_reply_to":"3a961159_2568f6f4","updated":"2014-12-17 10:26:35.000000000","message":"Driver needs access to db s.t. ids corresponding to OpenStack \u0026 CloudByte storage etc. can be mapped.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"29130db71d49412a6532ae40124de34e48afe36a","unresolved":false,"context_lines":[{"line_number":811,"context_line":"        \"\"\"Creates a snapshot at CloudByte.\"\"\""},{"line_number":812,"context_line":""},{"line_number":813,"context_line":"        # get admin context"},{"line_number":814,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        # Create snapshot metadata before snapshot creation."},{"line_number":817,"context_line":"        snapshot_metadata \u003d {\"cb_snapshot_path_\" + snapshot[\u0027id\u0027]: \u0027None\u0027}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_fd264567","line":814,"in_reply_to":"3a961159_7850d10a","updated":"2014-12-18 15:11:42.000000000","message":"@Amit, yes, but that can be done without raising the context to admin too..","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":845,"context_line":"            }"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"            LOG.info("},{"line_number":848,"context_line":"                _LI(\"Will create CloudByte snapshot [%(cb_snap)s] \""},{"line_number":849,"context_line":"                    \"w.r.t CloudByte volume [%(cb_vol)s] \""},{"line_number":850,"context_line":"                    \"and OpenStack volume [%(stack_vol)s].\"),"},{"line_number":851,"context_line":"                {\u0027cb_snap\u0027: snapshot_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_65491e8b","line":848,"updated":"2014-12-16 21:58:10.000000000","message":"Why LOG.info here but LOG.debug in delete_volume.  I would pick one or the other and go with it.  I think it is good to use LOG.info","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":874,"context_line":""},{"line_number":875,"context_line":"            raise exception.VolumeBackendAPIException(_("},{"line_number":876,"context_line":"                \"Failed to create snapshot. CloudByte volume metadata \""},{"line_number":877,"context_line":"                \"not found for OpenStack volume [%s]. \") %"},{"line_number":878,"context_line":"                source_volume_id)"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"    def create_cloned_volume(self, cloned_volume, src_volume):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_254f1694","line":877,"updated":"2014-12-16 22:04:58.000000000","message":"Remove space after period.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb77a8031f1898dc57e5597005da090303ea657b","unresolved":false,"context_lines":[{"line_number":1026,"context_line":"                \"path\": cb_snapshot_path"},{"line_number":1027,"context_line":"            }"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"            LOG.debug(\"Will delete CloudByte snapshot [%(snap)s] w.r.t \""},{"line_number":1030,"context_line":"                      \"parent CloudByte volume [%(cb_vol)s] \""},{"line_number":1031,"context_line":"                      \"and parent OpenStack volume [%(stack_vol)s].\","},{"line_number":1032,"context_line":"                      {\u0027snap\u0027: cb_snapshot_path,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_4809992b","line":1029,"updated":"2014-12-16 21:58:10.000000000","message":"Same comment here as above.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"e3fb2a63533d668397b4d548c63e43afe5a88aca","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                        \"and parent OpenStack volume [%(stack_vol)s].\"),"},{"line_number":1055,"context_line":"                    {\u0027snap\u0027: cb_snapshot_path,"},{"line_number":1056,"context_line":"                     \u0027cb_vol\u0027: cb_volume_id,"},{"line_number":1057,"context_line":"                     \u0027stack_vol\u0027: source_volume_id})"},{"line_number":1058,"context_line":"                pass"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_a83d9dbd","line":1057,"updated":"2014-12-16 22:04:58.000000000","message":"Does this mean the snapshot is not really deleted on CloudByte when there are clones from it?  You should make this message more clear that the snapshot cannot be deleted from CoudByte because there are dependent clones.\n\nAlso here you are catching a general Exception. For the case you described, it should be a more specific Exception.\n\ntry:\n    delete snapshot\nexcept ClonesOnSnapshot:\n    pass\nexcept Except:\n    raise","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"29130db71d49412a6532ae40124de34e48afe36a","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                        \"and parent OpenStack volume [%(stack_vol)s].\"),"},{"line_number":1055,"context_line":"                    {\u0027snap\u0027: cb_snapshot_path,"},{"line_number":1056,"context_line":"                     \u0027cb_vol\u0027: cb_volume_id,"},{"line_number":1057,"context_line":"                     \u0027stack_vol\u0027: source_volume_id})"},{"line_number":1058,"context_line":"                pass"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_7dadf587","line":1057,"in_reply_to":"3a961159_1cbc136c","updated":"2014-12-18 15:11:42.000000000","message":"Patch set 16 removes the try..except loop. If your note above is true, then you\u0027re going to have issues when your snapshot has any (CloudByte) clones. \n\nI\u0027m not really sure what\u0027s the solution, as I don\u0027t know what is the relation between cloudbyte clones and cinder clones/volumes..","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"956f425ca2ddd731e7c7b859e9537f3050e75d51","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                        \"and parent OpenStack volume [%(stack_vol)s].\"),"},{"line_number":1055,"context_line":"                    {\u0027snap\u0027: cb_snapshot_path,"},{"line_number":1056,"context_line":"                     \u0027cb_vol\u0027: cb_volume_id,"},{"line_number":1057,"context_line":"                     \u0027stack_vol\u0027: source_volume_id})"},{"line_number":1058,"context_line":"                pass"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_31751b98","line":1057,"in_reply_to":"3a961159_7dadf587","updated":"2014-12-20 22:19:50.000000000","message":"Hmm...... I saw it in patch set 16 too. \n\nAmit,\nIs it possible to find out whether the exception is caused by \"snapshot has clones\"?  It\u0027s better to differentiate this case from other exceptions.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3261b83538b5e56dcc308c3a3a8b1c4f5eb03759","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                        \"and parent OpenStack volume [%(stack_vol)s].\"),"},{"line_number":1055,"context_line":"                    {\u0027snap\u0027: cb_snapshot_path,"},{"line_number":1056,"context_line":"                     \u0027cb_vol\u0027: cb_volume_id,"},{"line_number":1057,"context_line":"                     \u0027stack_vol\u0027: source_volume_id})"},{"line_number":1058,"context_line":"                pass"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_1cbc136c","line":1057,"in_reply_to":"3a961159_9392c5f4","updated":"2014-12-17 18:43:28.000000000","message":"You should be able to delete a snapshot that is in \"error\" state.  If it is in \"error_deleting\" state, you\u0027ll have to reset it to \"error\" state and then you can delete it.","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"52c6b7658d9c1fa4dafbdfc7d1e4ab4e438d5f2c","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"                        \"and parent OpenStack volume [%(stack_vol)s].\"),"},{"line_number":1055,"context_line":"                    {\u0027snap\u0027: cb_snapshot_path,"},{"line_number":1056,"context_line":"                     \u0027cb_vol\u0027: cb_volume_id,"},{"line_number":1057,"context_line":"                     \u0027stack_vol\u0027: source_volume_id})"},{"line_number":1058,"context_line":"                pass"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3a961159_9392c5f4","line":1057,"in_reply_to":"3a961159_a83d9dbd","updated":"2014-12-17 06:35:06.000000000","message":"Hi xing-yang,\nI would ideally like to raise Exception if there was an issue during a snapshot delete at CloudByte storage. However, OpenStack would mark the snapshot in \u0027Error\u0027 state.\n\nCan I retry deleting a snapshot from OpenStack which is in \u0027Error\u0027 state ?","commit_id":"bee5b1d0cd5acbb869a8274ed2dc25235ff51daf"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        for key in params:"},{"line_number":67,"context_line":"            value \u003d params[key]"},{"line_number":68,"context_line":"            if value is not None:"},{"line_number":69,"context_line":"                sanitized_params[key] \u003d str(value)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        sanitized_params \u003d urllib.urlencode(sanitized_params)"},{"line_number":72,"context_line":"        url \u003d (\u0027/client/api?%s\u0027 % sanitized_params)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_9614054e","line":69,"updated":"2014-12-20 22:16:43.000000000","message":"str() should be changed to six.text_type().","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        error_msg \u003d \"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # error_data is a single key value dict"},{"line_number":88,"context_line":"        keys \u003d list(error_data)"},{"line_number":89,"context_line":"        if len(keys) \u003e 0:"},{"line_number":90,"context_line":"            msg \u003d error_data.get(keys[0])"},{"line_number":91,"context_line":"            # We are interested for the error"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_17a2ecfc","line":88,"updated":"2014-12-19 11:07:02.000000000","message":"Not sure, that order of this list will be the same all times","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # error_data is a single key value dict"},{"line_number":88,"context_line":"        keys \u003d list(error_data)"},{"line_number":89,"context_line":"        if len(keys) \u003e 0:"},{"line_number":90,"context_line":"            msg \u003d error_data.get(keys[0])"},{"line_number":91,"context_line":"            # We are interested for the error"},{"line_number":92,"context_line":"            error_msg \u003d msg.get(\u0027errortext\u0027)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_b7b6783c","line":90,"updated":"2014-12-19 11:07:02.000000000","message":"Why not to get item from dict just by key instead of this all code?","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"f912a8503660e175fdc251dad1177fad0a5994f6","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        # error_data is a single key value dict"},{"line_number":88,"context_line":"        keys \u003d list(error_data)"},{"line_number":89,"context_line":"        if len(keys) \u003e 0:"},{"line_number":90,"context_line":"            msg \u003d error_data.get(keys[0])"},{"line_number":91,"context_line":"            # We are interested for the error"},{"line_number":92,"context_line":"            error_msg \u003d msg.get(\u0027errortext\u0027)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_edcacc4d","line":90,"in_reply_to":"3a961159_b7b6783c","updated":"2014-12-22 11:09:03.000000000","message":"Hi Ivan,\nThat would be ideal. However, the current error response format does not have a generic key name. It depends on the operation being performed.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"f6456ac57cae0c73711f334b2a847526cca2f254","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return error_msg"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _execute_and_get_response_details(self, host, url):"},{"line_number":97,"context_line":"        \"\"\"Will prepare response after executing an http request.\"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        res_details \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_690da2e8","line":96,"updated":"2014-12-25 13:48:38.000000000","message":"It looks this method should be extracted to some common library. It does common work rather than things related to this driver.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"0d83a445193a54b869e190e8820a8e9c932dc689","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return error_msg"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _execute_and_get_response_details(self, host, url):"},{"line_number":97,"context_line":"        \"\"\"Will prepare response after executing an http request.\"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        res_details \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_f6e5d4dc","line":96,"in_reply_to":"3a961159_690da2e8","updated":"2014-12-29 04:40:44.000000000","message":"Hi Accela,\nThere are lot of code that should be in a common file. I would refactor them once I am out with the FC driver. Till then i would like to refactor within this single py file itself.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"613781cd85287ebff0cb47b7f28cdddc4f8bd3b6","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        return error_msg"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _execute_and_get_response_details(self, host, url):"},{"line_number":97,"context_line":"        \"\"\"Will prepare response after executing an http request.\"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        res_details \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_195e1377","line":96,"in_reply_to":"3a961159_f6e5d4dc","updated":"2014-12-29 07:30:57.000000000","message":"Thanks for the work, Amit :-)","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            raise exception.VolumeBackendAPIException(msg)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        # Check if it was an error response from CloudByte"},{"line_number":167,"context_line":"        if http_status is not 200:"},{"line_number":168,"context_line":"            error_msg \u003d (_(\"Failed to execute CloudByte API [%(cmd)s].\""},{"line_number":169,"context_line":"                           \" Http status: %(status)s,\""},{"line_number":170,"context_line":"                           \" Error: %(error)s.\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_577f1466","line":167,"updated":"2014-12-19 11:07:02.000000000","message":"!\u003d 200?","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"23761abd78f2d92567169babc6cdd0d0f324bd69","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return data"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _override_params(self, default_dict, filtered_user_dict):"},{"line_number":191,"context_line":"        \"\"\"Override the default config values with user provided values."},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        if filtered_user_dict is None:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_97db3c7b","line":191,"updated":"2014-12-19 11:07:02.000000000","message":"I believe, this method could be less complex, than O(n^2)","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                               tsmid, volume_name):"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        size \u003d volume.get(\u0027size\u0027)"},{"line_number":232,"context_line":"        quotasize \u003d str(size) + \"G\""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # Prepare the user input params"},{"line_number":235,"context_line":"        params \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_763879ee","line":232,"updated":"2014-12-20 22:16:43.000000000","message":"Should use six.text_type() instead of str().","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":387,"context_line":"            \u0027%s %s %s\u0027 % (volume[\u0027ipaddress\u0027] + \u0027:3260\u0027, volume[\u0027iqnname\u0027], 0)"},{"line_number":388,"context_line":"        )"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        LOG.debug(\"CloudByte volume [%(vol)s] properties: [%(props)s].\" %"},{"line_number":393,"context_line":"                  {\u0027vol\u0027: volume[\u0027iqnname\u0027], \u0027props\u0027: model_update})"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_167bb5be","line":390,"updated":"2014-12-20 22:16:43.000000000","message":"I don\u0027t think you should populate this field as you are not using CHAP. This line can be removed.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"f6456ac57cae0c73711f334b2a847526cca2f254","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        flag \u003d 0"},{"line_number":578,"context_line":"        # Filter required TSM and get storage info"},{"line_number":579,"context_line":"        for tsms in tsm_details:"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"            if tsms[\u0027name\u0027] \u003d\u003d tsmname:"},{"line_number":582,"context_line":"                flag \u003d 1"},{"line_number":583,"context_line":"                storage_buckets \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_a91dca12","line":580,"updated":"2014-12-25 13:48:38.000000000","message":"Useless blank line here.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":686,"context_line":"                  {\u0027vol\u0027: volume_name, \u0027iscsi\u0027: iscsi_id, \u0027ig\u0027: ig_id})"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"        # Save CloudByte volume id in volume_admin_metadata"},{"line_number":689,"context_line":"        admin_metadata \u003d {\"cb_volume_id\": volume_id}"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        # Update volume id in volume_admin_metadata"},{"line_number":692,"context_line":"        self.db.volume_admin_metadata_update("}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_b113cb5a","line":689,"updated":"2014-12-20 22:16:43.000000000","message":"Using admin metadata just to save the volume id on the array seems odd. I was going to suggest provider_location but I saw that you\u0027ve already used provider_location for iSCSI target portal data which is needed for initialize_connection.\n\nSo I don\u0027t have a better suggestion.","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        # as this is not user entered in this particular usecase"},{"line_number":851,"context_line":"        snapshot_name \u003d self._generate_snapshot_name()"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        snapshot_id \u003d (str(parent_volume_id) + \"_\" +"},{"line_number":854,"context_line":"                       time.strftime(\"%d%m%Y\") + time.strftime(\"%H%M%S\"))"},{"line_number":855,"context_line":""},{"line_number":856,"context_line":"        # Prepare the params for create_snapshot"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_760f9939","line":853,"updated":"2014-12-20 22:16:43.000000000","message":"str() should be replaced with six.text_type().","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"aaec9f1e8b9e359082f627dc47dff4e07bea98fa","unresolved":false,"context_lines":[{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"        params \u003d {"},{"line_number":1019,"context_line":"            \"id\": cb_volume_id,"},{"line_number":1020,"context_line":"            \"quotasize\": str(new_size) + \u0027G\u0027"},{"line_number":1021,"context_line":"        }"},{"line_number":1022,"context_line":""},{"line_number":1023,"context_line":"        # Request the CloudByte api to update the volume"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a961159_b60ca143","line":1020,"updated":"2014-12-20 22:16:43.000000000","message":"str() should be changed to six.text_type().","commit_id":"1478dd07941041faaf94751d6f853d5392b1d29c"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"272c4ebbfa76324cb5506bea63ee58d0d415f4ef","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                \"Error: Jobid not found in CloudByte\u0027s \""},{"line_number":274,"context_line":"                \"create volume [%s] response.\") % volume_name)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        def _wait_for_volume_creation():"},{"line_number":277,"context_line":"            \"\"\"Called at an interval till the volume is created.\"\"\""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            retries \u003d kwargs[\u0027retries\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_ac04ca18","line":276,"updated":"2014-12-30 10:35:42.000000000","message":"Not a huge fan of reusing the same function name","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"b910845fd29506a12c1fb01eaa1eda307493151a","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                \"Error: Jobid not found in CloudByte\u0027s \""},{"line_number":274,"context_line":"                \"create volume [%s] response.\") % volume_name)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"        def _wait_for_volume_creation():"},{"line_number":277,"context_line":"            \"\"\"Called at an interval till the volume is created.\"\"\""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            retries \u003d kwargs[\u0027retries\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_5fdb067d","line":276,"in_reply_to":"3a961159_ac04ca18","updated":"2014-12-30 10:56:03.000000000","message":"Will change it!!","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"272c4ebbfa76324cb5506bea63ee58d0d415f4ef","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        # Get account id of this account"},{"line_number":601,"context_line":"        account_id \u003d self._get_account_id_from_name(account_name)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # Tricks to get the volume name just for better user experience"},{"line_number":604,"context_line":"        volume_name \u003d None"},{"line_number":605,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":606,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_aca84a21","line":603,"updated":"2014-12-30 10:35:42.000000000","message":"Is the backend happy with duplicate volume names? \u0027display_name\u0027 is not necessarily unique, where as id is","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"f83d4987deed21176b3464a25dcb596a9e0c3e9e","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        # Get account id of this account"},{"line_number":601,"context_line":"        account_id \u003d self._get_account_id_from_name(account_name)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # Tricks to get the volume name just for better user experience"},{"line_number":604,"context_line":"        volume_name \u003d None"},{"line_number":605,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":606,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_bfbf8aa9","line":603,"in_reply_to":"3a961159_7faa82d3","updated":"2014-12-30 15:02:04.000000000","message":"So I can\u0027t see a retry if you use a duplicate name.\n\nI\u0027m not necessarily complaining, just checking that the driver will behave correctly if a tenant uses duplicate display_names (or two different tenants use the same display_name).\n\nA simple \u0027yes, it still creates the volume\u0027 will leave me entirely happy","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"b910845fd29506a12c1fb01eaa1eda307493151a","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        # Get account id of this account"},{"line_number":601,"context_line":"        account_id \u003d self._get_account_id_from_name(account_name)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # Tricks to get the volume name just for better user experience"},{"line_number":604,"context_line":"        volume_name \u003d None"},{"line_number":605,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":606,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_7faa82d3","line":603,"in_reply_to":"3a961159_aca84a21","updated":"2014-12-30 10:56:03.000000000","message":"Hi Duncan,\nThe backend complains with duplicate volume names. \n\nHowever, I have tried to apply the normal conventions e.g. remembering names is easier than id (consisting of numbers, etc). \n\nAn admin who has given considerable effort to put proper volume names will see the same name at the storage backend.","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"7c821e13670536d9412822b0afef54a714476222","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        # Get account id of this account"},{"line_number":601,"context_line":"        account_id \u003d self._get_account_id_from_name(account_name)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # Tricks to get the volume name just for better user experience"},{"line_number":604,"context_line":"        volume_name \u003d None"},{"line_number":605,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":606,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":17,"id":"3a961159_ea1eab73","line":603,"in_reply_to":"3a961159_bfbf8aa9","updated":"2014-12-30 16:51:14.000000000","message":"The storage backend works w.r.t same volume names across multiple tenants.\n\nHowever, what should be the production use case for duplicate volume names within a single tenant ? In this case, the CloudByte storage backend will respond with error \u0026 this driver will raise exception.\n\nNot sure if i have answered your query !\nWhy should there be a retry logic for this ?","commit_id":"f952a32b01d45efb6406546f5bc886b73d95faa4"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if apikey is None:"},{"line_number":136,"context_line":"            msg \u003d (_(\"API key is missing for CloudByte driver.\"))"},{"line_number":137,"context_line":"            LOG.error(msg)"},{"line_number":138,"context_line":"            raise exception.VolumeBackendAPIException(msg)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        host \u003d self.configuration.san_ip"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_f22d99fe","line":138,"updated":"2015-01-04 07:04:48.000000000","message":"raise exception.VolumeBackendAPIException(data\u003dmsg)\n\nPlease change all other places as well.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if apikey is None:"},{"line_number":136,"context_line":"            msg \u003d (_(\"API key is missing for CloudByte driver.\"))"},{"line_number":137,"context_line":"            LOG.error(msg)"},{"line_number":138,"context_line":"            raise exception.VolumeBackendAPIException(msg)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        host \u003d self.configuration.san_ip"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_bacf63b2","line":138,"in_reply_to":"3a961159_f22d99fe","updated":"2015-01-05 12:07:53.000000000","message":"Done","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":377,"context_line":"            \u0027%s %s %s\u0027 % (volume[\u0027ipaddress\u0027] + \u0027:3260\u0027, volume[\u0027iqnname\u0027], 0)"},{"line_number":378,"context_line":"        )"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        # @AmitD"},{"line_number":381,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":382,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":383,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_72760941","line":380,"updated":"2015-01-04 07:04:48.000000000","message":"# Note(AmitD)","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        # @AmitD"},{"line_number":381,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":382,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        model_update[\u0027provider_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_d28edd26","line":382,"updated":"2015-01-04 07:04:48.000000000","message":"You can update this with CHAP info in your future patch, but this should be set to None now.\n\nmodel_update[\u0027provider_auth\u0027] \u003d None\n\nOtherwise the base ISCSIDriver treats this as supporting CHAP, which is not the case.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":379,"context_line":""},{"line_number":380,"context_line":"        # @AmitD"},{"line_number":381,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":382,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        model_update[\u0027provider_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_f4c90126","line":382,"in_reply_to":"3a961159_d28edd26","updated":"2015-01-05 12:07:53.000000000","message":"Done.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        model_update[\u0027provider_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        LOG.debug(\"CloudByte volume [%(vol)s] properties: [%(props)s].\" %"},{"line_number":387,"context_line":"                  {\u0027vol\u0027: volume[\u0027iqnname\u0027], \u0027props\u0027: model_update})"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        return model_update"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_b2a791a6","line":386,"updated":"2015-01-04 07:04:48.000000000","message":"It is recommended to use \",\" instead of \"%\".  I mean the % at the end of line 386.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":383,"context_line":""},{"line_number":384,"context_line":"        model_update[\u0027provider_id\u0027] \u003d volume[\u0027id\u0027]"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        LOG.debug(\"CloudByte volume [%(vol)s] properties: [%(props)s].\" %"},{"line_number":387,"context_line":"                  {\u0027vol\u0027: volume[\u0027iqnname\u0027], \u0027props\u0027: model_update})"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"        return model_update"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_34d469bc","line":386,"in_reply_to":"3a961159_b2a791a6","updated":"2015-01-05 12:07:53.000000000","message":"Done for all the _LI, debug \u0026 _LE messages.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        # Tricks to get the volume name just for better user experience"},{"line_number":605,"context_line":"        volume_name \u003d None"},{"line_number":606,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":607,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"},{"line_number":608,"context_line":"        else:"},{"line_number":609,"context_line":"            volume_name \u003d volume[\u0027id\u0027].replace(\"-\", \"\")"},{"line_number":610,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_929e1562","line":607,"updated":"2015-01-04 07:04:48.000000000","message":"Duncan made a comment regarding using display_name in patchset 17. The display_name can be changed by a user without backend\u0027s knowledge. How do you deal with that?","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":606,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":607,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"},{"line_number":608,"context_line":"        else:"},{"line_number":609,"context_line":"            volume_name \u003d volume[\u0027id\u0027].replace(\"-\", \"\")"},{"line_number":610,"context_line":""},{"line_number":611,"context_line":"        LOG.debug(\"Will create a volume [%(cb_vol)s] in TSM [%(tsm)s] \""},{"line_number":612,"context_line":"                  \"at CloudByte storage w.r.t \""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_12e785e5","line":609,"updated":"2015-01-04 07:04:48.000000000","message":"uuid is unique and reliable and therefore better than the display_name.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":606,"context_line":"        if volume[\u0027display_name\u0027] is not None and volume[\u0027display_name\u0027] !\u003d \u0027\u0027:"},{"line_number":607,"context_line":"            volume_name \u003d volume[\u0027display_name\u0027]"},{"line_number":608,"context_line":"        else:"},{"line_number":609,"context_line":"            volume_name \u003d volume[\u0027id\u0027].replace(\"-\", \"\")"},{"line_number":610,"context_line":""},{"line_number":611,"context_line":"        LOG.debug(\"Will create a volume [%(cb_vol)s] in TSM [%(tsm)s] \""},{"line_number":612,"context_line":"                  \"at CloudByte storage w.r.t \""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_b4df79d5","line":609,"in_reply_to":"3a961159_12e785e5","updated":"2015-01-05 12:07:53.000000000","message":"Done. Using volume[\u0027id] for backend storage\u0027s name.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":935,"context_line":"        model_update \u003d {}"},{"line_number":936,"context_line":"        # @AmitD"},{"line_number":937,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":938,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"        return model_update"},{"line_number":941,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_f2067984","line":938,"updated":"2015-01-04 07:04:48.000000000","message":"See previous comment.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":935,"context_line":"        model_update \u003d {}"},{"line_number":936,"context_line":"        # @AmitD"},{"line_number":937,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":938,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"        return model_update"},{"line_number":941,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_14e84d7b","line":938,"in_reply_to":"3a961159_f2067984","updated":"2015-01-05 12:07:53.000000000","message":"Done","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"9f4397dc1fe1ace61f3a87671b5c39cbbb0787a3","unresolved":false,"context_lines":[{"line_number":944,"context_line":"        model_update \u003d {}"},{"line_number":945,"context_line":"        # @AmitD"},{"line_number":946,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":947,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        return model_update"},{"line_number":950,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_12fea56b","line":947,"updated":"2015-01-04 07:04:48.000000000","message":"Here too.","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"d09e6feedd5652bb6330b85275fb2ef32a30d0d9","unresolved":false,"context_lines":[{"line_number":944,"context_line":"        model_update \u003d {}"},{"line_number":945,"context_line":"        # @AmitD"},{"line_number":946,"context_line":"        # Will provide CHAP Authentication on forthcoming patches/release"},{"line_number":947,"context_line":"        model_update[\u0027provider_auth\u0027] \u003d (\u0027CHAP None None\u0027)"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        return model_update"},{"line_number":950,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a961159_5401f537","line":947,"in_reply_to":"3a961159_12fea56b","updated":"2015-01-05 12:07:53.000000000","message":"Done","commit_id":"38b25f26720ed0d437c2b194eef19f32de7feee6"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":29,"context_line":")"},{"line_number":30,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_add_qosgroup_opts"},{"line_number":31,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_connection_opts"},{"line_number":32,"context_line":"from cinder.volume.drivers.san.san import SanISCSIDriver"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_09eacc0e","line":32,"updated":"2015-01-06 12:37:36.000000000","message":"According to a Hacking rules, please, import modules, not objects","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":29,"context_line":")"},{"line_number":30,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_add_qosgroup_opts"},{"line_number":31,"context_line":"from cinder.volume.drivers.cloudbyte.options import cloudbyte_connection_opts"},{"line_number":32,"context_line":"from cinder.volume.drivers.san.san import SanISCSIDriver"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_06db80ed","line":32,"in_reply_to":"3a961159_09eacc0e","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        finally:"},{"line_number":118,"context_line":"            connection.close()"},{"line_number":119,"context_line":"            LOG.debug(\"CloudByte connection was closed successfully.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        return res_details"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_a9da9875","line":119,"updated":"2015-01-06 12:37:36.000000000","message":"What about handling errors in \u0027except\u0027 block?","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        finally:"},{"line_number":118,"context_line":"            connection.close()"},{"line_number":119,"context_line":"            LOG.debug(\"CloudByte connection was closed successfully.\")"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        return res_details"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_4673c815","line":119,"in_reply_to":"3a961159_a9da9875","updated":"2015-01-07 06:20:47.000000000","message":"The caller to this method handles the exception.","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            error_details \u003d res_obj[\u0027error\u0027]"},{"line_number":152,"context_line":"            http_status \u003d res_obj[\u0027http_status\u0027]"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            msg \u003d (_(\"Error executing CloudByte API [%(cmd)s], \""},{"line_number":156,"context_line":"                     \"Error: %(err)s.\") %"},{"line_number":157,"context_line":"                   {\u0027cmd\u0027: cmd, \u0027err\u0027: ex})"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_69cc30bc","line":154,"updated":"2015-01-06 12:37:36.000000000","message":"Please, catch more specific exception","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            error_details \u003d res_obj[\u0027error\u0027]"},{"line_number":152,"context_line":"            http_status \u003d res_obj[\u0027http_status\u0027]"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        except Exception as ex:"},{"line_number":155,"context_line":"            msg \u003d (_(\"Error executing CloudByte API [%(cmd)s], \""},{"line_number":156,"context_line":"                     \"Error: %(err)s.\") %"},{"line_number":157,"context_line":"                   {\u0027cmd\u0027: cmd, \u0027err\u0027: ex})"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_8663f018","line":154,"in_reply_to":"3a961159_69cc30bc","updated":"2015-01-07 06:20:47.000000000","message":"Done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _request_tsm_details(self, account_id):"},{"line_number":175,"context_line":"        params \u003d {"},{"line_number":176,"context_line":"            \"accountid\": account_id"},{"line_number":177,"context_line":"        }"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # List all CloudByte tsm"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_290b08d7","line":176,"updated":"2015-01-06 12:37:36.000000000","message":"I believe that dict initialization here and below could be on the single line","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _request_tsm_details(self, account_id):"},{"line_number":175,"context_line":"        params \u003d {"},{"line_number":176,"context_line":"            \"accountid\": account_id"},{"line_number":177,"context_line":"        }"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # List all CloudByte tsm"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_a6654c46","line":176,"in_reply_to":"3a961159_290b08d7","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            return default_dict"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        for key, value in default_dict.iteritems():"},{"line_number":192,"context_line":"            # Fill the user dict with default options iff user value is None"},{"line_number":193,"context_line":"            if filtered_user_dict.get(key) is None and value is not None:"},{"line_number":194,"context_line":"                filtered_user_dict[key] \u003d value"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_293dc88f","line":192,"updated":"2015-01-06 12:37:36.000000000","message":"Typo, \u0027iif\u0027 instead \u0027if\u0027. Also, according to the code, \u0027user value is not None\u0027","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            return default_dict"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        for key, value in default_dict.iteritems():"},{"line_number":192,"context_line":"            # Fill the user dict with default options iff user value is None"},{"line_number":193,"context_line":"            if filtered_user_dict.get(key) is None and value is not None:"},{"line_number":194,"context_line":"                filtered_user_dict[key] \u003d value"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_c656d85d","line":192,"in_reply_to":"3a961159_293dc88f","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        return filtered_user_dict"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Get qos related params from configuration"},{"line_number":201,"context_line":"        params \u003d self.configuration.cb_add_qosgroup"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_a948d82d","line":199,"updated":"2015-01-06 12:37:36.000000000","message":"Blank line is not needed here.","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        return filtered_user_dict"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _add_qos_group_request(self, volume, tsmid, volume_name):"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Get qos related params from configuration"},{"line_number":201,"context_line":"        params \u003d self.configuration.cb_add_qosgroup"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_e65bd483","line":199,"in_reply_to":"3a961159_a948d82d","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        return ig_id"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def _get_iscsi_service_id_from_response(self, volume_id, data):"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        iscsi_service_res \u003d data.get(\u0027listVolumeiSCSIServiceResponse\u0027)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        if iscsi_service_res is None:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_29d94857","line":431,"updated":"2015-01-06 12:37:36.000000000","message":"Blank line","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        return ig_id"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def _get_iscsi_service_id_from_response(self, volume_id, data):"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"        iscsi_service_res \u003d data.get(\u0027listVolumeiSCSIServiceResponse\u0027)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        if iscsi_service_res is None:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_6647e4a3","line":431,"in_reply_to":"3a961159_29d94857","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":457,"context_line":"            return iscsi_id"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    def _request_update_iscsi_service(self, iscsi_id, ig_id):"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        params \u003d {"},{"line_number":462,"context_line":"            \"id\": iscsi_id,"},{"line_number":463,"context_line":"            \"igid\": ig_id"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_69dfd03a","line":460,"updated":"2015-01-06 12:37:36.000000000","message":"Same here","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":457,"context_line":"            return iscsi_id"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    def _request_update_iscsi_service(self, iscsi_id, ig_id):"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"        params \u003d {"},{"line_number":462,"context_line":"            \"id\": iscsi_id,"},{"line_number":463,"context_line":"            \"igid\": ig_id"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_86c77011","line":460,"in_reply_to":"3a961159_69dfd03a","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        return path"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def _get_account_id_from_name(self, account_name):"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        params \u003d {}"},{"line_number":500,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"listAccount\", params)"},{"line_number":501,"context_line":"        accounts \u003d data[\"listAccountResponse\"][\"account\"]"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_a9e4580d","line":498,"updated":"2015-01-06 12:37:36.000000000","message":"And here","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        return path"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def _get_account_id_from_name(self, account_name):"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"        params \u003d {}"},{"line_number":500,"context_line":"        data \u003d self._api_request_for_cloudbyte(\"listAccount\", params)"},{"line_number":501,"context_line":"        accounts \u003d data[\"listAccountResponse\"][\"account\"]"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_a6cc6c36","line":498,"in_reply_to":"3a961159_a9e4580d","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        flag \u003d 0"},{"line_number":572,"context_line":"        # Filter required TSM and get storage info"},{"line_number":573,"context_line":"        for tsms in tsm_details:"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"            if tsms[\u0027name\u0027] \u003d\u003d tsmname:"},{"line_number":576,"context_line":"                flag \u003d 1"},{"line_number":577,"context_line":"                storage_buckets \u003d {}"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_09bbace5","line":574,"updated":"2015-01-06 12:37:36.000000000","message":"And here","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        flag \u003d 0"},{"line_number":572,"context_line":"        # Filter required TSM and get storage info"},{"line_number":573,"context_line":"        for tsms in tsm_details:"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"            if tsms[\u0027name\u0027] \u003d\u003d tsmname:"},{"line_number":576,"context_line":"                flag \u003d 1"},{"line_number":577,"context_line":"                storage_buckets \u003d {}"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_c6cdf831","line":574,"in_reply_to":"3a961159_09bbace5","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"c78d90bcf87296e26cc50ac247996b0860cff35e","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        return data"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"    def create_volume(self, volume):"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        tsm_name \u003d self.configuration.cb_tsm_name"},{"line_number":599,"context_line":"        account_name \u003d self.configuration.cb_account_name"},{"line_number":600,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_49b13400","line":597,"updated":"2015-01-06 12:37:36.000000000","message":"Blank line","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"},{"author":{"_account_id":8475,"name":"AmitKumarDas","email":"amit.das@cloudbyte.com","username":"AmitKumarDas"},"change_message_id":"2fe59e5e312f5082265d770fe31c842789e6790d","unresolved":false,"context_lines":[{"line_number":594,"context_line":"        return data"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"    def create_volume(self, volume):"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        tsm_name \u003d self.configuration.cb_tsm_name"},{"line_number":599,"context_line":"        account_name \u003d self.configuration.cb_account_name"},{"line_number":600,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_e6d2f4cf","line":597,"in_reply_to":"3a961159_49b13400","updated":"2015-01-07 06:20:47.000000000","message":"done","commit_id":"6b1ab91bff873673e4b7aacedf92017cb1257dea"}],"cinder/volume/drivers/cloudbyte/options.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2d7682480dfc3546e4cd4ada6a45b4f081bb80c5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_9e9fd501","line":1,"updated":"2014-06-26 18:27:29.000000000","message":"Copyright Header should be 2014 CloudByte  (not OpenStack Foundation)","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"},{"author":{"_account_id":9067,"name":"Nilesh Bhosale","email":"nilesh.bhosale@in.ibm.com","username":"nileshbhosale"},"change_message_id":"59137d1ac4fc044a2c34430f861ceeaef2ece623","unresolved":false,"context_lines":[{"line_number":18,"context_line":"cloudbyte_connection_opts \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027cb_apikey\u0027,"},{"line_number":20,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":21,"context_line":"               help\u003d(\u0027Elasticenter authorization purpose;\u0027)),"},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027cb_account_name\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":24,"context_line":"               help\u003d(\u0027Used to create tsm;\u0027)),"}],"source_content_type":"text/x-python","patch_set":10,"id":"5a890539_51af2694","line":21,"updated":"2014-11-14 06:09:17.000000000","message":"Do you really want to end the help message with semicolon \u0027;\u0027? Would be good to have \u0027.\u0027 at the end of all with appropriate and sufficient help string. This would be helpful to the consumers of this driver.","commit_id":"d338893002188b6776e56cafbcc4c3f319178398"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":18,"context_line":"cloudbyte_connection_opts \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027cb_apikey\u0027,"},{"line_number":20,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":21,"context_line":"               help\u003d(\u0027Elasticenter authorization purpose.\u0027)),"},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027cb_account_name\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":24,"context_line":"               help\u003d(\u0027Used to create tsm.\u0027)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_6a93ce4f","line":21,"updated":"2014-11-18 22:34:00.000000000","message":"Purpose?  Probably needs a more informative description.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":21,"context_line":"               help\u003d(\u0027Elasticenter authorization purpose.\u0027)),"},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027cb_account_name\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":24,"context_line":"               help\u003d(\u0027Used to create tsm.\u0027)),"},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027tsm_name\u0027,"},{"line_number":26,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":27,"context_line":"               help\u003d(\u0027Used to create volume.\u0027)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_aa9db65b","line":24,"updated":"2014-11-18 22:34:00.000000000","message":"Ditto description.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":24,"context_line":"               help\u003d(\u0027Used to create tsm.\u0027)),"},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027tsm_name\u0027,"},{"line_number":26,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":27,"context_line":"               help\u003d(\u0027Used to create volume.\u0027)),"},{"line_number":28,"context_line":"    cfg.IntOpt(\u0027confirm_vol_sleep_interval\u0027,"},{"line_number":29,"context_line":"               default\u003d2,"},{"line_number":30,"context_line":"               help\u003d(\u0027Sleep value is in seconds.\u0027)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_2a72a649","line":27,"updated":"2014-11-18 22:34:00.000000000","message":"This description isn\u0027t informative enough.  (I don\u0027t know what this is by reading it.)","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    cfg.StrOpt(\u0027tsm_name\u0027,"},{"line_number":26,"context_line":"               default\u003d\u0027None\u0027,"},{"line_number":27,"context_line":"               help\u003d(\u0027Used to create volume.\u0027)),"},{"line_number":28,"context_line":"    cfg.IntOpt(\u0027confirm_vol_sleep_interval\u0027,"},{"line_number":29,"context_line":"               default\u003d2,"},{"line_number":30,"context_line":"               help\u003d(\u0027Sleep value is in seconds.\u0027)),"},{"line_number":31,"context_line":"    cfg.IntOpt(\u0027confirm_vol_sleep_counter\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_aa869611","line":28,"updated":"2014-11-18 22:34:00.000000000","message":"Does this really need to be an option?  Probably simpler to start at 1 second and do a backoff of some sort.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ce6b74fa15e871c26a7b4ec75f507ace5a526443","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    cfg.IntOpt(\u0027confirm_vol_sleep_interval\u0027,"},{"line_number":29,"context_line":"               default\u003d2,"},{"line_number":30,"context_line":"               help\u003d(\u0027Sleep value is in seconds.\u0027)),"},{"line_number":31,"context_line":"    cfg.IntOpt(\u0027confirm_vol_sleep_counter\u0027,"},{"line_number":32,"context_line":"               default\u003d3,"},{"line_number":33,"context_line":"               help\u003d(\u0027Will confirm a successful volume \u0027"},{"line_number":34,"context_line":"                     \u0027creation by making this many attempts.\u0027)), ]"}],"source_content_type":"text/x-python","patch_set":11,"id":"5a890539_ca93e25a","line":31,"updated":"2014-11-18 22:34:00.000000000","message":"This should be named something more parsable by a user, such as \"volume_create_retries\" or similar.","commit_id":"7c43f53a8b119470184e95bd92cf66bd487e6829"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"cloudbyte_connection_opts \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\"cb_apikey\","},{"line_number":20,"context_line":"               default\u003d\"None\","},{"line_number":21,"context_line":"               help\u003d(\"Driver will use this API key to authenticate \""},{"line_number":22,"context_line":"                     \"against the CloudByte storage\u0027s management interface.\")),"},{"line_number":23,"context_line":"    cfg.StrOpt(\"cb_account_name\","}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_b5a1bb47","line":20,"updated":"2014-12-15 07:10:46.000000000","message":"Is cb_apikey a required param? I am unable to find the code where a check is made if this value is set or not in conf file.. Am I missing something?","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":24,"context_line":"               default\u003d\"None\","},{"line_number":25,"context_line":"               help\u003d(\"CloudByte storage specific account name. \""},{"line_number":26,"context_line":"                     \"This maps to a project name in OpenStack.\")),"},{"line_number":27,"context_line":"    cfg.StrOpt(\"tsm_name\","},{"line_number":28,"context_line":"               default\u003d\"None\","},{"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. \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_3514ebe7","line":27,"updated":"2014-12-15 07:10:46.000000000","message":"would it make more sense to add a prefix here, e.g. \u0027cb\u0027, as this looks like an option specific to CloudByte storage driver?","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"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(\"confirm_volume_create_retry_interval\","},{"line_number":33,"context_line":"               default\u003d2,"},{"line_number":34,"context_line":"               help\u003d(\"A retry value in seconds. Will be used by the driver \""},{"line_number":35,"context_line":"                     \"to check if volume creation was successful in \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_75d91356","line":32,"updated":"2014-12-15 07:10:46.000000000","message":"Is this an option which is commonly used at multiple places? If not, would it make sense to add a prefix here too?","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":34,"context_line":"               help\u003d(\"A retry value in seconds. Will be used by the driver \""},{"line_number":35,"context_line":"                     \"to check if volume creation was successful in \""},{"line_number":36,"context_line":"                     \"CloudByte storage.\")),"},{"line_number":37,"context_line":"    cfg.IntOpt(\"confirm_volume_create_retries\","},{"line_number":38,"context_line":"               default\u003d3,"},{"line_number":39,"context_line":"               help\u003d(\"Will confirm a successful volume \""},{"line_number":40,"context_line":"                     \"creation in CloudByte storage by making \""}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_55bdf7d6","line":37,"updated":"2014-12-15 07:10:46.000000000","message":"ditto","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                     \"this many number of attempts.\")), ]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"cloudbyte_add_qosgroup_opts \u003d ["},{"line_number":44,"context_line":"    cfg.DictOpt(\u0027add_qosgroup\u0027,"},{"line_number":45,"context_line":"                default\u003d{"},{"line_number":46,"context_line":"                    \u0027iops\u0027: \u002710\u0027,"},{"line_number":47,"context_line":"                    \u0027latency\u0027: \u002715\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_f5cb436f","line":44,"updated":"2014-12-15 07:10:46.000000000","message":"ditto","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"72a42b2a6b51f078b73ea4bc16869a2c954b6b74","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                      \"addQos API call.\")), ]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"cloudbyte_create_volume_opts \u003d ["},{"line_number":59,"context_line":"    cfg.DictOpt(\u0027create_volume\u0027,"},{"line_number":60,"context_line":"                default\u003d{"},{"line_number":61,"context_line":"                    \u0027blocklength\u0027: \u0027512B\u0027,"},{"line_number":62,"context_line":"                    \u0027compression\u0027: \u0027off\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a961159_55a417b9","line":59,"updated":"2014-12-15 07:10:46.000000000","message":"ditto","commit_id":"51a0407253ce876416c7993e3e21aec96beaf18e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"7b97d5d4664c7a2273572d74c065dcfc190fff70","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    cfg.StrOpt(\"cb_apikey\","},{"line_number":20,"context_line":"               default\u003d\"None\","},{"line_number":21,"context_line":"               help\u003d(\"Driver will use this API key to authenticate \""},{"line_number":22,"context_line":"                     \"against the CloudByte storage\u0027s management interface.\")),"},{"line_number":23,"context_line":"    cfg.StrOpt(\"cb_account_name\","},{"line_number":24,"context_line":"               default\u003d\"None\","},{"line_number":25,"context_line":"               help\u003d(\"CloudByte storage specific account name. \""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a961159_17690cf9","line":22,"updated":"2015-01-06 06:12:38.000000000","message":"Actually you can remove () around the help string.  See here:\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/driver.py#L82\n\nThe same applies to the other help strings.","commit_id":"20b853921dc37b97b5e2065f2e4cfc866c5c7300"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"bfc9873a54e267d882fb1a95c73b0df7457c2b19","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    cfg.StrOpt(\"cb_apikey\","},{"line_number":20,"context_line":"               default\u003d\"None\","},{"line_number":21,"context_line":"               help\u003d(\"Driver will use this API key to authenticate \""},{"line_number":22,"context_line":"                     \"against the CloudByte storage\u0027s management interface.\")),"},{"line_number":23,"context_line":"    cfg.StrOpt(\"cb_account_name\","},{"line_number":24,"context_line":"               default\u003d\"None\","},{"line_number":25,"context_line":"               help\u003d(\"CloudByte storage specific account name. \""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a961159_8b7794d3","line":22,"in_reply_to":"3a961159_17690cf9","updated":"2015-01-06 11:13:17.000000000","message":"Good catch!","commit_id":"20b853921dc37b97b5e2065f2e4cfc866c5c7300"}],"cinder/volume/manager.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"2d7682480dfc3546e4cd4ada6a45b4f081bb80c5","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    \u0027cinder.volume.drivers.san.hp_lefthand.HpSanISCSIDriver\u0027:"},{"line_number":103,"context_line":"    \u0027cinder.volume.drivers.san.hp.hp_lefthand_iscsi.HPLeftHandISCSIDriver\u0027,"},{"line_number":104,"context_line":"    \u0027cinder.volume.drivers.gpfs.GPFSDriver\u0027:"},{"line_number":105,"context_line":"    \u0027cinder.volume.drivers.ibm.gpfs.GPFSDriver\u0027}"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def locked_volume_operation(f):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ae5cdf2_beae512d","line":105,"updated":"2014-06-26 18:27:29.000000000","message":"Looks like an unrelated/accidental change -- please remove.","commit_id":"b23c87c2c69a08adeb9b5b27159e71a0cc7146a2"}]}
