)]}'
{"neutronclient/neutron/client.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"19721fbaba4949c8fb99176f9d1240aa0a6f85e4","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                token\u003dinstance._token,"},{"line_number":47,"context_line":"                                auth_strategy\u003dinstance._auth_strategy,"},{"line_number":48,"context_line":"                                insecure\u003dinstance._insecure,"},{"line_number":49,"context_line":"                                ca_certs\u003dinstance._ca_certs)"},{"line_number":50,"context_line":"        return client"},{"line_number":51,"context_line":"    else:"},{"line_number":52,"context_line":"        raise exceptions.UnsupportedVersion(\"API version %s is not supported\" %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyMs%3D","line":49,"updated":"2013-07-23 09:32:51.000000000","message":"ca_certs -\u003e ca_cert?","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"23b7664d085bdd0c47c13f219a3cfc83d3c24ec2","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                token\u003dinstance._token,"},{"line_number":47,"context_line":"                                auth_strategy\u003dinstance._auth_strategy,"},{"line_number":48,"context_line":"                                insecure\u003dinstance._insecure,"},{"line_number":49,"context_line":"                                ca_certs\u003dinstance._ca_certs)"},{"line_number":50,"context_line":"        return client"},{"line_number":51,"context_line":"    else:"},{"line_number":52,"context_line":"        raise exceptions.UnsupportedVersion(\"API version %s is not supported\" %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyK8%3D","line":49,"in_reply_to":"AAAAQn%2F%2FyMs%3D","updated":"2013-07-23 13:11:39.000000000","message":"Done","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"}],"neutronclient/shell.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"19721fbaba4949c8fb99176f9d1240aa0a6f85e4","unresolved":false,"context_lines":[{"line_number":525,"context_line":"            auth_strategy\u003dself.options.os_auth_strategy,"},{"line_number":526,"context_line":"            endpoint_type\u003dself.options.endpoint_type,"},{"line_number":527,"context_line":"            insecure\u003dself.options.insecure,"},{"line_number":528,"context_line":"            ca_certs\u003dself.options.os_cacert, )"},{"line_number":529,"context_line":"        return"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    def initialize_app(self, argv):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyM4%3D","line":528,"updated":"2013-07-23 09:32:51.000000000","message":"why not ca_cert?","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"23b7664d085bdd0c47c13f219a3cfc83d3c24ec2","unresolved":false,"context_lines":[{"line_number":525,"context_line":"            auth_strategy\u003dself.options.os_auth_strategy,"},{"line_number":526,"context_line":"            endpoint_type\u003dself.options.endpoint_type,"},{"line_number":527,"context_line":"            insecure\u003dself.options.insecure,"},{"line_number":528,"context_line":"            ca_certs\u003dself.options.os_cacert, )"},{"line_number":529,"context_line":"        return"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    def initialize_app(self, argv):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyK4%3D","line":528,"in_reply_to":"AAAAQn%2F%2FyM4%3D","updated":"2013-07-23 13:11:39.000000000","message":"Done","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"}],"neutronclient/v2_0/client.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"19721fbaba4949c8fb99176f9d1240aa0a6f85e4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    :param integer timeout: Allows customization of the timeout for client"},{"line_number":133,"context_line":"                            http requests. (optional)"},{"line_number":134,"context_line":"    :param bool insecure: SSL certificate validation. (optional)"},{"line_number":135,"context_line":"    :param string ca_certs: SSL CA bundle file to use. (optional)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Example::"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyMw%3D","line":135,"updated":"2013-07-23 09:32:51.000000000","message":"ca_certs -\u003e ca_cert?","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"23b7664d085bdd0c47c13f219a3cfc83d3c24ec2","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    :param integer timeout: Allows customization of the timeout for client"},{"line_number":133,"context_line":"                            http requests. (optional)"},{"line_number":134,"context_line":"    :param bool insecure: SSL certificate validation. (optional)"},{"line_number":135,"context_line":"    :param string ca_certs: SSL CA bundle file to use. (optional)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    Example::"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAQn%2F%2FyKw%3D","line":135,"in_reply_to":"AAAAQn%2F%2FyMw%3D","updated":"2013-07-23 13:11:39.000000000","message":"Done","commit_id":"04c66eb40c94b9b5b1f5fdf62b70b37318ca5262"}],"quantumclient/client.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                 password\u003dNone, auth_url\u003dNone,"},{"line_number":94,"context_line":"                 token\u003dNone, region_name\u003dNone, timeout\u003dNone,"},{"line_number":95,"context_line":"                 endpoint_url\u003dNone, insecure\u003dFalse,"},{"line_number":96,"context_line":"                 auth_strategy\u003d\u0027keystone\u0027, cacerts\u003dNone, **kwargs):"},{"line_number":97,"context_line":"        super(HTTPClient, self).__init__(timeout\u003dtimeout, ca_certs\u003dcacerts)"},{"line_number":98,"context_line":"        self.username \u003d username"},{"line_number":99,"context_line":"        self.tenant_name \u003d tenant_name"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOX%2F%2F7VM%3D","line":96,"updated":"2013-04-06 00:00:05.000000000","message":"Prefer underscore-separated naming in python code, i.e. cacerts \u003d\u003e ca_certs","commit_id":"0cbd1104348c6470a832b05fdcd3bae491d6bee6"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        utils.http_log_resp(_logger, resp, body)"},{"line_number":131,"context_line":"        status_code \u003d self.get_status_code(resp)"},{"line_number":132,"context_line":"        if status_code \u003d\u003d 400 and \"ssl\" in body:"},{"line_number":133,"context_line":"            # Validation of the server\u0027s SSL certificate has failed. This"},{"line_number":134,"context_line":"            # may be a server security issue or we just don\u0027t have required"},{"line_number":135,"context_line":"            # certificates of root CAs (certificate authorities)"},{"line_number":136,"context_line":"            raise exceptions.InvalidSslCertificate"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2BQ%3D","line":133,"updated":"2013-04-09 19:44:31.000000000","message":"Is this comment necessary, given that the exception already provides ample documentation of the condition it represents?","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        utils.http_log_resp(_logger, resp, body)"},{"line_number":131,"context_line":"        status_code \u003d self.get_status_code(resp)"},{"line_number":132,"context_line":"        if status_code \u003d\u003d 400 and \"ssl\" in body:"},{"line_number":133,"context_line":"            # Validation of the server\u0027s SSL certificate has failed. This"},{"line_number":134,"context_line":"            # may be a server security issue or we just don\u0027t have required"},{"line_number":135,"context_line":"            # certificates of root CAs (certificate authorities)"},{"line_number":136,"context_line":"            raise exceptions.InvalidSslCertificate"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9RM%3D","line":133,"in_reply_to":"AAAAOn%2F%2F9%2BQ%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"        resp, body \u003d self.request(*args, **kargs)"},{"line_number":130,"context_line":"        utils.http_log_resp(_logger, resp, body)"},{"line_number":131,"context_line":"        status_code \u003d self.get_status_code(resp)"},{"line_number":132,"context_line":"        # NOTE(rpodolyaka): httplib2 doesn\u0027t provide a way to distinguish an"},{"line_number":133,"context_line":"        # SSL error from other 400 errors (when force_exception_to_status_code"},{"line_number":134,"context_line":"        # instance variable is set to True) so we have to look at response body"},{"line_number":135,"context_line":"        if status_code \u003d\u003d 400 and \"certificate\" in body:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F6k4%3D","line":132,"updated":"2013-04-11 18:53:41.000000000","message":"I\u0027m not sure this is the best way to handle the root problem.  What do you think of overriding the request() method in this class and implementing custom conversion of exception to status?  e.g.\n\ndef request(...):\n  try:\n     super(...).request(...)\n  except Exception as e:\n    (crib from httplib\u0027s handler but add a check for SSLHandshakeError)","commit_id":"8fbaab546d1b4ad0444f3fe4b489bf89febb83ac"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"4e84ce17a2c96ca78c31a2cfc41039b79c0c67b9","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            resp, body \u003d self.request(*args, **kargs)"},{"line_number":136,"context_line":"        except httplib2.SSLHandshakeError:"},{"line_number":137,"context_line":"            raise exceptions.SslCertificateValidationError"},{"line_number":138,"context_line":"        except Exception as e:"},{"line_number":139,"context_line":"            # Wrap the low-level connection error (socket timeout, redirect"},{"line_number":140,"context_line":"            # limit, decompression error, etc) into our custom high-level"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F4Ek%3D","line":137,"updated":"2013-06-19 08:48:18.000000000","message":"Original message needs to be preserved. Ex, in case of CertificateHostnameMismatch error it contains useful info about certificate hostname","commit_id":"3f549bd8a1b8502aed7635cfb4780ccdf60ce66d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ce16302bd6391420ceb4f88a81bbe2e4617f0c7e","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            resp, body \u003d self.request(*args, **kargs)"},{"line_number":136,"context_line":"        except httplib2.SSLHandshakeError:"},{"line_number":137,"context_line":"            raise exceptions.SslCertificateValidationError"},{"line_number":138,"context_line":"        except Exception as e:"},{"line_number":139,"context_line":"            # Wrap the low-level connection error (socket timeout, redirect"},{"line_number":140,"context_line":"            # limit, decompression error, etc) into our custom high-level"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F3kc%3D","line":137,"in_reply_to":"AAAAPn%2F%2F4Ek%3D","updated":"2013-06-19 13:23:38.000000000","message":"Done","commit_id":"3f549bd8a1b8502aed7635cfb4780ccdf60ce66d"}],"quantumclient/common/exceptions.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"    pass"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class InvalidSslCertificate(QuantumClientException):"},{"line_number":164,"context_line":"    message \u003d _(\"SSL certificate validation has failed. Unable to establish a \""},{"line_number":165,"context_line":"                \"secure connection. This may be a server security issue or you\""},{"line_number":166,"context_line":"                \" just did not pass the required root CA certificates bundle\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fz1k%3D","line":163,"updated":"2013-04-22 17:04:51.000000000","message":"Python\u0027s ssl module does not distinguish between certificate validation failure and a protocol mismatch (search httplib.__init__ for SSL_ERROR_SSL).  This means that quantumclient has no way of determining that an ssl error is, in fact, due to a certificate problem, and the name of this exception and its message should reflect that.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":160,"context_line":"    pass"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class InvalidSslCertificate(QuantumClientException):"},{"line_number":164,"context_line":"    message \u003d _(\"SSL certificate validation has failed. Unable to establish a \""},{"line_number":165,"context_line":"                \"secure connection. This may be a server security issue or you\""},{"line_number":166,"context_line":"                \" just did not pass the required root CA certificates bundle\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FxEY%3D","line":163,"in_reply_to":"AAAAOn%2F%2FyqQ%3D","updated":"2013-04-24 03:05:54.000000000","message":"If you intend to fix this in a subsequent patch, please add a TODO with your name on it.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":160,"context_line":"    pass"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class InvalidSslCertificate(QuantumClientException):"},{"line_number":164,"context_line":"    message \u003d _(\"SSL certificate validation has failed. Unable to establish a \""},{"line_number":165,"context_line":"                \"secure connection. This may be a server security issue or you\""},{"line_number":166,"context_line":"                \" just did not pass the required root CA certificates bundle\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FyqQ%3D","line":163,"in_reply_to":"AAAAOn%2F%2Fz1k%3D","updated":"2013-04-23 08:42:30.000000000","message":"Agree. Will fix that in the next patch set.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"}],"quantumclient/v2_0/client.py":[{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"4e84ce17a2c96ca78c31a2cfc41039b79c0c67b9","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    :param integer timeout: Allows customization of the timeout for client"},{"line_number":132,"context_line":"                            http requests. (optional)"},{"line_number":133,"context_line":"    :param insecure: ssl certificate validation. (optional)"},{"line_number":134,"context_line":"    :param ca_certs: SSL CA bundle file to use. (optional)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    Example::"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F4EQ%3D","line":134,"updated":"2013-06-19 08:48:18.000000000","message":"parameter type is needed to be consistent with most of the params (ca_certs and insecure miss that)","commit_id":"3f549bd8a1b8502aed7635cfb4780ccdf60ce66d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"ce16302bd6391420ceb4f88a81bbe2e4617f0c7e","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    :param integer timeout: Allows customization of the timeout for client"},{"line_number":132,"context_line":"                            http requests. (optional)"},{"line_number":133,"context_line":"    :param insecure: ssl certificate validation. (optional)"},{"line_number":134,"context_line":"    :param ca_certs: SSL CA bundle file to use. (optional)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    Example::"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPn%2F%2F3kY%3D","line":134,"in_reply_to":"AAAAPn%2F%2F4EQ%3D","updated":"2013-06-19 13:23:38.000000000","message":"Done","commit_id":"3f549bd8a1b8502aed7635cfb4780ccdf60ce66d"}],"tests/unit/test_ssl.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(SslTest, self).setUp()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        #TODO(rpodolyaka): this is taken from Quantum and probably should be"},{"line_number":35,"context_line":"        #                  extracted into a base class for a test case later"},{"line_number":36,"context_line":"        TRUE_STRING \u003d [\u00271\u0027, \u0027True\u0027, \u0027true\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2Bw%3D","line":34,"updated":"2013-04-09 19:44:31.000000000","message":"Please create the base class now to ensure that subsequent test additions can use it.","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(SslTest, self).setUp()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        #TODO(rpodolyaka): this is taken from Quantum and probably should be"},{"line_number":35,"context_line":"        #                  extracted into a base class for a test case later"},{"line_number":36,"context_line":"        TRUE_STRING \u003d [\u00271\u0027, \u0027True\u0027, \u0027true\u0027]"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9P8%3D","line":34,"in_reply_to":"AAAAOn%2F%2F9%2Bw%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        #TODO(rpodolyaka): this is taken from Quantum and probably should be"},{"line_number":35,"context_line":"        #                  extracted into a base class for a test case later"},{"line_number":36,"context_line":"        TRUE_STRING \u003d [\u00271\u0027, \u0027True\u0027, \u0027true\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.useFixture(fixtures.FakeLogger("},{"line_number":39,"context_line":"            format\u003d\"%(asctime)s %(levelname)8s [%(name)s] %(message)s\"))"},{"line_number":40,"context_line":"        if os.environ.get(\u0027OS_STDOUT_NOCAPTURE\u0027) not in TRUE_STRING:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2B8%3D","line":37,"updated":"2013-04-09 19:44:31.000000000","message":"Please use the capture behavior introduced by this patch instead:\n\nhttps://review.openstack.org/#/c/26438/","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        #TODO(rpodolyaka): this is taken from Quantum and probably should be"},{"line_number":35,"context_line":"        #                  extracted into a base class for a test case later"},{"line_number":36,"context_line":"        TRUE_STRING \u003d [\u00271\u0027, \u0027True\u0027, \u0027true\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.useFixture(fixtures.FakeLogger("},{"line_number":39,"context_line":"            format\u003d\"%(asctime)s %(levelname)8s [%(name)s] %(message)s\"))"},{"line_number":40,"context_line":"        if os.environ.get(\u0027OS_STDOUT_NOCAPTURE\u0027) not in TRUE_STRING:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9P4%3D","line":37,"in_reply_to":"AAAAOn%2F%2F9%2B8%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        self.shell(\u0027subnet-list\u0027)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def test_ca_certs_not_passed(self):"},{"line_number":114,"context_line":"        httplib2.Http.__init__(timeout\u003dNone, ca_certs\u003dNone)"},{"line_number":115,"context_line":"        self.mox.ReplayAll()"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2Bk%3D","line":113,"updated":"2013-04-09 19:44:31.000000000","message":"This test evaluates a code path that is not specific to the ssl change (non-ssl tests will automatically pass ca_certs\u003dNone) - please remove.","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        self.shell(\u0027subnet-list\u0027)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def test_ca_certs_not_passed(self):"},{"line_number":114,"context_line":"        httplib2.Http.__init__(timeout\u003dNone, ca_certs\u003dNone)"},{"line_number":115,"context_line":"        self.mox.ReplayAll()"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9P0%3D","line":113,"in_reply_to":"AAAAOn%2F%2F9%2Bk%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.shell(\u0027subnet-list\u0027)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_exception_reraised_when_ssl_cert_validation_fails_debug(self):"},{"line_number":120,"context_line":"        self._stub_out_http_ssl_cert_validation_fail()"},{"line_number":121,"context_line":"        self.mox.ReplayAll()"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2BI%3D","line":119,"updated":"2013-04-09 19:44:31.000000000","message":"I would like to see this test changed to be more focused.  Ideally it would evaluate the HttpClient._cs_request method directly to ensure that the method produces the appropriate exception in response to an ssl error.  The machinery that propagates the exception through to the shell does not need to be tested here.","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.shell(\u0027subnet-list\u0027)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_exception_reraised_when_ssl_cert_validation_fails_debug(self):"},{"line_number":120,"context_line":"        self._stub_out_http_ssl_cert_validation_fail()"},{"line_number":121,"context_line":"        self.mox.ReplayAll()"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9N0%3D","line":119,"in_reply_to":"AAAAOn%2F%2F9%2BI%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"d764832dcf39c32db60be9aa3ae82a3db890f778","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self.assertRaises(exceptions.InvalidSslCertificate,"},{"line_number":124,"context_line":"                          self.shell, \u0027--debug subnet-list\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_exception_handled_when_ssl_cert_validation_fails_no_debug(self):"},{"line_number":127,"context_line":"        self._stub_out_http_ssl_cert_validation_fail()"},{"line_number":128,"context_line":"        self.mox.ReplayAll()"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9%2BE%3D","line":126,"updated":"2013-04-09 19:44:31.000000000","message":"This test evaluates global error handling unrelated to the change in question - please remove.","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        self.assertRaises(exceptions.InvalidSslCertificate,"},{"line_number":124,"context_line":"                          self.shell, \u0027--debug subnet-list\u0027)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def test_exception_handled_when_ssl_cert_validation_fails_no_debug(self):"},{"line_number":127,"context_line":"        self._stub_out_http_ssl_cert_validation_fail()"},{"line_number":128,"context_line":"        self.mox.ReplayAll()"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F9Ps%3D","line":126,"in_reply_to":"AAAAOn%2F%2F9%2BE%3D","updated":"2013-04-10 12:14:23.000000000","message":"Done","commit_id":"74d353ad6babe51e4f90ea29ed02a9dc5542d3a8"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":33,"context_line":"}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class SslTest(BaseTestCase):"},{"line_number":37,"context_line":"    def setUp(self):"},{"line_number":38,"context_line":"        super(SslTest, self).setUp()"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F6nM%3D","line":36,"updated":"2013-04-11 18:53:41.000000000","message":"Please prefer the test class naming convention of prefixing with Test (e.g. TestSsl).","commit_id":"8fbaab546d1b4ad0444f3fe4b489bf89febb83ac"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":53,"context_line":"        self.addCleanup(self.mox.VerifyAll)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def _stub_out_http(self):"},{"line_number":56,"context_line":"        self.mox.ResetAll()"},{"line_number":57,"context_line":"        self.mox.UnsetStubs()"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        self.mox.StubOutWithMock(httplib2.Http, \u0027__init__\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F6mw%3D","line":56,"updated":"2013-04-11 18:53:41.000000000","message":"I\u0027m not sure these two lines belong here (or on line 70-71), given that cleanup is already being performed (lines 50-51).  Do the tests fail to run without this pre-cleanup?","commit_id":"8fbaab546d1b4ad0444f3fe4b489bf89febb83ac"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.shell(\u0027subnet-list\u0027)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    def test_exception_is_raised_when_certificate_is_overdue(self):"},{"line_number":110,"context_line":"        self._test_ssl_cert_validation_fail_case("},{"line_number":111,"context_line":"            \u0027ssl.c:504: error:14090086:SSL routines:\u0027"},{"line_number":112,"context_line":"            \u0027SSL3_GET_SERVER_CERTIFICATE:certificate verify failed\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F6mI%3D","line":109,"updated":"2013-04-11 18:53:41.000000000","message":"Your diligence is admirable, but given that the code is only looking for \u0027certificate\u0027 in the message, and the ssl library is mocked out in these tests, would it suffice to have a single test embedding the string \u0027certificate\u0027 in the response?","commit_id":"8fbaab546d1b4ad0444f3fe4b489bf89febb83ac"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":"        ClientManager.__init__("},{"line_number":51,"context_line":"            ca_certs\u003dCA_CERTS,"},{"line_number":52,"context_line":"            # we are not really interested in other args"},{"line_number":53,"context_line":"            api_version\u003dmox.IgnoreArg(),"},{"line_number":54,"context_line":"            auth_strategy\u003dmox.IgnoreArg(),"},{"line_number":55,"context_line":"            auth_url\u003dmox.IgnoreArg(),"},{"line_number":56,"context_line":"            insecure\u003dmox.IgnoreArg(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fz1Y%3D","line":53,"updated":"2013-04-22 17:04:51.000000000","message":"Is there a way to default to ignoring args?  Having to ignore all args but one would seem unnecessary.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"c1ecf99e09836c749ec9a5147b7e8d9e9351e5bc","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        ClientManager.__init__("},{"line_number":51,"context_line":"            ca_certs\u003dCA_CERTS,"},{"line_number":52,"context_line":"            # we are not really interested in other args"},{"line_number":53,"context_line":"            api_version\u003dmox.IgnoreArg(),"},{"line_number":54,"context_line":"            auth_strategy\u003dmox.IgnoreArg(),"},{"line_number":55,"context_line":"            auth_url\u003dmox.IgnoreArg(),"},{"line_number":56,"context_line":"            insecure\u003dmox.IgnoreArg(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FyqY%3D","line":53,"in_reply_to":"AAAAOn%2F%2Fz1Y%3D","updated":"2013-04-23 08:42:30.000000000","message":"Unfortunately, mox doesn\u0027t seem to provide one :(","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":75,"context_line":"        ClientManager.__init__("},{"line_number":76,"context_line":"            ca_certs\u003dCA_CERTS,"},{"line_number":77,"context_line":"            # we are not really interested in other args"},{"line_number":78,"context_line":"            api_version\u003dmox.IgnoreArg(),"},{"line_number":79,"context_line":"            auth_strategy\u003dmox.IgnoreArg(),"},{"line_number":80,"context_line":"            auth_url\u003dmox.IgnoreArg(),"},{"line_number":81,"context_line":"            insecure\u003dmox.IgnoreArg(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fz1E%3D","line":78,"updated":"2013-04-22 17:04:51.000000000","message":"Same comment.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"unresolved":false,"context_lines":[{"line_number":96,"context_line":"        HTTPClient.__init__("},{"line_number":97,"context_line":"            ca_certs\u003dCA_CERTS,"},{"line_number":98,"context_line":"            # we are not really interested in other args"},{"line_number":99,"context_line":"            auth_strategy\u003dmox.IgnoreArg(),"},{"line_number":100,"context_line":"            auth_url\u003dmox.IgnoreArg(),"},{"line_number":101,"context_line":"            endpoint_url\u003dmox.IgnoreArg(),"},{"line_number":102,"context_line":"            insecure\u003dmox.IgnoreArg(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fz1I%3D","line":99,"updated":"2013-04-22 17:04:51.000000000","message":"Same comment.","commit_id":"c08552a11ce44c47d81c44fe8e45e488fbba0a8f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"67c58e10409d11bd31d629e4b87788d4f67e70c4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.useFixture(fixtures.EnvironmentVariable(\u0027OS_URL\u0027, END_URL))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.mox \u003d mox.Mox()"},{"line_number":43,"context_line":"        self.addCleanup(self.mox.VerifyAll)"},{"line_number":44,"context_line":"        self.addCleanup(self.mox.UnsetStubs)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_ca_certs_passed(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FvaA%3D","line":43,"updated":"2013-04-25 12:31:00.000000000","message":"I prefer to executing VerifyAll() in each tests since it is a part of tests and not a part of cleanups.\n\nIn addition, (if my understanding is correct) entries of addCleanup are called in reverse order of registration. This means UnsetStubs is called before VerifyAll. I think it is better VerifyAll is called before UnsetStubs.","commit_id":"ab11b504a515e9a9d775d0229021ab88c3c67e04"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"49070b9b4f3c57031d13c073bfb0dc92b38a338f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.useFixture(fixtures.EnvironmentVariable(\u0027OS_URL\u0027, END_URL))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.mox \u003d mox.Mox()"},{"line_number":43,"context_line":"        self.addCleanup(self.mox.VerifyAll)"},{"line_number":44,"context_line":"        self.addCleanup(self.mox.UnsetStubs)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def test_ca_certs_passed(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FvYM%3D","line":43,"in_reply_to":"AAAAOn%2F%2FvaA%3D","updated":"2013-04-25 12:46:04.000000000","message":"Thank you for pointing this out, Akihiro! Indeed, callbacks are called in reverse order or registration. Probably, you are right, it\u0027s better to have a little code duplication rather than catch such gotchas as I did...","commit_id":"ab11b504a515e9a9d775d0229021ab88c3c67e04"}]}
