)]}'
{"nova/tests/test_nexenta.py":[{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"6909148a6f5a207c3a7517c00fcd5b40c8d4c6ef","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    _CREATE_EXPORT_METHODS \u003d ["},{"line_number":113,"context_line":"        (\u0027iscsitarget\u0027, \u0027create_target\u0027, ({\u0027target_name\u0027: \u0027iqn:volume1\u0027},),"},{"line_number":114,"context_line":"            u\u0027Unable to create iscsi target\\n\u0027"},{"line_number":115,"context_line":"            u\u0027 iSCSI target iqn.1986-03.com.sun:02:nova-volume1 already\u0027"},{"line_number":116,"context_line":"                                                               u\u0027 configured\\n\u0027"},{"line_number":117,"context_line":"            u\u0027 itadm create-target failed with error 17\\n\u0027,"},{"line_number":118,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3kk%3D","line":115,"updated":"2012-02-22 18:45:35.000000000","message":"I very much doubt Nexenta internationalizes its error messages, but has this been confirmed?","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    _CREATE_EXPORT_METHODS \u003d ["},{"line_number":113,"context_line":"        (\u0027iscsitarget\u0027, \u0027create_target\u0027, ({\u0027target_name\u0027: \u0027iqn:volume1\u0027},),"},{"line_number":114,"context_line":"            u\u0027Unable to create iscsi target\\n\u0027"},{"line_number":115,"context_line":"            u\u0027 iSCSI target iqn.1986-03.com.sun:02:nova-volume1 already\u0027"},{"line_number":116,"context_line":"                                                               u\u0027 configured\\n\u0027"},{"line_number":117,"context_line":"            u\u0027 itadm create-target failed with error 17\\n\u0027,"},{"line_number":118,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3jY%3D","line":115,"in_reply_to":"AAAAEn%2F%2F3kk%3D","updated":"2012-02-22 19:20:12.000000000","message":"That time we got a reply that error text matching is the best way to distinguish errors (and the only one). So error text should not change over time.","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"}],"nova/volume/nexenta/NZA.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"11205bd7edda13a458e74c54a054a6bac644cb73","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import time"},{"line_number":26,"context_line":"import os"},{"line_number":27,"context_line":"import re"},{"line_number":28,"context_line":"import dbus"},{"line_number":29,"context_line":"import socket"},{"line_number":30,"context_line":"import sys"},{"line_number":31,"context_line":"import threading"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAEn%2F%2F6UQ%3D","line":28,"updated":"2012-02-15 19:33:45.000000000","message":"dbus isn\u0027t automatically added to the testing virtual env, so unit tests fail  on clean env","commit_id":"af58419266d8aa583d3327b6e6c49ca48d480fd6"}],"nova/volume/nexenta/jsonrpc.py":[{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"56bf3801eca67b7bb4d9e337fe70655b2752aafd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        auth \u003d (\u0027%s:%s\u0027 % (self.user, self.password)).encode(\u0027base64\u0027)[:-1]"},{"line_number":62,"context_line":"        headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":63,"context_line":"                   \u0027Authorization\u0027: \u0027Basic %s\u0027 % (auth,)}"},{"line_number":64,"context_line":"        LOG.debug(\u0027Sending JSON data: %s\u0027 % (data,))"},{"line_number":65,"context_line":"        request \u003d urllib2.Request(self.url, data, headers)"},{"line_number":66,"context_line":"        response_obj \u003d urllib2.urlopen(request)"},{"line_number":67,"context_line":"        if response_obj.info().status \u003d\u003d \u0027EOF in headers\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3k0%3D","line":64,"updated":"2012-02-22 18:43:25.000000000","message":"i18n","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        auth \u003d (\u0027%s:%s\u0027 % (self.user, self.password)).encode(\u0027base64\u0027)[:-1]"},{"line_number":62,"context_line":"        headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":63,"context_line":"                   \u0027Authorization\u0027: \u0027Basic %s\u0027 % (auth,)}"},{"line_number":64,"context_line":"        LOG.debug(\u0027Sending JSON data: %s\u0027 % (data,))"},{"line_number":65,"context_line":"        request \u003d urllib2.Request(self.url, data, headers)"},{"line_number":66,"context_line":"        response_obj \u003d urllib2.urlopen(request)"},{"line_number":67,"context_line":"        if response_obj.info().status \u003d\u003d \u0027EOF in headers\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3jU%3D","line":64,"in_reply_to":"AAAAEn%2F%2F3k0%3D","updated":"2012-02-22 19:20:12.000000000","message":"Done","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"56bf3801eca67b7bb4d9e337fe70655b2752aafd","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                response_obj \u003d urllib2.urlopen(request)"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                LOG.error(\u0027No headers in server response\u0027)"},{"line_number":76,"context_line":"                raise NexentaJSONException(\u0027Bad response from server\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        response_data \u003d response_obj.read()"},{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3lA%3D","line":76,"updated":"2012-02-22 18:43:25.000000000","message":"i18n","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                response_obj \u003d urllib2.urlopen(request)"},{"line_number":74,"context_line":"            else:"},{"line_number":75,"context_line":"                LOG.error(\u0027No headers in server response\u0027)"},{"line_number":76,"context_line":"                raise NexentaJSONException(\u0027Bad response from server\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        response_data \u003d response_obj.read()"},{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3jQ%3D","line":76,"in_reply_to":"AAAAEn%2F%2F3lA%3D","updated":"2012-02-22 19:20:12.000000000","message":"Done","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"56bf3801eca67b7bb4d9e337fe70655b2752aafd","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                raise NexentaJSONException(\u0027Bad response from server\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        response_data \u003d response_obj.read()"},{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3k8%3D","line":79,"updated":"2012-02-22 18:43:25.000000000","message":"i18n","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                raise NexentaJSONException(\u0027Bad response from server\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        response_data \u003d response_obj.read()"},{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3jM%3D","line":79,"in_reply_to":"AAAAEn%2F%2F3k8%3D","updated":"2012-02-22 19:20:12.000000000","message":"Done","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"56bf3801eca67b7bb4d9e337fe70655b2752aafd","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return response.get(\u0027result\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3k4%3D","line":82,"updated":"2012-02-22 18:43:25.000000000","message":"I suppose this one can\u0027t be i18n... unless you have a good idea what the errors might be. Perhaps return an i18n message such as _(\"Remote server returned the following error: %(error)s\" % { \u0027error\u0027: response.... }) ?","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        LOG.debug(\u0027Got response: %s\u0027 % (response_data,))"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return response.get(\u0027result\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3i8%3D","line":82,"in_reply_to":"AAAAEn%2F%2F3k4%3D","updated":"2012-02-22 19:20:12.000000000","message":"It\u0027s hard (almost impossible) to predict all errors that we can get here. Hiding the error deeper is bad for driver since it matches error string to filter expected errors.","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"b9f2bda5c54caca42e7fbd5542b096a5dfa64e34","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                           \u0027params\u0027: args})"},{"line_number":61,"context_line":"        auth \u003d (\u0027%s:%s\u0027 % (self.user, self.password)).encode(\u0027base64\u0027)[:-1]"},{"line_number":62,"context_line":"        headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":63,"context_line":"                   \u0027Authorization\u0027: \u0027Basic %s\u0027 % (auth,)}"},{"line_number":64,"context_line":"        LOG.debug(_(\u0027Sending JSON data: %s\u0027), data)"},{"line_number":65,"context_line":"        request \u003d urllib2.Request(self.url, data, headers)"},{"line_number":66,"context_line":"        response_obj \u003d urllib2.urlopen(request)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAEn%2F%2F3i0%3D","line":63,"updated":"2012-02-22 19:08:31.000000000","message":"spurious comma","commit_id":"c4da46a6b0c68f94d25e8f18503f2a659156358b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cad7dd358d56ed9b2e53b2b63419e6545a2806a2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                           \u0027params\u0027: args})"},{"line_number":61,"context_line":"        auth \u003d (\u0027%s:%s\u0027 % (self.user, self.password)).encode(\u0027base64\u0027)[:-1]"},{"line_number":62,"context_line":"        headers \u003d {\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":63,"context_line":"                   \u0027Authorization\u0027: \u0027Basic %s\u0027 % (auth,)}"},{"line_number":64,"context_line":"        LOG.debug(_(\u0027Sending JSON data: %s\u0027), data)"},{"line_number":65,"context_line":"        request \u003d urllib2.Request(self.url, data, headers)"},{"line_number":66,"context_line":"        response_obj \u003d urllib2.urlopen(request)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAEn%2F%2F3iI%3D","line":63,"in_reply_to":"AAAAEn%2F%2F3i0%3D","updated":"2012-02-22 19:14:41.000000000","message":"I prefer to explicitly put format parameters into a tuple (and one-element tuple needs a comma before the closing parenthesis) to prevent hard-to-find errors when this element somehow becomes a tuple and % unpacks it.","commit_id":"c4da46a6b0c68f94d25e8f18503f2a659156358b"},{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"b9f2bda5c54caca42e7fbd5542b096a5dfa64e34","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        LOG.debug(_(\u0027Got response: %s\u0027), response_data)"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return response.get(\u0027result\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAEn%2F%2F3ik%3D","line":82,"updated":"2012-02-22 19:08:31.000000000","message":"Is it not possible to add an internationalized header to this error?","commit_id":"c4da46a6b0c68f94d25e8f18503f2a659156358b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"01cef5a0542bdb5566b8178ab3eb1174e34b65c1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        LOG.debug(_(\u0027Got response: %s\u0027), response_data)"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return response.get(\u0027result\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAEn%2F%2F3gg%3D","line":82,"in_reply_to":"AAAAEn%2F%2F3ik%3D","updated":"2012-02-22 19:29:24.000000000","message":"Done","commit_id":"c4da46a6b0c68f94d25e8f18503f2a659156358b"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"cad7dd358d56ed9b2e53b2b63419e6545a2806a2","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        LOG.debug(_(\u0027Got response: %s\u0027), response_data)"},{"line_number":80,"context_line":"        response \u003d json.loads(response_data)"},{"line_number":81,"context_line":"        if response.get(\u0027error\u0027) is not None:"},{"line_number":82,"context_line":"            raise NexentaJSONException(response[\u0027error\u0027].get(\u0027message\u0027, \u0027\u0027))"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return response.get(\u0027result\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAEn%2F%2F3h8%3D","line":82,"in_reply_to":"AAAAEn%2F%2F3ik%3D","updated":"2012-02-22 19:14:41.000000000","message":"Maybe we can. Looking into it.","commit_id":"c4da46a6b0c68f94d25e8f18503f2a659156358b"}],"nova/volume/nexenta/volume.py":[{"author":{"_account_id":159,"name":"Eric Windisch","email":"ewindisch@docker.com","username":"ewindisch"},"change_message_id":"56bf3801eca67b7bb4d9e337fe70655b2752aafd","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        :raise: :py:exc:`LookupError`"},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        if not self.nms.volume.object_exists(FLAGS.nexenta_volume):"},{"line_number":96,"context_line":"            raise LookupError(\"Volume %s does not exist in Nexenta SA\" %"},{"line_number":97,"context_line":"                                (FLAGS.nexenta_volume,))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3ls%3D","line":96,"updated":"2012-02-22 18:43:25.000000000","message":"Exceptions should also be _() wrapped for i18n.","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"},{"author":{"_account_id":708,"name":"Yuriy Taraday","email":"yuriy@taraday.nl","username":"yorik-sar"},"change_message_id":"a8fdebd45e561cec2d2febdd82cb4b73bf832dc6","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        :raise: :py:exc:`LookupError`"},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        if not self.nms.volume.object_exists(FLAGS.nexenta_volume):"},{"line_number":96,"context_line":"            raise LookupError(\"Volume %s does not exist in Nexenta SA\" %"},{"line_number":97,"context_line":"                                (FLAGS.nexenta_volume,))"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAEn%2F%2F3i4%3D","line":96,"in_reply_to":"AAAAEn%2F%2F3ls%3D","updated":"2012-02-22 19:20:12.000000000","message":"Done","commit_id":"654a5132a0397c20799b49cbb3d9f36229f25e9a"}]}
