)]}'
{"neutron/plugins/nicira/NeutronPlugin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d78233f00c37caffc9a340b31f73711eb5fc63f6","unresolved":false,"context_lines":[{"line_number":1508,"context_line":"        except nvp_exc.NvpInvalidVersion:"},{"line_number":1509,"context_line":"            msg \u003d _(\"Request cannot contain \u0027routes\u0027 with the NVP \""},{"line_number":1510,"context_line":"                    \"platform currently in execution. Please, try \""},{"line_number":1511,"context_line":"                    \"without specifying the static routes.\")"},{"line_number":1512,"context_line":"            LOG.exception(msg)"},{"line_number":1513,"context_line":"            raise q_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg)"},{"line_number":1514,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2Fq78%3D","line":1511,"updated":"2013-07-14 11:43:58.000000000","message":"I would rather fail before even reaching the plugin and avoiding throwing such an error.\n\nWe might address this in a subsquent patch, allowing to enable/desble API extensions according to backend version.","commit_id":"ff7bb5f77a059ec58a2afcc472cc51818d81a5ba"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":1508,"context_line":"        except nvp_exc.NvpInvalidVersion:"},{"line_number":1509,"context_line":"            msg \u003d _(\"Request cannot contain \u0027routes\u0027 with the NVP \""},{"line_number":1510,"context_line":"                    \"platform currently in execution. Please, try \""},{"line_number":1511,"context_line":"                    \"without specifying the static routes.\")"},{"line_number":1512,"context_line":"            LOG.exception(msg)"},{"line_number":1513,"context_line":"            raise q_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg)"},{"line_number":1514,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAP3%2F%2Fq0Q%3D","line":1511,"in_reply_to":"AAAAP3%2F%2Fq78%3D","updated":"2013-07-14 16:29:02.000000000","message":"What I don\u0027t like about disabling the extension upfront is that we\u0027d need to bump quantum (i.e. restart it) if the nvp backend is upgraded. We could explore ways to avoid that but then this patch will explode in size. What do you think? I guess the other approach is to check for the version at the time of the update and before getting to the end of the method, but from the end-user standpoint the failure-mode is the same.","commit_id":"ff7bb5f77a059ec58a2afcc472cc51818d81a5ba"}],"quantum/plugins/nicira/NvpApiClient.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.request(\u0027GET\u0027, \u0027/ws.v1/control-cluster/node\u0027)"},{"line_number":172,"context_line":"            if not self._nvp_version:"},{"line_number":173,"context_line":"                LOG.error(\u0027Unable to determine NVP version. \u0027"},{"line_number":174,"context_line":"                          \u0027Behavior may be undeterministic.\u0027)"},{"line_number":175,"context_line":"        return self._nvp_version"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def fourZeroFour(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWn4%3D","line":174,"updated":"2013-07-03 13:51:08.000000000","message":"you need i18n wrap for this statement.\nAlso \u0027undeterministic\u0027? I don\u0027t think we\u0027ll have a case of non-determinism here. Perhaps \u0027NVP API connection might now work properly\u0027 is a bit more apt.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.request(\u0027GET\u0027, \u0027/ws.v1/control-cluster/node\u0027)"},{"line_number":172,"context_line":"            if not self._nvp_version:"},{"line_number":173,"context_line":"                LOG.error(\u0027Unable to determine NVP version. \u0027"},{"line_number":174,"context_line":"                          \u0027Behavior may be undeterministic.\u0027)"},{"line_number":175,"context_line":"        return self._nvp_version"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def fourZeroFour(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQZE%3D","line":174,"in_reply_to":"AAAAPn%2F%2FWdo%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            self.request(\u0027GET\u0027, \u0027/ws.v1/control-cluster/node\u0027)"},{"line_number":172,"context_line":"            if not self._nvp_version:"},{"line_number":173,"context_line":"                LOG.error(\u0027Unable to determine NVP version. \u0027"},{"line_number":174,"context_line":"                          \u0027Behavior may be undeterministic.\u0027)"},{"line_number":175,"context_line":"        return self._nvp_version"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def fourZeroFour(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWdo%3D","line":174,"in_reply_to":"AAAAPn%2F%2FWn4%3D","updated":"2013-07-03 14:46:32.000000000","message":"shoot, I forgot. Thank.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"}],"quantum/plugins/nicira/QuantumPlugin.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":1458,"context_line":"                self._update_router_gw_info(context, router_db[\u0027id\u0027], gw_info)"},{"line_number":1459,"context_line":"        return self._make_router_dict(router_db)"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def update_router(self, context, router_id, router):"},{"line_number":1462,"context_line":"        # Either nexthop is updated or should be kept as it was before"},{"line_number":1463,"context_line":"        r \u003d router[\u0027router\u0027]"},{"line_number":1464,"context_line":"        nexthop \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWpo%3D","line":1461,"updated":"2013-07-03 13:51:08.000000000","message":"Ah!\nI knew you would have changed this :)","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":1458,"context_line":"                self._update_router_gw_info(context, router_db[\u0027id\u0027], gw_info)"},{"line_number":1459,"context_line":"        return self._make_router_dict(router_db)"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def update_router(self, context, router_id, router):"},{"line_number":1462,"context_line":"        # Either nexthop is updated or should be kept as it was before"},{"line_number":1463,"context_line":"        r \u003d router[\u0027router\u0027]"},{"line_number":1464,"context_line":"        nexthop \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWdg%3D","line":1461,"in_reply_to":"AAAAPn%2F%2FWpo%3D","updated":"2013-07-03 14:46:32.000000000","message":"I knew that you knew","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"                    ext_subnet \u003d ext_net.subnets[0]"},{"line_number":1480,"context_line":"                    nexthop \u003d ext_subnet.gateway_ip"},{"line_number":1481,"context_line":"        try:"},{"line_number":1482,"context_line":"            existing_routes \u003d nvplib.update_lrouter("},{"line_number":1483,"context_line":"                self.cluster, router_id, r.get(\u0027name\u0027),"},{"line_number":1484,"context_line":"                nexthop, routes\u003dr.get(\u0027routes\u0027))"},{"line_number":1485,"context_line":"        # NOTE(salv-orlando): The exception handling below is not correct, but"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWpg%3D","line":1482,"updated":"2013-07-03 13:51:08.000000000","message":"nit: at this stage these are \u0027previous_routes\u0027","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"                    ext_subnet \u003d ext_net.subnets[0]"},{"line_number":1480,"context_line":"                    nexthop \u003d ext_subnet.gateway_ip"},{"line_number":1481,"context_line":"        try:"},{"line_number":1482,"context_line":"            existing_routes \u003d nvplib.update_lrouter("},{"line_number":1483,"context_line":"                self.cluster, router_id, r.get(\u0027name\u0027),"},{"line_number":1484,"context_line":"                nexthop, routes\u003dr.get(\u0027routes\u0027))"},{"line_number":1485,"context_line":"        # NOTE(salv-orlando): The exception handling below is not correct, but"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQZA%3D","line":1482,"in_reply_to":"AAAAPn%2F%2FWdY%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"                    ext_subnet \u003d ext_net.subnets[0]"},{"line_number":1480,"context_line":"                    nexthop \u003d ext_subnet.gateway_ip"},{"line_number":1481,"context_line":"        try:"},{"line_number":1482,"context_line":"            existing_routes \u003d nvplib.update_lrouter("},{"line_number":1483,"context_line":"                self.cluster, router_id, r.get(\u0027name\u0027),"},{"line_number":1484,"context_line":"                nexthop, routes\u003dr.get(\u0027routes\u0027))"},{"line_number":1485,"context_line":"        # NOTE(salv-orlando): The exception handling below is not correct, but"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWdY%3D","line":1482,"in_reply_to":"AAAAPn%2F%2FWpg%3D","updated":"2013-07-03 14:46:32.000000000","message":"these are the routes that exist in NVP, but I can change the name if you like.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"                extraroute.RoutesExhausted) as e:"},{"line_number":1505,"context_line":"            # revert changes made to NVP"},{"line_number":1506,"context_line":"            nvplib.update_explicit_routes_lrouter("},{"line_number":1507,"context_line":"                self.cluster, router_id, existing_routes)"},{"line_number":1508,"context_line":"        raise e"},{"line_number":1509,"context_line":""},{"line_number":1510,"context_line":"    def delete_router(self, context, id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWpI%3D","line":1507,"updated":"2013-07-03 13:51:08.000000000","message":"consider excutils.save_and_reraise","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"                extraroute.RoutesExhausted) as e:"},{"line_number":1505,"context_line":"            # revert changes made to NVP"},{"line_number":1506,"context_line":"            nvplib.update_explicit_routes_lrouter("},{"line_number":1507,"context_line":"                self.cluster, router_id, existing_routes)"},{"line_number":1508,"context_line":"        raise e"},{"line_number":1509,"context_line":""},{"line_number":1510,"context_line":"    def delete_router(self, context, id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQY8%3D","line":1507,"in_reply_to":"AAAAPn%2F%2FWdU%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"                extraroute.RoutesExhausted) as e:"},{"line_number":1505,"context_line":"            # revert changes made to NVP"},{"line_number":1506,"context_line":"            nvplib.update_explicit_routes_lrouter("},{"line_number":1507,"context_line":"                self.cluster, router_id, existing_routes)"},{"line_number":1508,"context_line":"        raise e"},{"line_number":1509,"context_line":""},{"line_number":1510,"context_line":"    def delete_router(self, context, id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWdU%3D","line":1507,"in_reply_to":"AAAAPn%2F%2FWpI%3D","updated":"2013-07-03 14:46:32.000000000","message":"can do","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"}],"quantum/plugins/nicira/api_client/request.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            # which puts the conn on the back of the client\u0027s priority"},{"line_number":192,"context_line":"            # queue."},{"line_number":193,"context_line":"            if (response.status \u003d\u003d httplib.INTERNAL_SERVER_ERROR and"},{"line_number":194,"context_line":"                response.status \u003e httplib.NOT_IMPLEMENTED):"},{"line_number":195,"context_line":"                LOG.warn(_(\"[%(rid)d] Request \u0027%(method)s %(url)s\u0027 \""},{"line_number":196,"context_line":"                           \"received: %(status)s\"),"},{"line_number":197,"context_line":"                         {\u0027rid\u0027: self._rid(), \u0027method\u0027: self._method,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWnc%3D","line":194,"updated":"2013-07-03 13:51:08.000000000","message":"help me here.\nIf is this checking that status \u003d\u003d 500 and status \u003e 501?","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            # which puts the conn on the back of the client\u0027s priority"},{"line_number":192,"context_line":"            # queue."},{"line_number":193,"context_line":"            if (response.status \u003d\u003d httplib.INTERNAL_SERVER_ERROR and"},{"line_number":194,"context_line":"                response.status \u003e httplib.NOT_IMPLEMENTED):"},{"line_number":195,"context_line":"                LOG.warn(_(\"[%(rid)d] Request \u0027%(method)s %(url)s\u0027 \""},{"line_number":196,"context_line":"                           \"received: %(status)s\"),"},{"line_number":197,"context_line":"                         {\u0027rid\u0027: self._rid(), \u0027method\u0027: self._method,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWdI%3D","line":194,"in_reply_to":"AAAAPn%2F%2FWnc%3D","updated":"2013-07-03 14:46:32.000000000","message":"correct. Instead of complaining for 500, 501, 502, ...I am complaining for all of them \u003e500 except 501.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"}],"quantum/plugins/nicira/nvplib.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"LROUTERNAT_RESOURCE \u003d \"nat/lrouter\""},{"line_number":53,"context_line":"LQUEUE_RESOURCE \u003d \"lqueue\""},{"line_number":54,"context_line":"GWSERVICE_RESOURCE \u003d \"gateway-service\""},{"line_number":55,"context_line":"# Current quantum version"},{"line_number":56,"context_line":"QUANTUM_VERSION \u003d \"2013.1\""},{"line_number":57,"context_line":"# Other constants for NVP resource"},{"line_number":58,"context_line":"MAX_DISPLAY_NAME_LEN \u003d 40"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FW0w%3D","line":55,"updated":"2013-07-03 13:51:08.000000000","message":"thanks for putting back this wild comment in the right place.\nI told it a lot of times to sit there and don\u0027t move, but it won\u0027t listen.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":52,"context_line":"LROUTERNAT_RESOURCE \u003d \"nat/lrouter\""},{"line_number":53,"context_line":"LQUEUE_RESOURCE \u003d \"lqueue\""},{"line_number":54,"context_line":"GWSERVICE_RESOURCE \u003d \"gateway-service\""},{"line_number":55,"context_line":"# Current quantum version"},{"line_number":56,"context_line":"QUANTUM_VERSION \u003d \"2013.1\""},{"line_number":57,"context_line":"# Other constants for NVP resource"},{"line_number":58,"context_line":"MAX_DISPLAY_NAME_LEN \u003d 40"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWc8%3D","line":55,"in_reply_to":"AAAAPn%2F%2FW0w%3D","updated":"2013-07-03 14:46:32.000000000","message":"naughty comment, we might even remove it to be honest.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             cluster.api_client.get_nvp_version())"},{"line_number":86,"context_line":"        if v:"},{"line_number":87,"context_line":"            func \u003d (NVPLIB_FUNC_DICT[func_name][v.major].get(v.minor) or"},{"line_number":88,"context_line":"                    NVPLIB_FUNC_DICT[func_name][v.major][\u0027default\u0027])"},{"line_number":89,"context_line":"            if func is None:"},{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWrc%3D","line":88,"updated":"2013-07-03 13:51:08.000000000","message":"why don\u0027t we use collections.defaultdict?","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             cluster.api_client.get_nvp_version())"},{"line_number":86,"context_line":"        if v:"},{"line_number":87,"context_line":"            func \u003d (NVPLIB_FUNC_DICT[func_name][v.major].get(v.minor) or"},{"line_number":88,"context_line":"                    NVPLIB_FUNC_DICT[func_name][v.major][\u0027default\u0027])"},{"line_number":89,"context_line":"            if func is None:"},{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQY4%3D","line":88,"in_reply_to":"AAAAPn%2F%2FWc4%3D","updated":"2013-07-05 22:22:30.000000000","message":"I tried using defaultdict, but it wasn\u0027t making the definition or the use of the dict any simpler :(","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             cluster.api_client.get_nvp_version())"},{"line_number":86,"context_line":"        if v:"},{"line_number":87,"context_line":"            func \u003d (NVPLIB_FUNC_DICT[func_name][v.major].get(v.minor) or"},{"line_number":88,"context_line":"                    NVPLIB_FUNC_DICT[func_name][v.major][\u0027default\u0027])"},{"line_number":89,"context_line":"            if func is None:"},{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWc4%3D","line":88,"in_reply_to":"AAAAPn%2F%2FWrc%3D","updated":"2013-07-03 14:46:32.000000000","message":"can do","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"},{"line_number":92,"context_line":"                                            \u0027%(func)s.\u0027) % {\u0027ver\u0027: v,"},{"line_number":93,"context_line":"                                                            \u0027fun\u0027: func_name})"},{"line_number":94,"context_line":"        else:"},{"line_number":95,"context_line":"            raise NvpApiClient.ServiceUnavailable(\u0027NVP version is not set. \u0027"},{"line_number":96,"context_line":"                                                  \u0027Unable to complete request\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWp0%3D","line":93,"updated":"2013-07-03 13:51:08.000000000","message":"This, together with another patch you pushed, might end up surfacing impl details (NVP version) to teants.\n\nWhich are the current cases in which this exception will be raised? Or is this for future developments?\n\nIn both cases I would consider raising an exception which is logged, but then surfaced as a generic error to the API clients.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"},{"line_number":92,"context_line":"                                            \u0027%(func)s.\u0027) % {\u0027ver\u0027: v,"},{"line_number":93,"context_line":"                                                            \u0027fun\u0027: func_name})"},{"line_number":94,"context_line":"        else:"},{"line_number":95,"context_line":"            raise NvpApiClient.ServiceUnavailable(\u0027NVP version is not set. \u0027"},{"line_number":96,"context_line":"                                                  \u0027Unable to complete request\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQY0%3D","line":93,"in_reply_to":"AAAAPn%2F%2FWco%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                raise NotImplementedError(_(\u0027NVP version %(ver)s \u0027"},{"line_number":91,"context_line":"                                            \u0027does not support method \u0027"},{"line_number":92,"context_line":"                                            \u0027%(func)s.\u0027) % {\u0027ver\u0027: v,"},{"line_number":93,"context_line":"                                                            \u0027fun\u0027: func_name})"},{"line_number":94,"context_line":"        else:"},{"line_number":95,"context_line":"            raise NvpApiClient.ServiceUnavailable(\u0027NVP version is not set. \u0027"},{"line_number":96,"context_line":"                                                  \u0027Unable to complete request\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWco%3D","line":93,"in_reply_to":"AAAAPn%2F%2FWp0%3D","updated":"2013-07-03 14:46:32.000000000","message":"um, you may be right. I thought that exposing the version was okay, but on second thought it would be good to abstract it. I made the same assumption below (see update_lrouter). I\u0027ll fix it.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":341,"context_line":"def create_explicit_routing_lrouter(cluster, tenant_id,"},{"line_number":342,"context_line":"                                    display_name, nexthop):"},{"line_number":343,"context_line":"    lrouter_obj \u003d _prepare_lrouter_body("},{"line_number":344,"context_line":"        display_name, tenant_id, \"RoutingTableRoutingConfig\")"},{"line_number":345,"context_line":"    return do_request(HTTP_POST, _build_uri_path(LROUTER_RESOURCE),"},{"line_number":346,"context_line":"                      json.dumps(lrouter_obj), cluster\u003dcluster)"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWrw%3D","line":344,"updated":"2013-07-03 13:51:08.000000000","message":"With this new configuration object, would it be possible to provide a default next hop?\nIf not, should we add a default route to the gateway ip address (ie: the ip gateway of the external network for this router)","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":341,"context_line":"def create_explicit_routing_lrouter(cluster, tenant_id,"},{"line_number":342,"context_line":"                                    display_name, nexthop):"},{"line_number":343,"context_line":"    lrouter_obj \u003d _prepare_lrouter_body("},{"line_number":344,"context_line":"        display_name, tenant_id, \"RoutingTableRoutingConfig\")"},{"line_number":345,"context_line":"    return do_request(HTTP_POST, _build_uri_path(LROUTER_RESOURCE),"},{"line_number":346,"context_line":"                      json.dumps(lrouter_obj), cluster\u003dcluster)"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWck%3D","line":344,"in_reply_to":"AAAAPn%2F%2FWrw%3D","updated":"2013-07-03 14:46:32.000000000","message":"Not on the same request. I have checked with the NVP folks.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"def delete_explicit_route_lrouter(cluster, router_id, route_id):"},{"line_number":454,"context_line":"    resource_id \u003d \u0027%s/%s/%s\u0027 % (router_id, \u0027rib\u0027, route_id)"},{"line_number":455,"context_line":"    do_request(HTTP_DELETE,"},{"line_number":456,"context_line":"               _build_uri_path(LROUTER_RESOURCE,"},{"line_number":457,"context_line":"                               resource_id\u003dresource_id),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWz4%3D","line":454,"updated":"2013-07-03 13:51:08.000000000","message":"have yout tried using _build_uri_path with router_id passed as parent_resource_id?\n\nYou might need to add some constants for \u0027rib\u0027 resources","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"def delete_explicit_route_lrouter(cluster, router_id, route_id):"},{"line_number":454,"context_line":"    resource_id \u003d \u0027%s/%s/%s\u0027 % (router_id, \u0027rib\u0027, route_id)"},{"line_number":455,"context_line":"    do_request(HTTP_DELETE,"},{"line_number":456,"context_line":"               _build_uri_path(LROUTER_RESOURCE,"},{"line_number":457,"context_line":"                               resource_id\u003dresource_id),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQYw%3D","line":454,"in_reply_to":"AAAAPn%2F%2FWcU%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":451,"context_line":""},{"line_number":452,"context_line":""},{"line_number":453,"context_line":"def delete_explicit_route_lrouter(cluster, router_id, route_id):"},{"line_number":454,"context_line":"    resource_id \u003d \u0027%s/%s/%s\u0027 % (router_id, \u0027rib\u0027, route_id)"},{"line_number":455,"context_line":"    do_request(HTTP_DELETE,"},{"line_number":456,"context_line":"               _build_uri_path(LROUTER_RESOURCE,"},{"line_number":457,"context_line":"                               resource_id\u003dresource_id),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWcU%3D","line":454,"in_reply_to":"AAAAPn%2F%2FWz4%3D","updated":"2013-07-03 14:46:32.000000000","message":"I tried that I sparked more confusion in my mind than anything else. I\u0027ll retry.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":465,"context_line":"    uuid \u003d do_request("},{"line_number":466,"context_line":"        HTTP_POST,"},{"line_number":467,"context_line":"        _build_uri_path(LROUTER_RESOURCE,"},{"line_number":468,"context_line":"                        resource_id\u003dresource_id),"},{"line_number":469,"context_line":"        json.dumps({"},{"line_number":470,"context_line":"            \"action\": \"accept\","},{"line_number":471,"context_line":"            \"next_hop_ip\": next_hop_ip,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWzs%3D","line":468,"updated":"2013-07-03 13:51:08.000000000","message":"same question about build_uri_path.\nNo need to address this in this patch, it\u0027s just a curiosity.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":465,"context_line":"    uuid \u003d do_request("},{"line_number":466,"context_line":"        HTTP_POST,"},{"line_number":467,"context_line":"        _build_uri_path(LROUTER_RESOURCE,"},{"line_number":468,"context_line":"                        resource_id\u003dresource_id),"},{"line_number":469,"context_line":"        json.dumps({"},{"line_number":470,"context_line":"            \"action\": \"accept\","},{"line_number":471,"context_line":"            \"next_hop_ip\": next_hop_ip,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQYs%3D","line":468,"in_reply_to":"AAAAPn%2F%2FWcM%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":465,"context_line":"    uuid \u003d do_request("},{"line_number":466,"context_line":"        HTTP_POST,"},{"line_number":467,"context_line":"        _build_uri_path(LROUTER_RESOURCE,"},{"line_number":468,"context_line":"                        resource_id\u003dresource_id),"},{"line_number":469,"context_line":"        json.dumps({"},{"line_number":470,"context_line":"            \"action\": \"accept\","},{"line_number":471,"context_line":"            \"next_hop_ip\": next_hop_ip,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWcM%3D","line":468,"in_reply_to":"AAAAPn%2F%2FWzs%3D","updated":"2013-07-03 14:46:32.000000000","message":"I know..sorry it wasn\u0027t obvious to me how to get the right resource passed on","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":491,"context_line":"            deleted_routes.append(route)"},{"line_number":492,"context_line":"        for route in routes:"},{"line_number":493,"context_line":"            uuid \u003d create_explicit_route_lrouter(cluster, router_id, route)"},{"line_number":494,"context_line":"            added_routes.append(uuid)"},{"line_number":495,"context_line":"    except NvpApiClient.NvpApiException:"},{"line_number":496,"context_line":"        LOG.exception(_(\u0027Cannot update NVP routes %(routes)s for\u0027"},{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWzA%3D","line":494,"updated":"2013-07-03 13:51:08.000000000","message":"I\u0027m sure you considered an approach where we first look at what routes have changed, and then remove only the ones which were altered/removed, and add only the ones which were altered/removed.\n\nBeyond being more complex what would be the other reason against this approach?\nI\u0027m fine with this code, but updates on lrouters can become cumbersome if there are many static routes.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"918be5cb63aedf08cd02e019415e95d1e1dc4ba1","unresolved":false,"context_lines":[{"line_number":491,"context_line":"            deleted_routes.append(route)"},{"line_number":492,"context_line":"        for route in routes:"},{"line_number":493,"context_line":"            uuid \u003d create_explicit_route_lrouter(cluster, router_id, route)"},{"line_number":494,"context_line":"            added_routes.append(uuid)"},{"line_number":495,"context_line":"    except NvpApiClient.NvpApiException:"},{"line_number":496,"context_line":"        LOG.exception(_(\u0027Cannot update NVP routes %(routes)s for\u0027"},{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWAA%3D","line":494,"in_reply_to":"AAAAPn%2F%2FWbA%3D","updated":"2013-07-03 17:04:33.000000000","message":"k, leave it as it then.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":491,"context_line":"            deleted_routes.append(route)"},{"line_number":492,"context_line":"        for route in routes:"},{"line_number":493,"context_line":"            uuid \u003d create_explicit_route_lrouter(cluster, router_id, route)"},{"line_number":494,"context_line":"            added_routes.append(uuid)"},{"line_number":495,"context_line":"    except NvpApiClient.NvpApiException:"},{"line_number":496,"context_line":"        LOG.exception(_(\u0027Cannot update NVP routes %(routes)s for\u0027"},{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWbA%3D","line":494,"in_reply_to":"AAAAPn%2F%2FWzA%3D","updated":"2013-07-03 14:46:32.000000000","message":"Yes, I did consider it, and I can simplify the complexity of the algorithm to the expense of the implementation logic (because to determine the diff routes I need to rebuild the nvp ones - they are not \u0027equivalent\u0027 to \u0027routes\u0027 as they hold the same info in attributes with different names).\nTherefore, I figured that the common use cases are: 1) you either clear the routing table (in which case deleting all is fine); or 2) you are updating the routes with a similar number of routes. \n\nIn any case, I think the killer fix for this would be fixing this bug:\n\nhttps://bugs.launchpad.net/neutron/+bug/1192316\n\nSo that you don\u0027t have to do this bulky update at all","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"},{"line_number":498,"context_line":"                                                 \u0027router_id\u0027: router_id})"},{"line_number":499,"context_line":"        # Roll back to keep NVP in consistent state"},{"line_number":500,"context_line":"        if nvp_routes:"},{"line_number":501,"context_line":"            if deleted_routes:"},{"line_number":502,"context_line":"                for route in deleted_routes:"},{"line_number":503,"context_line":"                    create_explicit_route_lrouter(cluster,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWzc%3D","line":500,"updated":"2013-07-03 13:51:08.000000000","message":"and what if the following raises too?\nI think in that case we will be \u003cinsert your favourite idiom here\u003e.\nHowever you can at least try and use excutils.save_and_reraise to ensure the original exception is not lost.","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"},{"line_number":498,"context_line":"                                                 \u0027router_id\u0027: router_id})"},{"line_number":499,"context_line":"        # Roll back to keep NVP in consistent state"},{"line_number":500,"context_line":"        if nvp_routes:"},{"line_number":501,"context_line":"            if deleted_routes:"},{"line_number":502,"context_line":"                for route in deleted_routes:"},{"line_number":503,"context_line":"                    create_explicit_route_lrouter(cluster,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQYo%3D","line":500,"in_reply_to":"AAAAPn%2F%2FWak%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                      \u0027router %(router_id)s\u0027) % {\u0027routes\u0027: routes,"},{"line_number":498,"context_line":"                                                 \u0027router_id\u0027: router_id})"},{"line_number":499,"context_line":"        # Roll back to keep NVP in consistent state"},{"line_number":500,"context_line":"        if nvp_routes:"},{"line_number":501,"context_line":"            if deleted_routes:"},{"line_number":502,"context_line":"                for route in deleted_routes:"},{"line_number":503,"context_line":"                    create_explicit_route_lrouter(cluster,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWak%3D","line":500,"in_reply_to":"AAAAPn%2F%2FWzc%3D","updated":"2013-07-03 14:46:32.000000000","message":"will look into that","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"}],"quantum/tests/unit/nicira/test_maclearning.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"736a4192035b5ff45aa0050fd522b111a043b22a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            return self.fc.fake_request(*args, **kwargs)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # Emulate tests against NVP 2.x"},{"line_number":88,"context_line":"        instance.return_value.get_nvp_version.return_value \u003d NVPVersion(\"2.9\")"},{"line_number":89,"context_line":"        instance.return_value.request.side_effect \u003d _fake_request"},{"line_number":90,"context_line":"        cfg.CONF.set_override(\u0027metadata_mode\u0027, None, \u0027NVP\u0027)"},{"line_number":91,"context_line":"        self.addCleanup(self.fc.reset_all)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FW1M%3D","line":88,"updated":"2013-07-03 13:51:08.000000000","message":"perhaps we should move this to 3.0 at least now\n(it should not have any bearing on the fake api client)","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"30bc872808beb90090b7bd276ae04bff6dc1de87","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            return self.fc.fake_request(*args, **kwargs)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # Emulate tests against NVP 2.x"},{"line_number":88,"context_line":"        instance.return_value.get_nvp_version.return_value \u003d NVPVersion(\"2.9\")"},{"line_number":89,"context_line":"        instance.return_value.request.side_effect \u003d _fake_request"},{"line_number":90,"context_line":"        cfg.CONF.set_override(\u0027metadata_mode\u0027, None, \u0027NVP\u0027)"},{"line_number":91,"context_line":"        self.addCleanup(self.fc.reset_all)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FWa0%3D","line":88,"in_reply_to":"AAAAPn%2F%2FW1M%3D","updated":"2013-07-03 14:46:32.000000000","message":"can do","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"14a55fec1a5193be23c1c70c0331712757283f2d","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            return self.fc.fake_request(*args, **kwargs)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        # Emulate tests against NVP 2.x"},{"line_number":88,"context_line":"        instance.return_value.get_nvp_version.return_value \u003d NVPVersion(\"2.9\")"},{"line_number":89,"context_line":"        instance.return_value.request.side_effect \u003d _fake_request"},{"line_number":90,"context_line":"        cfg.CONF.set_override(\u0027metadata_mode\u0027, None, \u0027NVP\u0027)"},{"line_number":91,"context_line":"        self.addCleanup(self.fc.reset_all)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAPn%2F%2FQYk%3D","line":88,"in_reply_to":"AAAAPn%2F%2FWa0%3D","updated":"2013-07-05 22:22:30.000000000","message":"Done","commit_id":"eed7b1384c1286bad4d48b6f2849a60664320848"}]}
