)]}'
{"manila/share/drivers/quobyte/jsonrpc.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import base64"},{"line_number":22,"context_line":"import httplib"},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":"import socket"},{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":"import ssl"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_7b4d5072","line":23,"updated":"2015-03-04 17:22:32.000000000","message":"Should be used \"jsonutils\" from lib \"oslo_serialization\"","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import base64"},{"line_number":22,"context_line":"import httplib"},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":"import socket"},{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":"import ssl"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_8fde1d3e","line":23,"in_reply_to":"9a80dd14_7b4d5072","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import httplib"},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":"import socket"},{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":"import ssl"},{"line_number":27,"context_line":"import tempfile"},{"line_number":28,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_9ba044f6","line":25,"updated":"2015-03-04 17:22:32.000000000","message":"Py 2/3 compatibility:\n\nimport six.moves.urllib.parse as urlparse","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import httplib"},{"line_number":23,"context_line":"import json"},{"line_number":24,"context_line":"import socket"},{"line_number":25,"context_line":"import urlparse"},{"line_number":26,"context_line":"import ssl"},{"line_number":27,"context_line":"import tempfile"},{"line_number":28,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_afe12100","line":25,"in_reply_to":"9a80dd14_9ba044f6","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class HTTPSConnectionWithCaVerification(httplib.HTTPConnection):"},{"line_number":106,"context_line":"    \"In addition to core HTTPSConnection, the server certificate is verified against a given CA certificate.\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    default_port \u003d httplib.HTTPS_PORT"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5be40c3b","line":106,"updated":"2015-03-04 17:22:32.000000000","message":"http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"class HTTPSConnectionWithCaVerification(httplib.HTTPConnection):"},{"line_number":106,"context_line":"    \"In addition to core HTTPSConnection, the server certificate is verified against a given CA certificate.\""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    default_port \u003d httplib.HTTPS_PORT"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_efe23900","line":106,"in_reply_to":"9a80dd14_5be40c3b","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.ca_file \u003d ca_file"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def connect(self):"},{"line_number":119,"context_line":"        \"Connect to a host on a given (SSL) port.\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        sock \u003d socket.create_connection((self.host, self.port), self.timeout)"},{"line_number":122,"context_line":"        if self._tunnel_host:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_7bd0f053","line":119,"updated":"2015-03-04 17:22:32.000000000","message":"http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.ca_file \u003d ca_file"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def connect(self):"},{"line_number":119,"context_line":"        \"Connect to a host on a given (SSL) port.\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        sock \u003d socket.create_connection((self.host, self.port), self.timeout)"},{"line_number":122,"context_line":"        if self._tunnel_host:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_afb841e6","line":119,"in_reply_to":"9a80dd14_7bd0f053","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def logout(self):"},{"line_number":173,"context_line":"        cookie \u003d self._session_cookie_handler.get_session_cookie()"},{"line_number":174,"context_line":"        if not cookie:"},{"line_number":175,"context_line":"            print \"Skipping logout because there is no session cookie on disk.\""},{"line_number":176,"context_line":"            return"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        self.call(None, None, \"/logout\", result_is_json\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5bbb2c0e","line":175,"updated":"2015-03-04 17:22:32.000000000","message":"print? Is it intended? maybe LOG should be used? Same for all other occurrences.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def logout(self):"},{"line_number":173,"context_line":"        cookie \u003d self._session_cookie_handler.get_session_cookie()"},{"line_number":174,"context_line":"        if not cookie:"},{"line_number":175,"context_line":"            print \"Skipping logout because there is no session cookie on disk.\""},{"line_number":176,"context_line":"            return"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        self.call(None, None, \"/logout\", result_is_json\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_afaf6193","line":175,"in_reply_to":"9a80dd14_5bbb2c0e","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":188,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":189,"context_line":"        outdated_cookie_was_deleted \u003d False"},{"line_number":190,"context_line":"        while True:"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                self._id +\u003d 1"},{"line_number":193,"context_line":"                if self._id \u003e 1:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_bb58a8fb","line":190,"updated":"2015-03-04 17:22:32.000000000","message":"This is really big method. You would say same if you try cover it with unit tests at least for 80% of code lines.\n\nSo, it would be really good to split it to parts. And add unit tests, that are absent at all for the moment.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":188,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":189,"context_line":"        outdated_cookie_was_deleted \u003d False"},{"line_number":190,"context_line":"        while True:"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                self._id +\u003d 1"},{"line_number":193,"context_line":"                if self._id \u003e 1:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_4f898525","line":190,"in_reply_to":"9a80dd14_bb58a8fb","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"76909bb712a111df12bdebcfc9614710bcd4c5ff","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return self._credentials"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_default_credentials(self):"},{"line_number":62,"context_line":"        return self._default_credentials"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def clear_credentials(self):"},{"line_number":65,"context_line":"        self.set_credentials(None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_72f2ae70","line":62,"updated":"2015-03-05 10:09:37.000000000","message":"pylint complaints about it:\n\nmanila/share/drivers/quobyte/jsonrpc.py:62: [E1101, CredentialsProvider.get_default_credentials] Instance of \u0027CredentialsProvider\u0027 has no \u0027_default_credentials\u0027 member\n\nAnd indeed, where do you set attr \"_default_credentials\"?","commit_id":"bb175d190cde1126858367a5041982352869d994"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ce50ac9fdbca51c74e47350c440b24e94d7a0306","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return self._credentials"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_default_credentials(self):"},{"line_number":62,"context_line":"        return self._default_credentials"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def clear_credentials(self):"},{"line_number":65,"context_line":"        self.set_credentials(None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_f8c59d3d","line":62,"in_reply_to":"9a80dd14_72f2ae70","updated":"2015-03-10 21:48:46.000000000","message":"pylint is right, this is a dead class that somehow survived cleanup. I\u0027ll update this in a few minutes.\nThanks for finding this!","commit_id":"bb175d190cde1126858367a5041982352869d994"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ErrorResponseException(Exception):"},{"line_number":42,"context_line":"    def __init__(self, message, code):"},{"line_number":43,"context_line":"        self.message \u003d message"},{"line_number":44,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_91f8ce4a","line":41,"updated":"2015-03-06 03:33:43.000000000","message":"This should be in manila/exception.py and has a \u0027QB\u0027 prefix.  Also it should be simplified as other custom exceptions over there.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"fed0da1985c2b6a284b019bccd595549afa6f4db","unresolved":false,"context_lines":[{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ErrorResponseException(Exception):"},{"line_number":42,"context_line":"    def __init__(self, message, code):"},{"line_number":43,"context_line":"        self.message \u003d message"},{"line_number":44,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_4bd66c50","line":41,"in_reply_to":"9a80dd14_5dcdd75c","updated":"2015-03-13 14:33:22.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ErrorResponseException(Exception):"},{"line_number":42,"context_line":"    def __init__(self, message, code):"},{"line_number":43,"context_line":"        self.message \u003d message"},{"line_number":44,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b73858f0","line":41,"in_reply_to":"9a80dd14_91f8ce4a","updated":"2015-03-10 21:37:42.000000000","message":"This exception is not raised by the driver but used internally, furthermore it contains a qb specific error code that is used for further selection in the driver. It does not make too much sense for me to move this into the global manila exceptions.py, it is just used between the helper class and the driver.\nIf you do not agree please tell and I\u0027ll change this.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d4f63f5a2fb7df27fb8fdb24d1aea66dd5577992","unresolved":false,"context_lines":[{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ErrorResponseException(Exception):"},{"line_number":42,"context_line":"    def __init__(self, message, code):"},{"line_number":43,"context_line":"        self.message \u003d message"},{"line_number":44,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_5dcdd75c","line":41,"in_reply_to":"9a80dd14_b73858f0","updated":"2015-03-11 08:17:17.000000000","message":"\"mainla.exceptions\" has a lot of driver-specific exception, your case is just the same as in other drivers cases.\n\nThe only case when some exception was stored in driver was case when it was planned to be replaced by imported one from remote lib.\n\nAlso, for \"interactions\" should be request\u0027s params and return data. But in your case you \"raise\" this exception in \"self.rpc.call\" in many places. And only in one of them you expect it within try-block. So, driver now is able to throw such exception further and lose control on some action where it appeared (methods of driver \"create_share\", \"delete_share\", \"allow_access\" and \"deny_access\").\n\nThis one definitely should be defined in common exception module.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        while True:"},{"line_number":126,"context_line":"            try:"},{"line_number":127,"context_line":"                self._id +\u003d 1"},{"line_number":128,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"},{"line_number":129,"context_line":"                LOG.debug(\"Posting to Quobyte backend: %s\","},{"line_number":130,"context_line":"                          jsonutils.dumps(call_body))"},{"line_number":131,"context_line":"                self._connection.request("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ac757999","line":128,"updated":"2015-03-06 03:33:43.000000000","message":"User six.text_type() instead of str()","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        while True:"},{"line_number":126,"context_line":"            try:"},{"line_number":127,"context_line":"                self._id +\u003d 1"},{"line_number":128,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"},{"line_number":129,"context_line":"                LOG.debug(\"Posting to Quobyte backend: %s\","},{"line_number":130,"context_line":"                          jsonutils.dumps(call_body))"},{"line_number":131,"context_line":"                self._connection.request("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_170e843b","line":128,"in_reply_to":"9a80dd14_ac757999","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                else:"},{"line_number":155,"context_line":"                    raise exception.ManilaException("},{"line_number":156,"context_line":"                        \"\".join(_LE(\"Client SSL subsystem returned error: \"),"},{"line_number":157,"context_line":"                                six.text_type(e))"},{"line_number":158,"context_line":"                    )"},{"line_number":159,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":160,"context_line":"                raise exception.ManilaException("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b132320e","line":157,"updated":"2015-03-06 03:33:43.000000000","message":"raise exception.ManilaException(_(\"Client SSL subsystem returned error: %s\") % e)","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":154,"context_line":"                else:"},{"line_number":155,"context_line":"                    raise exception.ManilaException("},{"line_number":156,"context_line":"                        \"\".join(_LE(\"Client SSL subsystem returned error: \"),"},{"line_number":157,"context_line":"                                six.text_type(e))"},{"line_number":158,"context_line":"                    )"},{"line_number":159,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":160,"context_line":"                raise exception.ManilaException("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_fa71d5a8","line":157,"in_reply_to":"9a80dd14_b132320e","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""},{"line_number":162,"context_line":"                    \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":163,"context_line":"                    \" status code from server response. Error was %s\""},{"line_number":164,"context_line":"                    % six.text_type(e))"},{"line_number":165,"context_line":"            except (httplib.HTTPException, socket.error) as e:"},{"line_number":166,"context_line":"                if self._fail_fast:"},{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f13caae4","line":164,"updated":"2015-03-06 03:33:43.000000000","message":"Use the above style.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""},{"line_number":162,"context_line":"                    \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":163,"context_line":"                    \" status code from server response. Error was %s\""},{"line_number":164,"context_line":"                    % six.text_type(e))"},{"line_number":165,"context_line":"            except (httplib.HTTPException, socket.error) as e:"},{"line_number":166,"context_line":"                if self._fail_fast:"},{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_faf635f8","line":164,"in_reply_to":"9a80dd14_f13caae4","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                if self._fail_fast:"},{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"},{"line_number":168,"context_line":"                else:"},{"line_number":169,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":170,"context_line":"                    time.sleep(1)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def throw_on_http_error(self, response):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ac4e596d","line":169,"updated":"2015-03-06 03:33:43.000000000","message":"Missing %s","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                if self._fail_fast:"},{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"},{"line_number":168,"context_line":"                else:"},{"line_number":169,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":170,"context_line":"                    time.sleep(1)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def throw_on_http_error(self, response):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_7ae24530","line":169,"in_reply_to":"9a80dd14_ac4e596d","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"},{"line_number":168,"context_line":"                else:"},{"line_number":169,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":170,"context_line":"                    time.sleep(1)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def throw_on_http_error(self, response):"},{"line_number":173,"context_line":"        if response.status \u003d\u003d 401:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_8c5ef510","line":170,"updated":"2015-03-06 03:33:43.000000000","message":"This could become an endless loop without a timeout value.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                    raise exception.ManilaException(six.text_type(e))"},{"line_number":168,"context_line":"                else:"},{"line_number":169,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":170,"context_line":"                    time.sleep(1)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def throw_on_http_error(self, response):"},{"line_number":173,"context_line":"        if response.status \u003d\u003d 401:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_fa5d557a","line":170,"in_reply_to":"9a80dd14_8c5ef510","updated":"2015-03-10 21:37:42.000000000","message":"Only if the default (fail_fast\u003dtrue) is reconfigured and in that case it is intentional to loop continuously, e.g. to give time to debug/correct the backend.\n\nUPDATE:\nbecause of further discussions and irritations this loop is limited in the next changeset.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            raise exception.ManilaException("},{"line_number":175,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":176,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":177,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":178,"context_line":"        elif response.status !\u003d 200:"},{"line_number":179,"context_line":"            raise exception.ManilaException("},{"line_number":180,"context_line":"                \"JSON RPC failed: \" +"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_eca6910f","line":177,"updated":"2015-03-06 03:33:43.000000000","message":"http://docs.openstack.org/developer/oslo.i18n/guidelines.html#adding-variables-to-translated-messages","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            raise exception.ManilaException("},{"line_number":175,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":176,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":177,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":178,"context_line":"        elif response.status !\u003d 200:"},{"line_number":179,"context_line":"            raise exception.ManilaException("},{"line_number":180,"context_line":"                \"JSON RPC failed: \" +"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_da97b138","line":177,"in_reply_to":"9a80dd14_eca6910f","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            raise exception.ManilaException("},{"line_number":180,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":181,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":182,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":185,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_4cab1dd6","line":182,"updated":"2015-03-06 03:33:43.000000000","message":"See above guidelines.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            raise exception.ManilaException("},{"line_number":180,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":181,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":182,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":185,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9a91b949","line":182,"in_reply_to":"9a80dd14_4cab1dd6","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                raise ErrorResponseException("},{"line_number":188,"context_line":"                    result[\"error\"][\"message\"], result[\"error\"][\"code\"])"},{"line_number":189,"context_line":"            else:"},{"line_number":190,"context_line":"                raise exception.ManilaException(str(result[\"error\"]), -1)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_6cbaa124","line":190,"updated":"2015-03-06 03:33:43.000000000","message":"six.text_type","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                raise ErrorResponseException("},{"line_number":188,"context_line":"                    result[\"error\"][\"message\"], result[\"error\"][\"code\"])"},{"line_number":189,"context_line":"            else:"},{"line_number":190,"context_line":"                raise exception.ManilaException(str(result[\"error\"]), -1)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_5a53c1e1","line":190,"in_reply_to":"9a80dd14_6cbaa124","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Quobyte driver helper."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Control Quobyte over its JSON RPC API."},{"line_number":20,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_a169c9bf","line":17,"updated":"2015-03-07 19:45:58.000000000","message":"This file only has 73% unit test line coverage.  Please add tests!","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"Quobyte driver helper."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Control Quobyte over its JSON RPC API."},{"line_number":20,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_338f86ce","line":17,"in_reply_to":"9a80dd14_a169c9bf","updated":"2015-03-10 21:38:20.000000000","message":"Added some tests today, more tomorrow in patch set 11.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":39,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ErrorResponseException(Exception):"},{"line_number":43,"context_line":"    def __init__(self, message, code):"},{"line_number":44,"context_line":"        self.message \u003d message"},{"line_number":45,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_672ec9fc","line":42,"updated":"2015-03-10 05:03:52.000000000","message":"This should be in manila/exception.py as I commented in patchset 6.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":39,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ErrorResponseException(Exception):"},{"line_number":43,"context_line":"    def __init__(self, message, code):"},{"line_number":44,"context_line":"        self.message \u003d message"},{"line_number":45,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_b07e3068","line":42,"in_reply_to":"9a80dd14_672ec9fc","updated":"2015-03-10 21:38:20.000000000","message":"Hi! Did you read my reply comment to this in patchset 6? This Exception is handled completely in between the helper class and the driver class and not raised outside. That\u0027s why i would prefer not to add it to the generic manila code...\nI\u0027ll try to contact you in irc to discuss this.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"19958dc48a18cb55557885697f4b766ccfb1eeae","unresolved":false,"context_lines":[{"line_number":39,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ErrorResponseException(Exception):"},{"line_number":43,"context_line":"    def __init__(self, message, code):"},{"line_number":44,"context_line":"        self.message \u003d message"},{"line_number":45,"context_line":"        self.code \u003d code"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_cecf6156","line":42,"in_reply_to":"9a80dd14_b07e3068","updated":"2015-03-10 21:49:04.000000000","message":"Take a look of the following example. It is very similar to Manila.\n\nhttps://review.openstack.org/#/c/141629/15/cinder/exception.py","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self._username \u003d username"},{"line_number":55,"context_line":"        self._password \u003d password"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_username(self):"},{"line_number":58,"context_line":"        return self._username"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_authorization_header(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c687b3b3","line":57,"updated":"2015-03-07 19:45:58.000000000","message":"I suggest using @property here.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self._username \u003d username"},{"line_number":55,"context_line":"        self._password \u003d password"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_username(self):"},{"line_number":58,"context_line":"        return self._username"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_authorization_header(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7353e216","line":57,"in_reply_to":"9a80dd14_c687b3b3","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self._disabled_cert_verification \u003d False"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def call(self, method_name, user_parameters):"},{"line_number":119,"context_line":"        parameters \u003d {\u0027retry\u0027: \u0027INFINITELY\u0027}"},{"line_number":120,"context_line":"        if user_parameters:"},{"line_number":121,"context_line":"            parameters.update(user_parameters)"},{"line_number":122,"context_line":"        call_body \u003d {\u0027jsonrpc\u0027: \u00272.0\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_466ae3ee","line":119,"updated":"2015-03-07 19:45:58.000000000","message":"See note below.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self._disabled_cert_verification \u003d False"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def call(self, method_name, user_parameters):"},{"line_number":119,"context_line":"        parameters \u003d {\u0027retry\u0027: \u0027INFINITELY\u0027}"},{"line_number":120,"context_line":"        if user_parameters:"},{"line_number":121,"context_line":"            parameters.update(user_parameters)"},{"line_number":122,"context_line":"        call_body \u003d {\u0027jsonrpc\u0027: \u00272.0\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_aab23491","line":119,"in_reply_to":"9a80dd14_466ae3ee","updated":"2015-03-10 21:38:20.000000000","message":"I changed the loop below to limited runs. This parameter however is Quobyte backend specific, therefore not changed.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                     \u0027method\u0027: method_name,"},{"line_number":124,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":125,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            try:"},{"line_number":128,"context_line":"                self._id +\u003d 1"},{"line_number":129,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_2665ef1d","line":126,"updated":"2015-03-07 19:45:58.000000000","message":"Why would this code need to retry \u0027INFINITELY\u0027?  You are blocking other requests during this time, so I think you would want to encode at most a few retries, possibly with increasing delays between them.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                     \u0027method\u0027: method_name,"},{"line_number":124,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":125,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            try:"},{"line_number":128,"context_line":"                self._id +\u003d 1"},{"line_number":129,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_aa7954c9","line":126,"in_reply_to":"9a80dd14_2665ef1d","updated":"2015-03-10 21:38:20.000000000","message":"As written below i changed that now, loop\u0027s now terminating after a few retries.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                     \u0027method\u0027: method_name,"},{"line_number":124,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":125,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            try:"},{"line_number":128,"context_line":"                self._id +\u003d 1"},{"line_number":129,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_677c09ed","line":126,"in_reply_to":"9a80dd14_2665ef1d","updated":"2015-03-10 05:03:52.000000000","message":"I commented on an endless loop in patchset 6 as well.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                     \u0027method\u0027: method_name,"},{"line_number":124,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":125,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            try:"},{"line_number":128,"context_line":"                self._id +\u003d 1"},{"line_number":129,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_b3f55aee","line":126,"in_reply_to":"9a80dd14_2665ef1d","updated":"2015-03-10 21:38:20.000000000","message":"See my answers to previous comments.\nBut i\u0027ll probably change that in the next change set as this seems to cause lot\u0027s of irritation.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                     \u0027method\u0027: method_name,"},{"line_number":124,"context_line":"                     \u0027params\u0027: parameters,"},{"line_number":125,"context_line":"                     \u0027id\u0027: str(self._id)}"},{"line_number":126,"context_line":"        while True:"},{"line_number":127,"context_line":"            try:"},{"line_number":128,"context_line":"                self._id +\u003d 1"},{"line_number":129,"context_line":"                call_body[\u0027id\u0027] \u003d str(self._id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_737a0289","line":126,"in_reply_to":"9a80dd14_677c09ed","updated":"2015-03-10 21:38:20.000000000","message":"Yep, read and replied to that, did you read my reply to your comment?","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                else:"},{"line_number":156,"context_line":"                    raise exception.ManilaException("},{"line_number":157,"context_line":"                        \"\".join(_LE(\"Client SSL subsystem returned error: \"),"},{"line_number":158,"context_line":"                                six.text_type(e))"},{"line_number":159,"context_line":"                    )"},{"line_number":160,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":161,"context_line":"                raise exception.ManilaException("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c746957a","line":158,"updated":"2015-03-10 05:03:52.000000000","message":"Please see the example I gave on line 165","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                else:"},{"line_number":156,"context_line":"                    raise exception.ManilaException("},{"line_number":157,"context_line":"                        \"\".join(_LE(\"Client SSL subsystem returned error: \"),"},{"line_number":158,"context_line":"                                six.text_type(e))"},{"line_number":159,"context_line":"                    )"},{"line_number":160,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":161,"context_line":"                raise exception.ManilaException("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_216674bb","line":158,"in_reply_to":"9a80dd14_c746957a","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""},{"line_number":163,"context_line":"                    \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":164,"context_line":"                    \" status code from server response. Error was %s\""},{"line_number":165,"context_line":"                    % six.text_type(e))"},{"line_number":166,"context_line":"            except (httplib.HTTPException, socket.error) as e:"},{"line_number":167,"context_line":"                if self._fail_fast:"},{"line_number":168,"context_line":"                    raise exception.ManilaException(six.text_type(e))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_a76c4109","line":165,"updated":"2015-03-10 05:03:52.000000000","message":"raise exception.ManilaException(_(\"If SSL is enabled for the API ...... Error was %s.\")  % e)","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""},{"line_number":163,"context_line":"                    \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":164,"context_line":"                    \" status code from server response. Error was %s\""},{"line_number":165,"context_line":"                    % six.text_type(e))"},{"line_number":166,"context_line":"            except (httplib.HTTPException, socket.error) as e:"},{"line_number":167,"context_line":"                if self._fail_fast:"},{"line_number":168,"context_line":"                    raise exception.ManilaException(six.text_type(e))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_4108c8d9","line":165,"in_reply_to":"9a80dd14_a76c4109","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":171,"context_line":"                    time.sleep(1)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def throw_on_http_error(self, response):"},{"line_number":174,"context_line":"        if response.status \u003d\u003d 401:"},{"line_number":175,"context_line":"            raise exception.ManilaException("},{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_264c0f9e","line":173,"updated":"2015-03-07 19:45:58.000000000","message":"This should be a private method.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":171,"context_line":"                    time.sleep(1)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def throw_on_http_error(self, response):"},{"line_number":174,"context_line":"        if response.status \u003d\u003d 401:"},{"line_number":175,"context_line":"            raise exception.ManilaException("},{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c1d03821","line":173,"in_reply_to":"9a80dd14_264c0f9e","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            raise exception.ManilaException("},{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":177,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":178,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":179,"context_line":"        elif response.status !\u003d 200:"},{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_27e4d1aa","line":178,"updated":"2015-03-10 05:03:52.000000000","message":"Please follow logging guidelines:\n\nhttp://docs.openstack.org/developer/oslo.i18n/guidelines.html#adding-variables-to-translated-messages","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            raise exception.ManilaException("},{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":177,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":178,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":179,"context_line":"        elif response.status !\u003d 200:"},{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_0176d005","line":178,"in_reply_to":"9a80dd14_27e4d1aa","updated":"2015-03-10 21:38:20.000000000","message":"Ouch! I just realized through this that some of my changes did not make it into the last change set, i already corrected that.\nMy sincere apologies about reposting old code snippets!","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":177,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":178,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":179,"context_line":"        elif response.status !\u003d 200:"},{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c65c134e","line":179,"updated":"2015-03-07 19:45:58.000000000","message":"Other HTTP codes in the 2xx range aren\u0027t errors.  Perhaps your backend doesn\u0027t use those, but I would have expected this check to be \"elif response.status \u003e\u003d 300\".","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                \"JSON RPC failed: unauthorized user \" +"},{"line_number":177,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":178,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":179,"context_line":"        elif response.status !\u003d 200:"},{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_0175f030","line":179,"in_reply_to":"9a80dd14_c65c134e","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"28edc808b6d89e90948c4fa056d0e27b772b0d75","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":183,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_879bbd16","line":183,"updated":"2015-03-10 05:03:52.000000000","message":"Same","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            raise exception.ManilaException("},{"line_number":181,"context_line":"                \"JSON RPC failed: \" +"},{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":183,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_619b0c18","line":183,"in_reply_to":"9a80dd14_879bbd16","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":183,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":187,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":188,"context_line":"                raise ErrorResponseException("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_46510335","line":185,"updated":"2015-03-07 19:45:58.000000000","message":"This should be a private method.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                str(response.status) + \" \" + response.reason +"},{"line_number":183,"context_line":"                \" Please check the API service log for more details.\")"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def throw_on_application_error(self, result):"},{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":187,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":188,"context_line":"                raise ErrorResponseException("}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_01c7b064","line":185,"in_reply_to":"9a80dd14_46510335","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"CONNECTION_RETRIES \u003d 3"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QBErrorResponseException(Exception):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_1d119fac","line":40,"updated":"2015-03-11 08:19:17.000000000","message":"You sure you do not want to make \"CONNECTION_RETRIES\" an opt?","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"2528a6c2745458d02c0390cea46227a916ddf468","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"ERROR_ENOENT \u003d 2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"CONNECTION_RETRIES \u003d 3"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QBErrorResponseException(Exception):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_bd7cea73","line":40,"in_reply_to":"9a80dd14_1d119fac","updated":"2015-03-11 21:35:15.000000000","message":"Currently not.\nIt may happen that I\u0027ll change this in a later update but this is fine with me for now.","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"CONNECTION_RETRIES \u003d 3"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QBErrorResponseException(Exception):"},{"line_number":44,"context_line":"    \"\"\"Quobyte specific error in backend response."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Used for interaction with the Quobyte driver. Stores Quobyte specific"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_4c8fea75","line":43,"updated":"2015-03-11 08:19:17.000000000","message":"Please, see comment for it in ps6.","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"b427cea6075cdf24509e25b811002fde47133fdb","unresolved":false,"context_lines":[{"line_number":40,"context_line":"CONNECTION_RETRIES \u003d 3"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class QBErrorResponseException(Exception):"},{"line_number":44,"context_line":"    \"\"\"Quobyte specific error in backend response."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Used for interaction with the Quobyte driver. Stores Quobyte specific"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_c6a1aeaa","line":43,"in_reply_to":"9a80dd14_4c8fea75","updated":"2015-03-13 14:33:29.000000000","message":"Done","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":183,"context_line":"                    time.sleep(1)"},{"line_number":184,"context_line":"        raise exception.ManilaException(\"Unable to connect to backend after\""},{"line_number":185,"context_line":"                                        \"%s retries\", CONNECTION_RETRIES)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __throw_on_http_error(self, response):"},{"line_number":188,"context_line":"        if response.status \u003d\u003d 401:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_7d761b08","line":185,"updated":"2015-03-11 08:19:17.000000000","message":"AS was said earlier, second param is reserved. You won\u0027t get substitution here.","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"2528a6c2745458d02c0390cea46227a916ddf468","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                    LOG.warning(_LW(\"Encountered error, retrying:\"), e)"},{"line_number":183,"context_line":"                    time.sleep(1)"},{"line_number":184,"context_line":"        raise exception.ManilaException(\"Unable to connect to backend after\""},{"line_number":185,"context_line":"                                        \"%s retries\", CONNECTION_RETRIES)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __throw_on_http_error(self, response):"},{"line_number":188,"context_line":"        if response.status \u003d\u003d 401:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_3d4b9a5a","line":185,"in_reply_to":"9a80dd14_7d761b08","updated":"2015-03-11 21:35:15.000000000","message":"Done","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        raise exception.ManilaException(\"Unable to connect to backend after\""},{"line_number":185,"context_line":"                                        \"%s retries\", CONNECTION_RETRIES)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __throw_on_http_error(self, response):"},{"line_number":188,"context_line":"        if response.status \u003d\u003d 401:"},{"line_number":189,"context_line":"            raise exception.ManilaException("},{"line_number":190,"context_line":"                _(\"JSON RPC failed: unauthorized user %(status)s %(reason)s\""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_dd7d47e9","line":187,"updated":"2015-03-11 08:19:17.000000000","message":"Why two underscores are used?","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"2528a6c2745458d02c0390cea46227a916ddf468","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        raise exception.ManilaException(\"Unable to connect to backend after\""},{"line_number":185,"context_line":"                                        \"%s retries\", CONNECTION_RETRIES)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __throw_on_http_error(self, response):"},{"line_number":188,"context_line":"        if response.status \u003d\u003d 401:"},{"line_number":189,"context_line":"            raise exception.ManilaException("},{"line_number":190,"context_line":"                _(\"JSON RPC failed: unauthorized user %(status)s %(reason)s\""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_9d77269f","line":187,"in_reply_to":"9a80dd14_dd7d47e9","updated":"2015-03-11 21:35:15.000000000","message":"Done","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                % {\u0027status\u0027: six.text_type(response.status),"},{"line_number":199,"context_line":"                   \u0027reason\u0027: response.reason})"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __throw_on_application_error(self, result):"},{"line_number":202,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":203,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":204,"context_line":"                raise QBErrorResponseException("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_fd820bc7","line":201,"updated":"2015-03-11 08:19:17.000000000","message":"ditto","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"2528a6c2745458d02c0390cea46227a916ddf468","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                % {\u0027status\u0027: six.text_type(response.status),"},{"line_number":199,"context_line":"                   \u0027reason\u0027: response.reason})"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __throw_on_application_error(self, result):"},{"line_number":202,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":203,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":204,"context_line":"                raise QBErrorResponseException("}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_1d6336de","line":201,"in_reply_to":"9a80dd14_fd820bc7","updated":"2015-03-11 21:35:15.000000000","message":"Done","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                    message\u003dresult[\"error\"][\"message\"],"},{"line_number":209,"context_line":"                    code\u003dresult[\"error\"][\"code\"])"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                raise exception.ManilaException(str(result[\"error\"]), -1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_c067ede8","line":211,"updated":"2015-03-12 03:03:34.000000000","message":"str -\u003e six.text_type\n\nI\u0027m not sure what \"-1\" means here.  Is this an error code?  If so, I think it should be passed in as \"code\u003d-1\".","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                    message\u003dresult[\"error\"][\"message\"],"},{"line_number":209,"context_line":"                    code\u003dresult[\"error\"][\"code\"])"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                raise exception.ManilaException(str(result[\"error\"]), -1)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_7dadf187","line":211,"in_reply_to":"9a80dd14_c067ede8","updated":"2015-03-13 14:26:56.000000000","message":"replaced str (and grepped to ensure this was the last of it\u0027s kind).\n\nThe -1 also was a survivor of earlier work, removed.","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":2417,"name":"Ben Swartzlander","email":"ben@swartzlander.org","username":"bswartz"},"change_message_id":"dc3d6e3dd71d5079478fa63cfa07f3826dfd322e","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":188,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":189,"context_line":"                if result[\"error\"][\"code\"] \u003d\u003d ERROR_ENOENT:"},{"line_number":190,"context_line":"                    return None  # No Entry"},{"line_number":191,"context_line":"                else:"},{"line_number":192,"context_line":"                    raise exception.QBRpcException("},{"line_number":193,"context_line":"                        result\u003dresult[\"error\"][\"message\"],"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_c686d3b8","line":190,"updated":"2015-03-13 14:57:44.000000000","message":"This path won\u0027t throw any exception, which allows the caller to proceed and return a result. Is that intended?\n\nAlso, the None is never consumed. You could just \"return\" with no value.","commit_id":"198d62d0cdea2f7399c28f140c4bf2138a200d69"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"43ebb6f4f219f9cb85f51543335bfa213c07a1d6","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":188,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":189,"context_line":"                if result[\"error\"][\"code\"] \u003d\u003d ERROR_ENOENT:"},{"line_number":190,"context_line":"                    return None  # No Entry"},{"line_number":191,"context_line":"                else:"},{"line_number":192,"context_line":"                    raise exception.QBRpcException("},{"line_number":193,"context_line":"                        result\u003dresult[\"error\"][\"message\"],"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_ceb34598","line":190,"in_reply_to":"9a80dd14_a1d1c9fc","updated":"2015-03-13 16:16:31.000000000","message":"Done.\nAlso added tests for the paths in this method.","commit_id":"198d62d0cdea2f7399c28f140c4bf2138a200d69"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"7b2c3f3f6b098cec10f3ca13fb2cfbf23a6fdcdd","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":188,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":189,"context_line":"                if result[\"error\"][\"code\"] \u003d\u003d ERROR_ENOENT:"},{"line_number":190,"context_line":"                    return None  # No Entry"},{"line_number":191,"context_line":"                else:"},{"line_number":192,"context_line":"                    raise exception.QBRpcException("},{"line_number":193,"context_line":"                        result\u003dresult[\"error\"][\"message\"],"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a80dd14_a1d1c9fc","line":190,"in_reply_to":"9a80dd14_c686d3b8","updated":"2015-03-13 15:06:14.000000000","message":"Yep, this got mangled in the refactoring as i had to change the driver/helper interaction. Will fix now.","commit_id":"198d62d0cdea2f7399c28f140c4bf2138a200d69"},{"author":{"_account_id":2417,"name":"Ben Swartzlander","email":"ben@swartzlander.org","username":"bswartz"},"change_message_id":"62e958c206cb673c65253414536c2f82da0b644f","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":187,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":188,"context_line":"                if result[\"error\"][\"code\"] \u003d\u003d ERROR_ENOENT:"},{"line_number":189,"context_line":"                    return None  # No Entry"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                    raise exception.QBRpcException("},{"line_number":192,"context_line":"                        result\u003dresult[\"error\"][\"message\"],"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_7405c878","line":189,"updated":"2015-03-13 16:43:11.000000000","message":"Okay it makes sense now","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f930709cb7b67eb5a78dad2fb67b78bee5b3d7ca","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        if \u0027error\u0027 in result and result[\u0027error\u0027]:"},{"line_number":187,"context_line":"            if \u0027message\u0027 in result[\u0027error\u0027] and \u0027code\u0027 in result[\u0027error\u0027]:"},{"line_number":188,"context_line":"                if result[\"error\"][\"code\"] \u003d\u003d ERROR_ENOENT:"},{"line_number":189,"context_line":"                    return None  # No Entry"},{"line_number":190,"context_line":"                else:"},{"line_number":191,"context_line":"                    raise exception.QBRpcException("},{"line_number":192,"context_line":"                        result\u003dresult[\"error\"][\"message\"],"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_1f43bb6c","line":189,"in_reply_to":"9a80dd14_7405c878","updated":"2015-03-13 21:03:42.000000000","message":"yep, soo much more. :)","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return \u0027BASIC %s\u0027 % auth"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class HTTPSConnectionWithCaVerification(httplib.HTTPConnection):"},{"line_number":59,"context_line":"    \"\"\"Verify server cert against a given CA certificate.\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    default_port \u003d httplib.HTTPS_PORT"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_1aad779b","line":58,"updated":"2015-03-14 22:32:07.000000000","message":"There are no unit tests for this class.  Is that intentional?","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        return \u0027BASIC %s\u0027 % auth"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class HTTPSConnectionWithCaVerification(httplib.HTTPConnection):"},{"line_number":59,"context_line":"    \"\"\"Verify server cert against a given CA certificate.\"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    default_port \u003d httplib.HTTPS_PORT"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_b03c7a94","line":58,"in_reply_to":"9a80dd14_1aad779b","updated":"2015-03-16 09:09:18.000000000","message":"Added tests for this.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            try:"},{"line_number":124,"context_line":"                self._id +\u003d 1"},{"line_number":125,"context_line":"                call_body[\u0027id\u0027] \u003d six.text_type(self._id)"},{"line_number":126,"context_line":"                LOG.debug(\"Posting to Quobyte backend: %s\","},{"line_number":127,"context_line":"                          jsonutils.dumps(call_body))"},{"line_number":128,"context_line":"                self._connection.request("},{"line_number":129,"context_line":"                    \"POST\", self._url + \u0027/\u0027, jsonutils.dumps(call_body),"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_7ab7533a","line":126,"updated":"2015-03-14 22:32:07.000000000","message":"Just an observation that writing all backend traffic to the debug log can be bothersome when debugging issues elsewhere in the stack.  You may wish to add logic to enable this level of logging via a config flag.  An example of this exists in the NetApp driver.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            try:"},{"line_number":124,"context_line":"                self._id +\u003d 1"},{"line_number":125,"context_line":"                call_body[\u0027id\u0027] \u003d six.text_type(self._id)"},{"line_number":126,"context_line":"                LOG.debug(\"Posting to Quobyte backend: %s\","},{"line_number":127,"context_line":"                          jsonutils.dumps(call_body))"},{"line_number":128,"context_line":"                self._connection.request("},{"line_number":129,"context_line":"                    \"POST\", self._url + \u0027/\u0027, jsonutils.dumps(call_body),"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_4ad9cf20","line":126,"in_reply_to":"9a80dd14_7ab7533a","updated":"2015-03-16 09:09:18.000000000","message":"I\u0027ll take a look at it, thanks for the hint.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                else:"},{"line_number":151,"context_line":"                    raise exception.QBException(_("},{"line_number":152,"context_line":"                        \"Client SSL subsystem returned error: %s\")"},{"line_number":153,"context_line":"                        % e)"},{"line_number":154,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":155,"context_line":"                raise exception.QBException(_("},{"line_number":156,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_ba846b5e","line":153,"updated":"2015-03-14 22:32:07.000000000","message":"Seems like some unnecessary line wrapping here.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                else:"},{"line_number":151,"context_line":"                    raise exception.QBException(_("},{"line_number":152,"context_line":"                        \"Client SSL subsystem returned error: %s\")"},{"line_number":153,"context_line":"                        % e)"},{"line_number":154,"context_line":"            except httplib.BadStatusLine as e:"},{"line_number":155,"context_line":"                raise exception.QBException(_("},{"line_number":156,"context_line":"                    \"If SSL is enabled for the API service, the URL must\""}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_0ad35704","line":153,"in_reply_to":"9a80dd14_ba846b5e","updated":"2015-03-16 09:09:18.000000000","message":"Done","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  \" Please check the API service log for more details.\")"},{"line_number":176,"context_line":"                % {\u0027status\u0027: six.text_type(response.status),"},{"line_number":177,"context_line":"                   \u0027reason\u0027: response.reason})"},{"line_number":178,"context_line":"        elif response.status \u003e\u003d 300:"},{"line_number":179,"context_line":"            raise exception.QBException("},{"line_number":180,"context_line":"                _(\"JSON RPC failed:  %(status)s %(reason)s\""},{"line_number":181,"context_line":"                  \" Please check the API service log for more details.\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_5acb6f71","line":178,"updated":"2015-03-14 22:32:07.000000000","message":"There is no unit test for this block.  It appears you meant to test it in test_http_error_other, but you still sent a 401.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                  \" Please check the API service log for more details.\")"},{"line_number":176,"context_line":"                % {\u0027status\u0027: six.text_type(response.status),"},{"line_number":177,"context_line":"                   \u0027reason\u0027: response.reason})"},{"line_number":178,"context_line":"        elif response.status \u003e\u003d 300:"},{"line_number":179,"context_line":"            raise exception.QBException("},{"line_number":180,"context_line":"                _(\"JSON RPC failed:  %(status)s %(reason)s\""},{"line_number":181,"context_line":"                  \" Please check the API service log for more details.\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_8a14a7a0","line":178,"in_reply_to":"9a80dd14_5acb6f71","updated":"2015-03-16 09:09:18.000000000","message":"Done","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"}],"manila/share/drivers/quobyte/quobyte.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"QuobyteManilaShare_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027The Quobyte CLI binary qmgmt (absolute path or in $PATH).\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5b17aced","line":34,"updated":"2015-03-04 17:22:32.000000000","message":"should be lower case.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"QuobyteManilaShare_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027The Quobyte CLI binary qmgmt (absolute path or in $PATH).\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_8f9a9d61","line":34,"in_reply_to":"9a80dd14_5b17aced","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"QuobyteManilaShare_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027The Quobyte CLI binary qmgmt (absolute path or in $PATH).\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The SSL ca file to verify the server cert.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_bb3b48ea","line":36,"updated":"2015-03-04 17:22:32.000000000","message":"example?","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"QuobyteManilaShare_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027The Quobyte CLI binary qmgmt (absolute path or in $PATH).\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The SSL ca file to verify the server cert.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_efccf963","line":36,"in_reply_to":"9a80dd14_bb3b48ea","updated":"2015-03-10 21:49:09.000000000","message":"help comment was an old one, corrected that.\nDone.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":49,"context_line":"               help\u003d\u0027Password for Quobyte API server\u0027),"},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027quobyte_volume_configuration\u0027,"},{"line_number":51,"context_line":"               default\u003dNone,"},{"line_number":52,"context_line":"               help\u003d\u0027Volume configuration for new shares.\u0027),"},{"line_number":53,"context_line":"    cfg.StrOpt(\u0027quobyte_default_volume_user\u0027,"},{"line_number":54,"context_line":"               default\u003d\u0027root\u0027,"},{"line_number":55,"context_line":"               help\u003d\u0027Default owning user for new volumes.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_7b31d00a","line":52,"updated":"2015-03-04 17:22:32.000000000","message":"It is unclear from description - what exactly should be here?\n\nFilepath?","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"               help\u003d\u0027Password for Quobyte API server\u0027),"},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027quobyte_volume_configuration\u0027,"},{"line_number":51,"context_line":"               default\u003dNone,"},{"line_number":52,"context_line":"               help\u003d\u0027Volume configuration for new shares.\u0027),"},{"line_number":53,"context_line":"    cfg.StrOpt(\u0027quobyte_default_volume_user\u0027,"},{"line_number":54,"context_line":"               default\u003d\u0027root\u0027,"},{"line_number":55,"context_line":"               help\u003d\u0027Default owning user for new volumes.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_4f2c2503","line":52,"in_reply_to":"9a80dd14_7b31d00a","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.configuration.append_config_values(QuobyteManilaShare_opts)"},{"line_number":72,"context_line":"        self._update_share_stats(dict("},{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5beecced","line":74,"updated":"2015-03-04 17:22:32.000000000","message":"Why do you hardcode name of backend? There can be a lot of backend instances and each can have its own name.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.configuration.append_config_values(QuobyteManilaShare_opts)"},{"line_number":72,"context_line":"        self._update_share_stats(dict("},{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def do_setup(self, context):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_f20e9e31","line":74,"in_reply_to":"9a80dd14_5beecced","updated":"2015-03-10 21:49:09.000000000","message":"Currently this is standardized, i\u0027ll add a todo to make this more configurable.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise (exception."},{"line_number":94,"context_line":"                   ManilaException(_(\u0027Could not connect to API: %s\u0027) % exc))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_d60e1334","line":93,"updated":"2015-03-04 17:22:32.000000000","message":"Better to rewrite as folllowing:\n\nraise exception.ManilaException(\n\n    _(\u0027Could not connect to API: %s\u0027) % exc))","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise (exception."},{"line_number":94,"context_line":"                   ManilaException(_(\u0027Could not connect to API: %s\u0027) % exc))"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_af1041a9","line":93,"in_reply_to":"9a80dd14_d60e1334","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def get_network_allocations_number(self):"},{"line_number":100,"context_line":"        return 0"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name.\"\"\""},{"line_number":104,"context_line":"        return project_id"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5ba7ac4f","line":102,"updated":"2015-03-04 17:22:32.000000000","message":"\"context\" is not used. Or you plan to use it later? If so, then need add \"TODO\".","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def get_network_allocations_number(self):"},{"line_number":100,"context_line":"        return 0"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name.\"\"\""},{"line_number":104,"context_line":"        return project_id"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_6f7d69e7","line":102,"in_reply_to":"9a80dd14_5ba7ac4f","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        except jsonrpc.ErrorResponseException as e:"},{"line_number":114,"context_line":"            if e.code \u003d\u003d jsonrpc.ERROR_ERRNO:"},{"line_number":115,"context_line":"                return None  # Not found"},{"line_number":116,"context_line":"            raise exception.ManilaException(e.message)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def create_share(self, context, share, share_server\u003dNone):"},{"line_number":119,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_1b929457","line":116,"updated":"2015-03-04 17:22:32.000000000","message":"You may want to raise QuotaByte specific exception here.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        except jsonrpc.ErrorResponseException as e:"},{"line_number":114,"context_line":"            if e.code \u003d\u003d jsonrpc.ERROR_ERRNO:"},{"line_number":115,"context_line":"                return None  # Not found"},{"line_number":116,"context_line":"            raise exception.ManilaException(e.message)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def create_share(self, context, share, share_server\u003dNone):"},{"line_number":119,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_0ffdcd3a","line":116,"in_reply_to":"9a80dd14_1b929457","updated":"2015-03-10 21:49:09.000000000","message":"We started out with a Quobyte exception but from cinder \u0026 nova experience some people where not happy with adding vendor specific exceptions.\nI\u0027ll add to the backlog for future overhaul that we get more specific here. Pls drop me a note if you want otherwise...","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            protocol\u003d\u0027NFS\u0027))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return \u0027%s:%s\u0027 % ("},{"line_number":143,"context_line":"            result[\u0027nfs_server_ip\u0027],"},{"line_number":144,"context_line":"            result[\u0027nfs_export_path\u0027])"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def delete_share(self, context, share, share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_5baa4c71","line":143,"updated":"2015-03-04 17:22:32.000000000","message":"When we have more than one value to substitute, it is recommended to use mapping replacement with dict.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            protocol\u003d\u0027NFS\u0027))"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        return \u0027%s:%s\u0027 % ("},{"line_number":143,"context_line":"            result[\u0027nfs_server_ip\u0027],"},{"line_number":144,"context_line":"            result[\u0027nfs_export_path\u0027])"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def delete_share(self, context, share, share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_ef7239e2","line":143,"in_reply_to":"9a80dd14_5baa4c71","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def ensure_share(self, context, share, share_server\u003dNone):"},{"line_number":177,"context_line":"        \"\"\"Invoked to ensure that share is exported.\"\"\""},{"line_number":178,"context_line":"        pass"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def allow_access(self, context, share, access, share_server\u003dNone):"},{"line_number":181,"context_line":"        \"\"\"Allow access to a share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_bbe7c8e3","line":178,"updated":"2015-03-04 17:22:32.000000000","message":"pass is redundant.","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def ensure_share(self, context, share, share_server\u003dNone):"},{"line_number":177,"context_line":"        \"\"\"Invoked to ensure that share is exported.\"\"\""},{"line_number":178,"context_line":"        pass"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def allow_access(self, context, share, access, share_server\u003dNone):"},{"line_number":181,"context_line":"        \"\"\"Allow access to a share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_6f4e4998","line":178,"in_reply_to":"9a80dd14_bbe7c8e3","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":189,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("},{"line_number":190,"context_line":"            volume_uuid\u003dvolume_uuid,"},{"line_number":191,"context_line":"            add_allow_ip\u003daccess[\u0027access_to\u0027]))"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":194,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_bbfee869","line":191,"updated":"2015-03-04 17:22:32.000000000","message":"What about level of access ro/rw?","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":189,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("},{"line_number":190,"context_line":"            volume_uuid\u003dvolume_uuid,"},{"line_number":191,"context_line":"            add_allow_ip\u003daccess[\u0027access_to\u0027]))"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":194,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_cf5e5545","line":191,"in_reply_to":"9a80dd14_bbfee869","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a29b9b5c97d6f937915fb3e5e4e2baf78a3f4733","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":194,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""},{"line_number":195,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":196,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":197,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_dba47c59","line":195,"updated":"2015-03-04 17:22:32.000000000","message":"Are you sure you want to raise error trying delete not-ip access rule, that can be only not-ip?\n\nIf you leave it so, then you want be able to delete access rules. Maybe better to just skip this step?","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"481e4b09eadbc8755f0c994264dda7ef67a641e0","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":194,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""},{"line_number":195,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":196,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":197,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_ef07991b","line":195,"in_reply_to":"9a80dd14_dba47c59","updated":"2015-03-10 21:49:09.000000000","message":"Done","commit_id":"d357de37061d37017cb2adcb21ba1ee1dff5ed20"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"quobyte_manila_share_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027URL of the Quobyte API server (http or https)\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_74219a4c","line":34,"updated":"2015-03-05 20:21:32.000000000","message":"All new opts should be added to manila/opts.py module for purposes of config sample generation.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"quobyte_manila_share_opts \u003d ["},{"line_number":35,"context_line":"    cfg.StrOpt(\u0027quobyte_api_url\u0027,"},{"line_number":36,"context_line":"               help\u003d\u0027URL of the Quobyte API server (http or https)\u0027),"},{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_55c5593a","line":34,"in_reply_to":"9a80dd14_74219a4c","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027admin\u0027,"},{"line_number":45,"context_line":"               help\u003d\u0027Username for Quobyte API server.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_86309602","line":42,"updated":"2015-03-06 03:33:43.000000000","message":"deletes","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"},{"line_number":44,"context_line":"               default\u003d\u0027admin\u0027,"},{"line_number":45,"context_line":"               help\u003d\u0027Username for Quobyte API server.\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b5e135d2","line":42,"in_reply_to":"9a80dd14_86309602","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"},{"line_number":76,"context_line":"        # TODO(kaisers): Make share_backend_name configurable"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def do_setup(self, context):"},{"line_number":79,"context_line":"        \"\"\"Prepares the backend.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_943b6e37","line":76,"updated":"2015-03-05 20:21:32.000000000","message":"Actually nothing to do here, see: \n\nhttps://github.com/openstack/manila/blob/4d19edb9/manila/share/driver.py#L350\n\nand \n\nhttps://github.com/openstack/manila/blob/4d19edb9/manila/share/driver.py#L357\n\nSo, you can add before line 72 following:\n\n################\n\nself.backend_name \u003d (self.configuration.safe_get(\u0027share_backend_name\u0027) or\n\n                                     CONF.share_backend_name or \u0027Quobyte\u0027)\n\n################\n\nAnd on line 74 set following:\n\nshare_backend_name\u003dself.backend_name,","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"},{"line_number":76,"context_line":"        # TODO(kaisers): Make share_backend_name configurable"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def do_setup(self, context):"},{"line_number":79,"context_line":"        \"\"\"Prepares the backend.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_b5993521","line":76,"in_reply_to":"9a80dd14_943b6e37","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f4ef4a85","line":94,"updated":"2015-03-05 20:21:32.000000000","message":"Second parameter is reserved, so, you won\u0027t get here substitution as you may expect.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_306473e4","line":94,"in_reply_to":"9a80dd14_31b00243","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_31b00243","line":94,"in_reply_to":"9a80dd14_f4ef4a85","updated":"2015-03-06 03:33:43.000000000","message":"+1","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_af6fa629","line":94,"in_reply_to":"9a80dd14_f4ef4a85","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_94ca8e6c","line":105,"updated":"2015-03-05 20:21:32.000000000","message":"Why do you need project name?\n\nAlso, usage of keystone client won\u0027t be allowed anyway.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"09a534f090e4839f4bdc05982016d61647bcb8ec","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9db9e6cd","line":105,"in_reply_to":"9a80dd14_5836c5e8","updated":"2015-03-11 21:35:03.000000000","message":"Thanks for the hint.\nI changed the todo entry accordingly...\nDone.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ba084292","line":105,"in_reply_to":"9a80dd14_94ca8e6c","updated":"2015-03-10 21:37:42.000000000","message":"We would prefer to use the project name in the backend file system as this improves readability \u0026 usability. \nIf accetable for you i\u0027d like to keep this todo, if not pls drop me a line.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d4f63f5a2fb7df27fb8fdb24d1aea66dd5577992","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_5836c5e8","line":105,"in_reply_to":"9a80dd14_ba084292","updated":"2015-03-11 08:17:17.000000000","message":"First of all, your point is to get \"project name\" and not to talk to Keystone.\n\nSecond, \"manila.context\" approach should be changed to have \"project name\" defined, as, for example, in Nova: \n\nhttps://github.com/openstack/nova/blob/7a4136df/nova/context.py#L132\n\nThat is, unfortunately, not done in KIlo. And Kilo featrue time is coming to end.\n\nSo, need to update \"TODO\" with:\n\n- setting of name of TODOer.\n\n- mentioning original intent which is \"get project name\". (Which, is possible in early Liberty, I guess.)","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""},{"line_number":123,"context_line":"        if share[\u0027share_proto\u0027] !\u003d \u0027NFS\u0027:"},{"line_number":124,"context_line":"            raise exception.ManilaException("},{"line_number":125,"context_line":"                \u0027Quobyte driver only supports NFS shares\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d1d40649","line":125,"updated":"2015-03-06 03:33:43.000000000","message":"exception.ManilaException(_(\u0027Quobyte driver .....\u0027))","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""},{"line_number":123,"context_line":"        if share[\u0027share_proto\u0027] !\u003d \u0027NFS\u0027:"},{"line_number":124,"context_line":"            raise exception.ManilaException("},{"line_number":125,"context_line":"                \u0027Quobyte driver only supports NFS shares\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f05c9bef","line":125,"in_reply_to":"9a80dd14_d1d40649","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"},{"line_number":129,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        if not volume_uuid:"},{"line_number":132,"context_line":"            result \u003d self.rpc.call(\u0027createVolume\u0027, dict("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_31e802e2","line":129,"updated":"2015-03-06 03:33:43.000000000","message":"It seems that you assumes the same tenant exists on your backend. How do you create the same tenants that exist in keystone on your backend?  Have you done keystone integration with your backend?","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"},{"line_number":129,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        if not volume_uuid:"},{"line_number":132,"context_line":"            result \u003d self.rpc.call(\u0027createVolume\u0027, dict("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ab51d60f","line":129,"in_reply_to":"9a80dd14_31e802e2","updated":"2015-03-10 21:37:42.000000000","message":"The tenant is only known if previously learned by share creation (see createVolume rpc call directly below)","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \"\"\"Allow access to a share.\"\"\""},{"line_number":184,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":185,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":186,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":189,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_f1ff4a65","line":186,"updated":"2015-03-06 03:33:43.000000000","message":"Use _(\u0027xxxx\u0027) for the message.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \"\"\"Allow access to a share.\"\"\""},{"line_number":184,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":185,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":186,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":189,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_cb6feac3","line":186,"in_reply_to":"9a80dd14_f1ff4a65","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":191,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("},{"line_number":192,"context_line":"            volume_uuid\u003dvolume_uuid,"},{"line_number":193,"context_line":"            read_only\u003d\u0027access_level\u0027 \u003d\u003d \u0027ro\u0027,"},{"line_number":194,"context_line":"            add_allow_ip\u003daccess[\u0027access_to\u0027]))"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_d4724648","line":193,"updated":"2015-03-05 20:21:32.000000000","message":"instead of explicit text \u0027ro\u0027 better to refer to const defined in https://github.com/openstack/manila/blob/4d19edb9/manila/common/constants.py#L58","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":191,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("},{"line_number":192,"context_line":"            volume_uuid\u003dvolume_uuid,"},{"line_number":193,"context_line":"            read_only\u003d\u0027access_level\u0027 \u003d\u003d \u0027ro\u0027,"},{"line_number":194,"context_line":"            add_allow_ip\u003daccess[\u0027access_to\u0027]))"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_6bc43e5f","line":193,"in_reply_to":"9a80dd14_d4724648","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":197,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""},{"line_number":198,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":199,"context_line":"            share[\u0027name\u0027],"},{"line_number":200,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":201,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_7f7df31b","line":198,"updated":"2015-03-05 20:21:32.000000000","message":"I guess here should be added something like following:\n\nif access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:\n\n    return\n\nIn this case you won\u0027t perform redundant operation of IP removal from \"allowed\" list, when it is not IP at all. This is case of attempt to delete \"error\" access rules of other types that \"IP\".","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def deny_access(self, context, share, access, share_server\u003dNone):"},{"line_number":197,"context_line":"        \"\"\"Remove white-list ip from a share.\"\"\""},{"line_number":198,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":199,"context_line":"            share[\u0027name\u0027],"},{"line_number":200,"context_line":"            self._get_project_name(context, share[\u0027project_id\u0027]))"},{"line_number":201,"context_line":"        self.rpc.call(\u0027exportVolume\u0027, dict("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_6b2b5e94","line":198,"in_reply_to":"9a80dd14_7f7df31b","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"71d1cab406b8e151bba84b692cf55c1f09d0238a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_e61d97bf","line":40,"updated":"2015-03-07 18:45:39.000000000","message":"This opt should be \"BoolOpt\" instead of \"StrOpt\", that\u0027s why you get error on \"genconfig\" job.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5ca18bf6","line":40,"in_reply_to":"9a80dd14_c73db5de","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_3c077783","line":40,"in_reply_to":"9a80dd14_e61d97bf","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    cfg.StrOpt(\u0027quobyte_api_ca\u0027,"},{"line_number":38,"context_line":"               default\u003dNone,"},{"line_number":39,"context_line":"               help\u003d\u0027The X.509 CA file to verify the server cert.\u0027),"},{"line_number":40,"context_line":"    cfg.StrOpt(\u0027quobyte_delete_shares\u0027,"},{"line_number":41,"context_line":"               default\u003dFalse,"},{"line_number":42,"context_line":"               help\u003d\u0027Actually delete shares (vs. unexport)\u0027),"},{"line_number":43,"context_line":"    cfg.StrOpt(\u0027quobyte_api_username\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_c73db5de","line":40,"in_reply_to":"9a80dd14_e61d97bf","updated":"2015-03-10 05:14:43.000000000","message":"Nice catch.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":62,"context_line":"CONF.register_opts(quobyte_manila_share_opts)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class QuobyteShareDriver(driver.ExecuteMixin, driver.ShareDriver,):"},{"line_number":66,"context_line":"    \"\"\"Map share commands to Quobyte volumes.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __init__(self, db, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_817125aa","line":65,"updated":"2015-03-07 19:45:58.000000000","message":"There are a few exception conditions in this file not covered by unit tests (lines 119, 124, 185).  Please add tests.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":62,"context_line":"CONF.register_opts(quobyte_manila_share_opts)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class QuobyteShareDriver(driver.ExecuteMixin, driver.ShareDriver,):"},{"line_number":66,"context_line":"    \"\"\"Map share commands to Quobyte volumes.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def __init__(self, db, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7c72bdae","line":65,"in_reply_to":"9a80dd14_817125aa","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        super(QuobyteShareDriver, self).__init__(False, *args, **kwargs)"},{"line_number":70,"context_line":"        self.db \u003d db"},{"line_number":71,"context_line":"        self.configuration.append_config_values(quobyte_manila_share_opts)"},{"line_number":72,"context_line":"        self._update_share_stats(dict("},{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_e603d70d","line":72,"updated":"2015-03-07 19:45:58.000000000","message":"You should override this method in your driver, add several additional fields such as storage_protocol, total_capacity_gb, free_capacity_gb, etc., and then call super.  Examples abound in other drivers.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        super(QuobyteShareDriver, self).__init__(False, *args, **kwargs)"},{"line_number":70,"context_line":"        self.db \u003d db"},{"line_number":71,"context_line":"        self.configuration.append_config_values(quobyte_manila_share_opts)"},{"line_number":72,"context_line":"        self._update_share_stats(dict("},{"line_number":73,"context_line":"            vendor_name\u003d\u0027Quobyte\u0027,"},{"line_number":74,"context_line":"            share_backend_name\u003d\u0027Quobyte\u0027,"},{"line_number":75,"context_line":"            driver_version\u003d\u00271.0\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_9b7940ca","line":72,"in_reply_to":"9a80dd14_e603d70d","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def do_setup(self, context):"},{"line_number":79,"context_line":"        \"\"\"Prepares the backend.\"\"\""},{"line_number":80,"context_line":"        super(QuobyteShareDriver, self).do_setup(context)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        self.rpc \u003d jsonrpc.JsonRpc("},{"line_number":83,"context_line":"            url\u003dself.configuration.quobyte_api_url,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_41064d1e","line":80,"updated":"2015-03-07 19:45:58.000000000","message":"No need to call super in do_setup.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def do_setup(self, context):"},{"line_number":79,"context_line":"        \"\"\"Prepares the backend.\"\"\""},{"line_number":80,"context_line":"        super(QuobyteShareDriver, self).do_setup(context)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        self.rpc \u003d jsonrpc.JsonRpc("},{"line_number":83,"context_line":"            url\u003dself.configuration.quobyte_api_url,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_1c5c7318","line":80,"in_reply_to":"9a80dd14_41064d1e","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_9a087029","line":92,"updated":"2015-03-10 05:14:43.000000000","message":"This is correct.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_3c9e97b9","line":92,"in_reply_to":"9a80dd14_9a087029","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_6107d118","line":93,"updated":"2015-03-07 19:45:58.000000000","message":"You should define your own subclass(es) of ManilaException.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5394fae7","line":93,"in_reply_to":"9a80dd14_6107d118","updated":"2015-03-10 21:38:20.000000000","message":"Will add these in patch set 11.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5a02780a","line":94,"updated":"2015-03-10 05:14:43.000000000","message":"Substitution won\u0027t happen in this format.  Should use % instead of \",\" here.  Should be like this:\n\nraise exception.ManilaException(_(\u0027xxxx %s\u0027) % exc)","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        except Exception as exc:"},{"line_number":92,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":93,"context_line":"            raise exception.ManilaException("},{"line_number":94,"context_line":"                _(\u0027Could not connect to API: %s\u0027), exc)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def check_for_setup_error(self):"},{"line_number":97,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_bc98c7c0","line":94,"in_reply_to":"9a80dd14_5a02780a","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_da3ca8ca","line":105,"updated":"2015-03-10 05:14:43.000000000","message":"I think I asked this question earlier but didn\u0027t see an answer.  Have you done Keystone integration with your backend?  If so, can you add a note here?","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":103,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"           TODO: retrieve the project name from Keystone."},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        return project_id"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_9c430312","line":105,"in_reply_to":"9a80dd14_da3ca8ca","updated":"2015-03-10 21:38:20.000000000","message":"I replied in patch set #6, weird this is not shown.\nCopy paste from there:\nThe tenant is only known if previously learned by share creation (see createVolume rpc call directly below)","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""},{"line_number":123,"context_line":"        if share[\u0027share_proto\u0027] !\u003d \u0027NFS\u0027:"},{"line_number":124,"context_line":"            raise exception.ManilaException("},{"line_number":125,"context_line":"                \u0027Quobyte driver only supports NFS shares\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7a53bc16","line":125,"updated":"2015-03-10 05:14:43.000000000","message":"Please use _(\u0027xxxx\u0027) for the exception message as commented earlier.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Create or export a volume that is usable as a Manila share.\"\"\""},{"line_number":123,"context_line":"        if share[\u0027share_proto\u0027] !\u003d \u0027NFS\u0027:"},{"line_number":124,"context_line":"            raise exception.ManilaException("},{"line_number":125,"context_line":"                \u0027Quobyte driver only supports NFS shares\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":128,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7cb3af09","line":125,"in_reply_to":"9a80dd14_7a53bc16","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            LOG.warning((_LW(\"No volume found for \""},{"line_number":154,"context_line":"                             \"share %(project_id)s/%(name)s\")"},{"line_number":155,"context_line":"                        % {\"project_id\": share[\u0027project_id\u0027],"},{"line_number":156,"context_line":"                           \"name\": share[\u0027name\u0027]}))"},{"line_number":157,"context_line":"            return"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if self.configuration.quobyte_delete_shares:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_21287985","line":156,"updated":"2015-03-07 19:45:58.000000000","message":"You have an extra pair of enclosing parentheses here.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            LOG.warning((_LW(\"No volume found for \""},{"line_number":154,"context_line":"                             \"share %(project_id)s/%(name)s\")"},{"line_number":155,"context_line":"                        % {\"project_id\": share[\u0027project_id\u0027],"},{"line_number":156,"context_line":"                           \"name\": share[\u0027name\u0027]}))"},{"line_number":157,"context_line":"            return"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"        if self.configuration.quobyte_delete_shares:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_1c99d378","line":156,"in_reply_to":"9a80dd14_21287985","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def create_snapshot(self, context, snapshot, share_server\u003dNone):"},{"line_number":167,"context_line":"        \"\"\"Is called to create snapshot.\"\"\""},{"line_number":168,"context_line":"        raise NotImplementedError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def create_share_from_snapshot(self, context, share, snapshot,"},{"line_number":171,"context_line":"                                   share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_611ef160","line":168,"updated":"2015-03-07 19:45:58.000000000","message":"Is this a TODO?  Snapshots are a core Manila feature.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def create_snapshot(self, context, snapshot, share_server\u003dNone):"},{"line_number":167,"context_line":"        \"\"\"Is called to create snapshot.\"\"\""},{"line_number":168,"context_line":"        raise NotImplementedError()"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def create_share_from_snapshot(self, context, share, snapshot,"},{"line_number":171,"context_line":"                                   share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_1c70f33e","line":168,"in_reply_to":"9a80dd14_611ef160","updated":"2015-03-10 21:38:20.000000000","message":"Yep, that is noted on my backlog for future extension.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"d9df599d820029248711016e1003bd38c0472425","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \"\"\"Allow access to a share.\"\"\""},{"line_number":184,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":185,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":186,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":189,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_ba70d4a4","line":186,"updated":"2015-03-10 05:14:43.000000000","message":"Use _(\u0027xxxx\u0027) for the exception message.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        \"\"\"Allow access to a share.\"\"\""},{"line_number":184,"context_line":"        if access[\u0027access_type\u0027] !\u003d \u0027ip\u0027:"},{"line_number":185,"context_line":"            raise exception.InvalidShareAccess("},{"line_number":186,"context_line":"                \u0027Quobyte driver only supports ip access control\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        volume_uuid \u003d self._resolve_volume_name("},{"line_number":189,"context_line":"            share[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_9cb223e3","line":186,"in_reply_to":"9a80dd14_ba70d4a4","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"309feb9088adb3a0fd31e6bc973911eb9ec4e03f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":111,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        TODO: retrieve the project name from Keystone in order"},{"line_number":114,"context_line":"        to store and use in the backend for easier usability."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        return project_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_6cb58e30","line":113,"updated":"2015-03-11 08:19:17.000000000","message":"Please, see comment in ps6 for it.","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"2528a6c2745458d02c0390cea46227a916ddf468","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    def _get_project_name(self, context, project_id):"},{"line_number":111,"context_line":"        \"\"\"Retrieve the project name."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        TODO: retrieve the project name from Keystone in order"},{"line_number":114,"context_line":"        to store and use in the backend for easier usability."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        return project_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_3dc47a3f","line":113,"in_reply_to":"9a80dd14_6cb58e30","updated":"2015-03-11 21:35:15.000000000","message":"Done","commit_id":"7114cf5cb120d6f3c84679f23049287128648f34"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":90,"context_line":"        except Exception as exc:"},{"line_number":91,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":92,"context_line":"            raise exception.QBException("},{"line_number":93,"context_line":"                _(\u0027Could not connect to API: %s\u0027) % exc)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_1af577ec","line":90,"updated":"2015-03-14 22:32:07.000000000","message":"This is fine, but you may also wish to look at using the excutils.save_and_reraise_exception mechanism.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        try:"},{"line_number":89,"context_line":"            self.rpc.call(\u0027getInformation\u0027, {})"},{"line_number":90,"context_line":"        except Exception as exc:"},{"line_number":91,"context_line":"            LOG.error(_LE(\"Could not connect to API: %s\"), exc)"},{"line_number":92,"context_line":"            raise exception.QBException("},{"line_number":93,"context_line":"                _(\u0027Could not connect to API: %s\u0027) % exc)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_b00abacf","line":90,"in_reply_to":"9a80dd14_1af577ec","updated":"2015-03-16 09:09:18.000000000","message":"Yep, thought about that but considered this simpler for this case.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def create_snapshot(self, context, snapshot, share_server\u003dNone):"},{"line_number":173,"context_line":"        \"\"\"Is called to create snapshot.\"\"\""},{"line_number":174,"context_line":"        raise NotImplementedError()"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def create_share_from_snapshot(self, context, share, snapshot,"},{"line_number":177,"context_line":"                                   share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_ba39cba5","line":174,"updated":"2015-03-14 22:32:07.000000000","message":"Snapshots are a core Manila feature.  You indicated this was on your feature backlog, but has Ben given you a waiver to merge a driver without this feature in Kilo?  Or is this coming in the next few days?","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def create_snapshot(self, context, snapshot, share_server\u003dNone):"},{"line_number":173,"context_line":"        \"\"\"Is called to create snapshot.\"\"\""},{"line_number":174,"context_line":"        raise NotImplementedError()"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def create_share_from_snapshot(self, context, share, snapshot,"},{"line_number":177,"context_line":"                                   share_server\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_301dea0f","line":174,"in_reply_to":"9a80dd14_ba39cba5","updated":"2015-03-16 09:09:18.000000000","message":"I understood Ben wanted K-3 stuff to merge as soon as possible, so i currently do not plan to add it today as it would drag out the review process.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"}],"manila/tests/fake_share.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d6e98abe9dfc8406e297701ab07660b3ef0ab8c8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    return db_fakes.FakeModel(access)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def fake_non_existant_access(**kwargs):"},{"line_number":62,"context_line":"    access \u003d {"},{"line_number":63,"context_line":"        \u0027id\u0027: \u0027fakeaccid\u0027,"},{"line_number":64,"context_line":"        \u0027access_type\u0027: \u0027non_existant_access_type\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_ee2564c2","line":61,"updated":"2015-03-13 17:53:38.000000000","message":"This is duplication of above one.\n\nEven if you do not want to use above one in your code providing one additional param with fake access type, you can define this new one as wrapper on above one.","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f930709cb7b67eb5a78dad2fb67b78bee5b3d7ca","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    return db_fakes.FakeModel(access)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def fake_non_existant_access(**kwargs):"},{"line_number":62,"context_line":"    access \u003d {"},{"line_number":63,"context_line":"        \u0027id\u0027: \u0027fakeaccid\u0027,"},{"line_number":64,"context_line":"        \u0027access_type\u0027: \u0027non_existant_access_type\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_0218c4d1","line":61,"in_reply_to":"9a80dd14_ee2564c2","updated":"2015-03-13 21:03:42.000000000","message":"Done\n\n(didn\u0027t realize the entries where updated by kwargs, thanks for pointing me at this! :) )","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"}],"manila/tests/share/drivers/quobyte/test_jsonrpc.py":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"3e3ef66e25f7aab8cbbbca81179a9d231732fb5a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return_value\u003dFakeResponse("},{"line_number":60,"context_line":"                200, \u0027{\"result\":\"Sweet gorilla of Manila\"}\u0027))"},{"line_number":61,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":62,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_http_error(self):"},{"line_number":65,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_2c97c991","line":62,"updated":"2015-03-06 03:33:43.000000000","message":"The order of the input parameters should be expected, actual.  This is reversed.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return_value\u003dFakeResponse("},{"line_number":60,"context_line":"                200, \u0027{\"result\":\"Sweet gorilla of Manila\"}\u0027))"},{"line_number":61,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":62,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_http_error(self):"},{"line_number":65,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_fd12af07","line":62,"in_reply_to":"9a80dd14_2c97c991","updated":"2015-03-10 21:37:42.000000000","message":"Not sure i do completely get your comment, you mean the parameters should switch position?","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"fed0da1985c2b6a284b019bccd595549afa6f4db","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return_value\u003dFakeResponse("},{"line_number":60,"context_line":"                200, \u0027{\"result\":\"Sweet gorilla of Manila\"}\u0027))"},{"line_number":61,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":62,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_http_error(self):"},{"line_number":65,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_9ded45ba","line":62,"in_reply_to":"9a80dd14_ae714de2","updated":"2015-03-13 14:33:22.000000000","message":"Finally, finally, finally the stone age man that is me understood, thanks. will update accordingly.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"fec08b8f37a77b2bb0295dd20387b23635f9183f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            return_value\u003dFakeResponse("},{"line_number":60,"context_line":"                200, \u0027{\"result\":\"Sweet gorilla of Manila\"}\u0027))"},{"line_number":61,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":62,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def test_http_error(self):"},{"line_number":65,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ae714de2","line":62,"in_reply_to":"9a80dd14_fd12af07","updated":"2015-03-10 21:55:41.000000000","message":"What I mean is it should be like this:\n\nself.assertEqual(\"Sweet gorilla of Manila\", result)\n\nOtherwise the mismatch error message won\u0027t be accurate.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def test_request_generation_and_basic_auth(self):"},{"line_number":44,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("},{"line_number":45,"context_line":"            return_value\u003dFakeResponse(200, \u0027{\"result\":\"yes\"}\u0027))"},{"line_number":46,"context_line":"        self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":47,"context_line":"        self.rpc._connection.request.assert_called_with("},{"line_number":48,"context_line":"            \u0027POST\u0027, \u0027http://test/\u0027,"},{"line_number":49,"context_line":"            jsonutils.dumps({\u0027jsonrpc\u0027: \u00272.0\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_214f996c","line":46,"updated":"2015-03-07 19:45:58.000000000","message":"Please add whitespace to your test methods so there are three sections (mocks, test call, assertions).  Tests are much easier to read that way.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def test_request_generation_and_basic_auth(self):"},{"line_number":44,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("},{"line_number":45,"context_line":"            return_value\u003dFakeResponse(200, \u0027{\"result\":\"yes\"}\u0027))"},{"line_number":46,"context_line":"        self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":47,"context_line":"        self.rpc._connection.request.assert_called_with("},{"line_number":48,"context_line":"            \u0027POST\u0027, \u0027http://test/\u0027,"},{"line_number":49,"context_line":"            jsonutils.dumps({\u0027jsonrpc\u0027: \u00272.0\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_421b6680","line":46,"in_reply_to":"9a80dd14_214f996c","updated":"2015-03-10 21:38:20.000000000","message":"Done","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        creds \u003d jsonrpc.BasicAuthCredentials(\u0027fakeuser\u0027, \u0027fakepwd\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.assertEqual(creds.get_authorization_header(),"},{"line_number":52,"context_line":"                         \u0027BASIC ZmFrZXVzZXI6ZmFrZXB3ZA\u003d\u003d\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def test_request_generation_and_basic_auth(self):"},{"line_number":55,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_0003c5b8","line":52,"updated":"2015-03-12 03:03:34.000000000","message":"The order of the parameters are reversed. It should be expected, actual.  So like this.\n\nself.assertEqual( \u0027BASIC ZmFrZXVzZXI6ZmFrZXB3ZA\u003d\u003d\u0027, creds.get_authorization_header())","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        creds \u003d jsonrpc.BasicAuthCredentials(\u0027fakeuser\u0027, \u0027fakepwd\u0027)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.assertEqual(creds.get_authorization_header(),"},{"line_number":52,"context_line":"                         \u0027BASIC ZmFrZXVzZXI6ZmFrZXB3ZA\u003d\u003d\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def test_request_generation_and_basic_auth(self):"},{"line_number":55,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_3d545953","line":52,"in_reply_to":"9a80dd14_0003c5b8","updated":"2015-03-13 14:26:56.000000000","message":"Done","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_jsonrpc_call_ssl_disable(self):"},{"line_number":111,"context_line":"        self.rpc._connection.request \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_602f213f","line":108,"updated":"2015-03-12 03:03:34.000000000","message":"Here too","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        result \u003d self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        self.assertEqual(result, \"Sweet gorilla of Manila\")"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_jsonrpc_call_ssl_disable(self):"},{"line_number":111,"context_line":"        self.rpc._connection.request \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_7d4ed1c2","line":108,"in_reply_to":"9a80dd14_602f213f","updated":"2015-03-13 14:26:56.000000000","message":"Done","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":129,"context_line":"        except exception.ManilaException as me:"},{"line_number":130,"context_line":"            self.assertEqual(six.text_type(me),"},{"line_number":131,"context_line":"                             \"Client SSL subsystem returned error: \")"},{"line_number":132,"context_line":"        except Exception as e:"},{"line_number":133,"context_line":"            self.fail(\u0027Unexpected exception thrown: %s\u0027 % e)"},{"line_number":134,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_c01fed07","line":131,"updated":"2015-03-12 03:03:34.000000000","message":"Here","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":128,"context_line":"            self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":129,"context_line":"        except exception.ManilaException as me:"},{"line_number":130,"context_line":"            self.assertEqual(six.text_type(me),"},{"line_number":131,"context_line":"                             \"Client SSL subsystem returned error: \")"},{"line_number":132,"context_line":"        except Exception as e:"},{"line_number":133,"context_line":"            self.fail(\u0027Unexpected exception thrown: %s\u0027 % e)"},{"line_number":134,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_3ddb79ee","line":131,"in_reply_to":"9a80dd14_c01fed07","updated":"2015-03-13 14:26:56.000000000","message":"Done","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        except Exception as e:"},{"line_number":133,"context_line":"            self.fail(\u0027Unexpected exception thrown: %s\u0027 % e)"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    # The following test fails because of a bug in mock?"},{"line_number":138,"context_line":"    # Mock.__init__ fails with BadstatusLine side_effect, for whatever reason."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_e0e151fd","line":135,"updated":"2015-03-12 03:03:34.000000000","message":"This should be a success case.  It\u0027s odd to call self.fail(xxx)","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        except Exception as e:"},{"line_number":133,"context_line":"            self.fail(\u0027Unexpected exception thrown: %s\u0027 % e)"},{"line_number":134,"context_line":"        else:"},{"line_number":135,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    # The following test fails because of a bug in mock?"},{"line_number":138,"context_line":"    # Mock.__init__ fails with BadstatusLine side_effect, for whatever reason."}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_fd6d6105","line":135,"in_reply_to":"9a80dd14_e0e151fd","updated":"2015-03-13 14:26:56.000000000","message":"No, this test is successful if a ManilaException with the exact message tested for in the first except path is raised.\nRaising of another exception of passing without exception means that this test failed.\n\nNormally it would be simpler to use asserRaises in the ContextManager variant but for reasons i don not know all ContextManager based code fails in the tests. Some python 2.6 compatibility mode?\n\nRegardless, the above tests works as intended but i will add a short explanation comment.","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    #             \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":153,"context_line":"    #             \" status code from server response. Error was \")"},{"line_number":154,"context_line":"    #     else:"},{"line_number":155,"context_line":"    #         self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def test_jsonrpc_call_http_exception_failfast(self):"},{"line_number":158,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_a0ae7996","line":155,"updated":"2015-03-12 03:03:34.000000000","message":"I guess you want to remove above?","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    #             \" start with \u0027https://\u0027 for the URL. Failed to parse\""},{"line_number":153,"context_line":"    #             \" status code from server response. Error was \")"},{"line_number":154,"context_line":"    #     else:"},{"line_number":155,"context_line":"    #         self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def test_jsonrpc_call_http_exception_failfast(self):"},{"line_number":158,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_c388c024","line":155,"in_reply_to":"9a80dd14_a0ae7996","updated":"2015-03-13 14:26:56.000000000","message":"Yes, will do. Kept it in there at the moment to ponder about it and maybe somebody has an idea.\nI replaced it with less accurate but working version and a comment.","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"619577640b2598754cd01d5359067959d2b5ea8b","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":186,"context_line":"        except exception.ManilaException as me:"},{"line_number":187,"context_line":"            self.assertEqual(six.text_type(me),"},{"line_number":188,"context_line":"                             \"Unable to connect to backend after 0 retries\")"},{"line_number":189,"context_line":"        else:"},{"line_number":190,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_808255fe","line":188,"updated":"2015-03-12 03:03:34.000000000","message":"This is also reversed.","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"d6718e48594d916b4edce0a0bd0ea53680401633","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            self.rpc.call(\u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":186,"context_line":"        except exception.ManilaException as me:"},{"line_number":187,"context_line":"            self.assertEqual(six.text_type(me),"},{"line_number":188,"context_line":"                             \"Unable to connect to backend after 0 retries\")"},{"line_number":189,"context_line":"        else:"},{"line_number":190,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_a6fe7aac","line":188,"in_reply_to":"9a80dd14_808255fe","updated":"2015-03-13 14:26:56.000000000","message":"Done","commit_id":"c5ac018512ac82f8c722cb01f7e865d0d0690439"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"dd65449a52d32cf4223419440719b5456349a78e","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                     }"},{"line_number":251,"context_line":"                           }"},{"line_number":252,"context_line":"                          )"},{"line_number":253,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_f45e1844","line":253,"updated":"2015-03-13 16:50:19.000000000","message":"You may get a pep8 error on the white spaces here.","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"17d426c014d513ecf7b42aac58bec18d2f558ea9","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                     }"},{"line_number":251,"context_line":"                           }"},{"line_number":252,"context_line":"                          )"},{"line_number":253,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_82ad9433","line":253,"in_reply_to":"9a80dd14_a21b7871","updated":"2015-03-13 21:06:22.000000000","message":"Final update, tox \u0026 vi did not show but sublime\u0027s python plugin did, removed the whitespaces.\nWeird tox -epep8 considered it ok all the time...","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f930709cb7b67eb5a78dad2fb67b78bee5b3d7ca","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                     }"},{"line_number":251,"context_line":"                           }"},{"line_number":252,"context_line":"                          )"},{"line_number":253,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_c216ac48","line":253,"in_reply_to":"9a80dd14_b1790d84","updated":"2015-03-13 21:03:42.000000000","message":"see above","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"d6e98abe9dfc8406e297701ab07660b3ef0ab8c8","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                     }"},{"line_number":251,"context_line":"                           }"},{"line_number":252,"context_line":"                          )"},{"line_number":253,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_b1790d84","line":253,"in_reply_to":"9a80dd14_f45e1844","updated":"2015-03-13 17:53:38.000000000","message":"+1","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f930709cb7b67eb5a78dad2fb67b78bee5b3d7ca","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                                     }"},{"line_number":251,"context_line":"                           }"},{"line_number":252,"context_line":"                          )"},{"line_number":253,"context_line":"    "}],"source_content_type":"text/x-python","patch_set":13,"id":"9a80dd14_a21b7871","line":253,"in_reply_to":"9a80dd14_f45e1844","updated":"2015-03-13 21:03:42.000000000","message":"Weird, i did to -epep8 test and it showed no issue. Just repeated that check, same result (go green).\nI now checked the file and it\u0027s good. Seems the diff tool wants some extra biscuit?","commit_id":"fd010b6bf71d75835842b33a7d997c86fc277959"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4bb61f69064e28ee201d81a2447b468f67b48181","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.rpc._connection \u003d mock.Mock()"},{"line_number":46,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def tearDown(self):"},{"line_number":49,"context_line":"        del self.rpc"},{"line_number":50,"context_line":"        super(QuobyteJsonRpcTestCase, self).tearDown()"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_57dc2f46","line":48,"updated":"2015-03-14 09:47:35.000000000","message":"\"tearDown\" is completely redundant. \"setUp\" runs for each test and \"self.rpc\" is recreated each time.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ca55f187b923b44efc19db783e14ac11cd8d964d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.rpc._connection \u003d mock.Mock()"},{"line_number":46,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def tearDown(self):"},{"line_number":49,"context_line":"        del self.rpc"},{"line_number":50,"context_line":"        super(QuobyteJsonRpcTestCase, self).tearDown()"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_7284e10a","line":48,"in_reply_to":"9a80dd14_57dc2f46","updated":"2015-03-14 13:15:10.000000000","message":"Done","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4bb61f69064e28ee201d81a2447b468f67b48181","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        There should also be a test for BadStatusLine path in JsonRpc."},{"line_number":153,"context_line":"        But assertRaises with ContextManager does not work and"},{"line_number":154,"context_line":"        try/except based analysis fails in Mock.__init__() (mock bug?)."},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":157,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_17d63728","line":154,"updated":"2015-03-14 09:47:35.000000000","message":"\"BadStatusLine\" has one required param, so it is incorrect to use as following:\n\nself.rpc._connection.getresponse \u003d mock.Mock(side_effect\u003dhttplib.BadStatusLine)\n\nShould be:\n\nself.rpc._connection.getresponse \u003d mock.Mock(side_effect\u003dhttplib.BadStatusLine(\u0027some_fake_line\u0027))\n\nMaybe this is the reason?","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ca55f187b923b44efc19db783e14ac11cd8d964d","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        There should also be a test for BadStatusLine path in JsonRpc."},{"line_number":153,"context_line":"        But assertRaises with ContextManager does not work and"},{"line_number":154,"context_line":"        try/except based analysis fails in Mock.__init__() (mock bug?)."},{"line_number":155,"context_line":"        \"\"\""},{"line_number":156,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":157,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_b2c73944","line":154,"in_reply_to":"9a80dd14_17d63728","updated":"2015-03-14 13:15:10.000000000","message":"Sounds like this could be the reason (slapping me-self), I\u0027ll check it out now.\n*sigh* Yep that works. Added the test and thanks for pointing out!","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4bb61f69064e28ee201d81a2447b468f67b48181","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.assertRaises(exception.QBException,"},{"line_number":162,"context_line":"                          self.rpc.call,"},{"line_number":163,"context_line":"                          \u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":164,"context_line":"        jsonrpc.LOG.warning.assert_not_called("},{"line_number":165,"context_line":"            \"Could not verify server certificate of \""},{"line_number":166,"context_line":"            \"API service against CA.\")"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_d7c65f67","line":164,"updated":"2015-03-14 09:47:35.000000000","message":"mock does not have such method and nothing is tested here.\n\nOne of following can be used instead:\n\n1) jsonrpc.LOG.warning.assert_has_calls([])\n\n2) self.assertFalse(jsonrpc.LOG.warning.called)","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ca55f187b923b44efc19db783e14ac11cd8d964d","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        self.assertRaises(exception.QBException,"},{"line_number":162,"context_line":"                          self.rpc.call,"},{"line_number":163,"context_line":"                          \u0027method\u0027, {\u0027param\u0027: \u0027value\u0027})"},{"line_number":164,"context_line":"        jsonrpc.LOG.warning.assert_not_called("},{"line_number":165,"context_line":"            \"Could not verify server certificate of \""},{"line_number":166,"context_line":"            \"API service against CA.\")"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_f26ff15d","line":164,"in_reply_to":"9a80dd14_d7c65f67","updated":"2015-03-14 13:15:10.000000000","message":"Done","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4bb61f69064e28ee201d81a2447b468f67b48181","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        jsonrpc.CONNECTION_RETRIES \u003d orig_retries"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def test_http_error_401(self):"},{"line_number":196,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_37a7bbbe","line":193,"updated":"2015-03-14 09:47:35.000000000","message":"This is not reached if line 191 is executed. So, need rework test.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"61a9c634d65d359ea8b5196b1a55cf4c4f8180a5","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        jsonrpc.CONNECTION_RETRIES \u003d orig_retries"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def test_http_error_401(self):"},{"line_number":196,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_b23c9930","line":193,"in_reply_to":"9a80dd14_12b9e5cb","updated":"2015-03-14 13:21:04.000000000","message":"\"finally\" will work.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ca55f187b923b44efc19db783e14ac11cd8d964d","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        jsonrpc.CONNECTION_RETRIES \u003d orig_retries"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def test_http_error_401(self):"},{"line_number":196,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_12b9e5cb","line":193,"in_reply_to":"9a80dd14_37a7bbbe","updated":"2015-03-14 13:15:10.000000000","message":"moved it to finally now.\nI\u0027m not 100% sure but from the python docs i read this should be ok.\nOtherwise I\u0027ll brute force move this to tearDown.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"8135c0ff146c453b489810ad83cb40d72dfbcc3a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        else:"},{"line_number":191,"context_line":"            self.fail(\u0027Expected exception not thrown\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        jsonrpc.CONNECTION_RETRIES \u003d orig_retries"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def test_http_error_401(self):"},{"line_number":196,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_1263a542","line":193,"in_reply_to":"9a80dd14_b23c9930","updated":"2015-03-14 13:27:59.000000000","message":"great.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"beb8875f7ae642db22b71cfca088fd099378e7b5","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        There should also be a test for BadStatusLine path in JsonRpc."},{"line_number":158,"context_line":"        But assertRaises with ContextManager does not work and"},{"line_number":159,"context_line":"        try/except based analysis fails in Mock.__init__() (mock bug?)."},{"line_number":160,"context_line":"        \"\"\""},{"line_number":161,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":162,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_924155ab","line":159,"updated":"2015-03-14 13:20:58.000000000","message":"Comment not removed. It is false.","commit_id":"12398a27c7d02bf0c6fbec34038b3b0df65a838d"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"0704d7181e1d7cd0d4c2f19eb8f798c34c792193","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        There should also be a test for BadStatusLine path in JsonRpc."},{"line_number":158,"context_line":"        But assertRaises with ContextManager does not work and"},{"line_number":159,"context_line":"        try/except based analysis fails in Mock.__init__() (mock bug?)."},{"line_number":160,"context_line":"        \"\"\""},{"line_number":161,"context_line":"        self.rpc._connection.request \u003d mock.Mock()"},{"line_number":162,"context_line":"        self.rpc._connection.getresponse \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_52827dc8","line":159,"in_reply_to":"9a80dd14_924155ab","updated":"2015-03-14 13:26:57.000000000","message":"Done","commit_id":"12398a27c7d02bf0c6fbec34038b3b0df65a838d"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"71e89bd6890603d495720a012014b5056cb30897","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @mock.patch.object(socket, \"create_connection\","},{"line_number":56,"context_line":"                       return_value\u003d\"fake_socket\")"},{"line_number":57,"context_line":"    @mock.patch.object(ssl, \"wrap_socket\")"},{"line_number":58,"context_line":"    def test_https_with_ca_connect(self, mock_ssl, mock_cc):"},{"line_number":59,"context_line":"        key_file \u003d tempfile.TemporaryFile()"},{"line_number":60,"context_line":"        cert_file \u003d tempfile.gettempdir()"},{"line_number":61,"context_line":"        ca_file \u003d tempfile.gettempdir()"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_0e5339e3","line":58,"updated":"2015-03-17 02:52:47.000000000","message":"I would have expected the tests for HTTPSConnectionWithCaVerification to be in a separate class in this file, i.e. HTTPSConnectionWithCaVerificationTestCase.  Otherwise, looks fine.","commit_id":"97c6a0468d308800166f02d88184991108dc2856"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"299a5ffe6af6974bcb9ee61d41343a5acb0710df","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    @mock.patch.object(socket, \"create_connection\","},{"line_number":56,"context_line":"                       return_value\u003d\"fake_socket\")"},{"line_number":57,"context_line":"    @mock.patch.object(ssl, \"wrap_socket\")"},{"line_number":58,"context_line":"    def test_https_with_ca_connect(self, mock_ssl, mock_cc):"},{"line_number":59,"context_line":"        key_file \u003d tempfile.TemporaryFile()"},{"line_number":60,"context_line":"        cert_file \u003d tempfile.gettempdir()"},{"line_number":61,"context_line":"        ca_file \u003d tempfile.gettempdir()"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a80dd14_4cec54f4","line":58,"in_reply_to":"9a80dd14_0e5339e3","updated":"2015-03-17 07:16:43.000000000","message":"Moved HTTPSConnectionWithCaVerification and BasicAuthCredentials tests to separate TestCase classes.","commit_id":"97c6a0468d308800166f02d88184991108dc2856"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"76d9f2bfc2da67ff8b64b00c84b5ba5bfd6ee055","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return self._body"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class QuobyteBacsicAuthCredentialsTestCase(test.TestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_get_authorization_header(self):"},{"line_number":43,"context_line":"        creds \u003d jsonrpc.BasicAuthCredentials(\u0027fakeuser\u0027, \u0027fakepwd\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a80dd14_ec798831","line":40,"updated":"2015-03-17 07:18:49.000000000","message":"s/Bacsic/Basic/","commit_id":"b11159541a8a08cca0da4b42ddffb92cac374ed9"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"98f1d3be132b07c238e5eac03567dc48ad13c965","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        return self._body"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class QuobyteBacsicAuthCredentialsTestCase(test.TestCase):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def test_get_authorization_header(self):"},{"line_number":43,"context_line":"        creds \u003d jsonrpc.BasicAuthCredentials(\u0027fakeuser\u0027, \u0027fakepwd\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a80dd14_868b8867","line":40,"in_reply_to":"9a80dd14_ec798831","updated":"2015-03-17 09:05:05.000000000","message":"Done","commit_id":"b11159541a8a08cca0da4b42ddffb92cac374ed9"}],"manila/tests/share/drivers/quobyte/test_quobyte.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        self._driver.rpc.call \u003d mock.Mock(wraps\u003drpc_handler)"},{"line_number":136,"context_line":"        self._driver.delete_share(self._context, self.share)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_allow_access(self):"},{"line_number":139,"context_line":"        def rpc_handler(name, *args):"},{"line_number":140,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":141,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_ffde4310","line":138,"updated":"2015-03-05 20:21:32.000000000","message":"Allow access operation has more than one case. No case for non-IP rule.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        self._driver.rpc.call \u003d mock.Mock(wraps\u003drpc_handler)"},{"line_number":136,"context_line":"        self._driver.delete_share(self._context, self.share)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_allow_access(self):"},{"line_number":139,"context_line":"        def rpc_handler(name, *args):"},{"line_number":140,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":141,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_a0b9eb16","line":138,"in_reply_to":"9a80dd14_ffde4310","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"a19e91c60abe9e8297ff63848930ddd1e58aea75","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                             \u0027read_only\u0027: False,"},{"line_number":151,"context_line":"                             \u0027add_allow_ip\u0027: \u002710.0.0.1\u0027})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_deny_access(self):"},{"line_number":154,"context_line":"        def rpc_handler(name, *args):"},{"line_number":155,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":156,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_3fe9bbb8","line":153,"updated":"2015-03-05 20:21:32.000000000","message":"No case for non-Ip rule.","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e352acbbcc47419785d29e497fa3a6590053b6a9","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                             \u0027read_only\u0027: False,"},{"line_number":151,"context_line":"                             \u0027add_allow_ip\u0027: \u002710.0.0.1\u0027})"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def test_deny_access(self):"},{"line_number":154,"context_line":"        def rpc_handler(name, *args):"},{"line_number":155,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":156,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_e03e838b","line":153,"in_reply_to":"9a80dd14_3fe9bbb8","updated":"2015-03-10 21:37:42.000000000","message":"Done","commit_id":"49d0a087e7f46fd573dbb9a95bb2fd6971516beb"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"fadc21a32365a9a3d34698ba67634026cd1cc108","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.share \u003d fake_share.fake_share(share_proto\u003d\u0027NFS\u0027)"},{"line_number":47,"context_line":"        self.access \u003d fake_share.fake_access()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @mock.patch(\u0027manila.share.drivers.quobyte.jsonrpc.JsonRpc\u0027, mock.Mock())"},{"line_number":50,"context_line":"    def test_do_setup_success(self):"},{"line_number":51,"context_line":"        self._driver.rpc.call \u003d mock.Mock(return_value\u003dNone)"},{"line_number":52,"context_line":"        self._driver.do_setup(self._context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_0146154f","line":49,"updated":"2015-03-07 19:45:58.000000000","message":"I suggest you use self.mock_object() instead of the @mock decorators.  Examples abound in other test files.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"c50fbd0e2f13d25232a426ec9d63d417468ac8ac","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.share \u003d fake_share.fake_share(share_proto\u003d\u0027NFS\u0027)"},{"line_number":47,"context_line":"        self.access \u003d fake_share.fake_access()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @mock.patch(\u0027manila.share.drivers.quobyte.jsonrpc.JsonRpc\u0027, mock.Mock())"},{"line_number":50,"context_line":"    def test_do_setup_success(self):"},{"line_number":51,"context_line":"        self._driver.rpc.call \u003d mock.Mock(return_value\u003dNone)"},{"line_number":52,"context_line":"        self._driver.do_setup(self._context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_a75a74ef","line":49,"in_reply_to":"9a80dd14_0146154f","updated":"2015-03-10 21:38:20.000000000","message":"Could you elaborate why? Nova and Cinder reviewers seem to prefer the annotation variant and i tend to agree with them. So if the annotation is not accetable for you please drop me a line and i can change this but otherwise i would prefer to keep it like this.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"506a96bfb06218f74e4ed9583df52f410df13b6f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.share \u003d fake_share.fake_share(share_proto\u003d\u0027NFS\u0027)"},{"line_number":47,"context_line":"        self.access \u003d fake_share.fake_access()"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @mock.patch(\u0027manila.share.drivers.quobyte.jsonrpc.JsonRpc\u0027, mock.Mock())"},{"line_number":50,"context_line":"    def test_do_setup_success(self):"},{"line_number":51,"context_line":"        self._driver.rpc.call \u003d mock.Mock(return_value\u003dNone)"},{"line_number":52,"context_line":"        self._driver.do_setup(self._context)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_e77523cd","line":49,"in_reply_to":"9a80dd14_a75a74ef","updated":"2015-03-11 02:20:35.000000000","message":"The annotations are OK if you prefer them.  I think mock_object is cleaner for several reasons:\n\n* It provides a default mock if that\u0027s all you need.\n* It doesn\u0027t make you pass mocks (in reverse order) into your test method.\n* It makes the 3 sections (mocks, test call, assertions) more salient.\n* It seems (to me, anyway) less distracting and easier to read.","commit_id":"e68ca5444210f68681c12890c2ef02e34630953c"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4bb61f69064e28ee201d81a2447b468f67b48181","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                        \u0027nfs_export_path\u0027: \u0027/voluuid\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        self._driver.rpc.call \u003d mock.Mock(wraps\u003drpc_handler)"},{"line_number":224,"context_line":"        self.access \u003d fake_share.fake_access(**{\"access_type\":"},{"line_number":225,"context_line":"                                                \"non_existant_access_type\"})"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        self._driver.deny_access(self._context, self.share, self.access)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_77adb39a","line":224,"updated":"2015-03-14 09:47:35.000000000","message":"Oh my eyes, obfuscation in open source \u003d)\n\n\"\"\"\n\nself.access \u003d fake_share.fake_access(\n\n    access_type\u003d\"non_existant_access_type\")\n\n\"\"\"","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"ca55f187b923b44efc19db783e14ac11cd8d964d","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                        \u0027nfs_export_path\u0027: \u0027/voluuid\u0027}"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        self._driver.rpc.call \u003d mock.Mock(wraps\u003drpc_handler)"},{"line_number":224,"context_line":"        self.access \u003d fake_share.fake_access(**{\"access_type\":"},{"line_number":225,"context_line":"                                                \"non_existant_access_type\"})"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        self._driver.deny_access(self._context, self.share, self.access)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a80dd14_52819df9","line":224,"in_reply_to":"9a80dd14_77adb39a","updated":"2015-03-14 13:15:10.000000000","message":"Your thinking requires me to obfuscate this in pure intention but, alas, this is obfuscation because of sleep deprived brainery. :)\n\nDone.","commit_id":"0040a7fe91fa86db2d30d3603dd3874c0b905f67"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        self.fake_conf \u003d config.Configuration(None)"},{"line_number":42,"context_line":"        self._db \u003d mock.Mock()"},{"line_number":43,"context_line":"        self._driver \u003d quobyte.QuobyteShareDriver("},{"line_number":44,"context_line":"            self._db,"},{"line_number":45,"context_line":"            configuration\u003dself.fake_conf)"},{"line_number":46,"context_line":"        self._driver.rpc \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_ba8aab18","line":43,"updated":"2015-03-14 22:32:07.000000000","message":"This also fits:\n\nself._driver \u003d quobyte.QuobyteShareDriver(self._db,\n                                          configuration\u003dself.fake_conf)","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        self.fake_conf \u003d config.Configuration(None)"},{"line_number":42,"context_line":"        self._db \u003d mock.Mock()"},{"line_number":43,"context_line":"        self._driver \u003d quobyte.QuobyteShareDriver("},{"line_number":44,"context_line":"            self._db,"},{"line_number":45,"context_line":"            configuration\u003dself.fake_conf)"},{"line_number":46,"context_line":"        self._driver.rpc \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_90bcd6dd","line":43,"in_reply_to":"9a80dd14_ba8aab18","updated":"2015-03-16 09:09:18.000000000","message":"Done","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"b5c143ab41148a6964220ef46735a2a740171e46","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            \u0027No volume found for share fake_project_uuid/fakename\u0027)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_allow_access(self):"},{"line_number":165,"context_line":"        def rpc_handler(name, *args):"},{"line_number":166,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":167,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"},{"line_number":168,"context_line":"            elif name \u003d\u003d \u0027exportVolume\u0027:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_5aa0cf8f","line":165,"updated":"2015-03-14 22:32:07.000000000","message":"This rpc_handler method seems to have been repeated in multiple tests.  Please eliminate all such duplication by moving it to a private method in this class, or to a separate fakes.py file.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"97f68d186de518c933fb63a3504fd69bfeb28e78","unresolved":false,"context_lines":[{"line_number":162,"context_line":"            \u0027No volume found for share fake_project_uuid/fakename\u0027)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_allow_access(self):"},{"line_number":165,"context_line":"        def rpc_handler(name, *args):"},{"line_number":166,"context_line":"            if name \u003d\u003d \u0027resolveVolumeName\u0027:"},{"line_number":167,"context_line":"                return {\u0027volume_uuid\u0027: \u0027voluuid\u0027}"},{"line_number":168,"context_line":"            elif name \u003d\u003d \u0027exportVolume\u0027:"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a80dd14_9065b61f","line":165,"in_reply_to":"9a80dd14_5aa0cf8f","updated":"2015-03-16 09:09:18.000000000","message":"Moved similar methods to common def.\nDone.","commit_id":"265b102019c50fd119f3be4f888d7b3804f0e6a1"}]}
