)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d92defa49f1ee9f714fc6658ebabbb378e8aa10","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"So the current fix will check for the existence of the table index"},{"line_number":16,"context_line":"and also if the veth pairs for connecting the router namespace and"},{"line_number":17,"context_line":"fip namespace is already available then it would return."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: Ic2e80ebb59ac9e0e0063e5f6e69f3d66abe775a1"},{"line_number":20,"context_line":"Closes-Bug: #1702790"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ff346bd7_c7c82723","line":17,"updated":"2017-07-27 20:03:49.000000000","message":"This comment isn\u0027t correct any more regarding veth pairs.","commit_id":"c8ceb7efc0032eefb5ea743f667977b1b8391730"}],"neutron/agent/l3/dvr_fip_ns.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e4fbcf0d7241daeb31b77b7ad8220e81ecd36bd3","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            tbl_index_list.append(tbl_index)"},{"line_number":264,"context_line":"        return tbl_index_list"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def check_fip_table_index_exists(self, ns_ipr, fip_tbl_index):"},{"line_number":267,"context_line":"        ip_rules_list \u003d ns_ipr.rule.list_rules(lib_constants.IP_VERSION_4)"},{"line_number":268,"context_line":"        for ip_rule in ip_rules_list:"},{"line_number":269,"context_line":"            tbl_index \u003d ip_rule[\u0027table\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f1d235d_613fafb5","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":36},"updated":"2017-07-09 05:15:03.000000000","message":"nit - this is a local method so it should have a prefix of _","commit_id":"217faf1f66dca7c449167110929a2e93528154bd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e4fbcf0d7241daeb31b77b7ad8220e81ecd36bd3","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        for ip_rule in ip_rules_list:"},{"line_number":269,"context_line":"            tbl_index \u003d ip_rule[\u0027table\u0027]"},{"line_number":270,"context_line":"            if tbl_index \u003d\u003d fip_tbl_index:"},{"line_number":271,"context_line":"                return True"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def _add_default_gateway_for_fip(self, gw_ip, ip_device, tbl_index):"},{"line_number":274,"context_line":"        \"\"\"Adds default gateway for fip based on the tbl_index passed.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f1d235d_413cb3be","line":271,"updated":"2017-07-09 05:15:03.000000000","message":"maybe i am picky but if possible could we return False if the conditions are not met","commit_id":"217faf1f66dca7c449167110929a2e93528154bd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e4fbcf0d7241daeb31b77b7ad8220e81ecd36bd3","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # Now add the filter match rule for the table."},{"line_number":310,"context_line":"        ip_rule \u003d ip_lib.IPRule(namespace\u003dself.get_name())"},{"line_number":311,"context_line":"        # In order to avoid error, check if the table_index exists before"},{"line_number":312,"context_line":"        # adding the table_index to the namespace."},{"line_number":313,"context_line":"        if not self.check_fip_table_index_exists(ip_rule, rt_tbl_index):"},{"line_number":314,"context_line":"            # Now add the filter match rule for the table."}],"source_content_type":"text/x-python","patch_set":2,"id":"3f1d235d_2149b75f","line":311,"range":{"start_line":311,"start_character":28,"end_line":311,"end_character":33},"updated":"2017-07-09 05:15:03.000000000","message":"is there a specific error that we can catch here? if some which not jus do a try catch on the rule add?","commit_id":"217faf1f66dca7c449167110929a2e93528154bd"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1aef723aa6d088a2a11d93b8564e9043f7082a02","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        ip_rules_list \u003d ns_ipr.rule.list_rules(lib_constants.IP_VERSION_4)"},{"line_number":268,"context_line":"        for ip_rule in ip_rules_list:"},{"line_number":269,"context_line":"            tbl_index \u003d ip_rule[\u0027table\u0027]"},{"line_number":270,"context_line":"            if str(tbl_index) !\u003d str(fip_tbl_index):"},{"line_number":271,"context_line":"                continue"},{"line_number":272,"context_line":"            return True"},{"line_number":273,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_464cbd9d","line":270,"updated":"2017-07-24 20:31:41.000000000","message":"I think this should check \u003d\u003d, and if so, return True, seems more obvious than having a continue here.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5380ad1c6287cee96831ca64c71171c0afcbd99e","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        ip_rules_list \u003d ns_ipr.rule.list_rules(lib_constants.IP_VERSION_4)"},{"line_number":268,"context_line":"        for ip_rule in ip_rules_list:"},{"line_number":269,"context_line":"            tbl_index \u003d ip_rule[\u0027table\u0027]"},{"line_number":270,"context_line":"            if str(tbl_index) !\u003d str(fip_tbl_index):"},{"line_number":271,"context_line":"                continue"},{"line_number":272,"context_line":"            return True"},{"line_number":273,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_9cd9d884","line":270,"in_reply_to":"ff346bd7_464cbd9d","updated":"2017-07-24 21:26:11.000000000","message":"Sure will fix it.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"d18fb8a10cc3b520479b1a8529800da408a59621","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        ip_rule \u003d ip_lib.IPRule(namespace\u003dself.get_name())"},{"line_number":313,"context_line":"        # In order to avoid RTNETLINK error, check if the table_index exists"},{"line_number":314,"context_line":"        # before adding the table_index to the namespace."},{"line_number":315,"context_line":"        if not self._check_fip_table_index_exists(ip_rule, rt_tbl_index):"},{"line_number":316,"context_line":"            # Now add the filter match rule for the table."},{"line_number":317,"context_line":"            ip_rule.rule.add(ip\u003dstr(fip_2_rtr.ip),"},{"line_number":318,"context_line":"                             iif\u003dfip_2_rtr_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_8bb521f1","line":315,"range":{"start_line":315,"start_character":8,"end_line":315,"end_character":73},"updated":"2017-07-11 01:32:10.000000000","message":"So we returns in L439, do we still need to check the fip table index exists here?","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"ba113faf6acde9bc7ccb26615b487ee740d989cd","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        ip_rule \u003d ip_lib.IPRule(namespace\u003dself.get_name())"},{"line_number":313,"context_line":"        # In order to avoid RTNETLINK error, check if the table_index exists"},{"line_number":314,"context_line":"        # before adding the table_index to the namespace."},{"line_number":315,"context_line":"        if not self._check_fip_table_index_exists(ip_rule, rt_tbl_index):"},{"line_number":316,"context_line":"            # Now add the filter match rule for the table."},{"line_number":317,"context_line":"            ip_rule.rule.add(ip\u003dstr(fip_2_rtr.ip),"},{"line_number":318,"context_line":"                             iif\u003dfip_2_rtr_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_f20d7a90","line":315,"range":{"start_line":315,"start_character":8,"end_line":315,"end_character":73},"in_reply_to":"3f1d235d_54cae819","updated":"2017-07-12 01:36:28.000000000","message":"OK.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"c5b2170fe2f73af5a119a0378451f0307ff68ca1","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        ip_rule \u003d ip_lib.IPRule(namespace\u003dself.get_name())"},{"line_number":313,"context_line":"        # In order to avoid RTNETLINK error, check if the table_index exists"},{"line_number":314,"context_line":"        # before adding the table_index to the namespace."},{"line_number":315,"context_line":"        if not self._check_fip_table_index_exists(ip_rule, rt_tbl_index):"},{"line_number":316,"context_line":"            # Now add the filter match rule for the table."},{"line_number":317,"context_line":"            ip_rule.rule.add(ip\u003dstr(fip_2_rtr.ip),"},{"line_number":318,"context_line":"                             iif\u003dfip_2_rtr_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_54cae819","line":315,"range":{"start_line":315,"start_character":8,"end_line":315,"end_character":73},"in_reply_to":"3f1d235d_8bb521f1","updated":"2017-07-11 17:50:59.000000000","message":"Yes I had this fix first and then realized that we can return at L439.\nBut having this fix in here will not hurt. \nSince this is going to be called only once.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1aef723aa6d088a2a11d93b8564e9043f7082a02","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        fip_2_rtr_dev \u003d ip_lib.IPDevice(fip_2_rtr_name, namespace\u003dfip_ns_name)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        # NOTE: if devices  exist, it might be an agent restart"},{"line_number":438,"context_line":"        if rtr_2_fip_dev.exists() and fip_2_rtr_dev.exists():"},{"line_number":439,"context_line":"            return"},{"line_number":440,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dri.ns_name)"},{"line_number":441,"context_line":"        rtr_2_fip_dev, fip_2_rtr_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_e6bcd16a","line":438,"updated":"2017-07-24 20:31:41.000000000","message":"I don\u0027t think you need to check both, since it\u0027s a single /sbin/ip command to create the pair if one exists the other should as well.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5380ad1c6287cee96831ca64c71171c0afcbd99e","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        fip_2_rtr_dev \u003d ip_lib.IPDevice(fip_2_rtr_name, namespace\u003dfip_ns_name)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        # NOTE: if devices  exist, it might be an agent restart"},{"line_number":438,"context_line":"        if rtr_2_fip_dev.exists() and fip_2_rtr_dev.exists():"},{"line_number":439,"context_line":"            return"},{"line_number":440,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dri.ns_name)"},{"line_number":441,"context_line":"        rtr_2_fip_dev, fip_2_rtr_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_fcf22406","line":438,"in_reply_to":"ff346bd7_e6bcd16a","updated":"2017-07-24 21:26:11.000000000","message":"Sure will revert to the old model.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1aef723aa6d088a2a11d93b8564e9043f7082a02","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dri.ns_name)"},{"line_number":441,"context_line":"        rtr_2_fip_dev, fip_2_rtr_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"},{"line_number":442,"context_line":"                                                           fip_2_rtr_name,"},{"line_number":443,"context_line":"                                                           fip_ns_name)"},{"line_number":444,"context_line":"        mtu \u003d ri.get_ex_gw_port().get(\u0027mtu\u0027)"},{"line_number":445,"context_line":"        if mtu:"},{"line_number":446,"context_line":"            rtr_2_fip_dev.link.set_mtu(mtu)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f1a1f67_01cc5bba","line":443,"updated":"2017-07-24 20:31:41.000000000","message":"I think to be safe we should put the add_veth() call here under the !exists case, but still set the mtu, addrs and route all the time.  It could be that the mtu has changed and we need to set it, or that the device exists without an IP.\n\nOr will that still trigger an error?","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5380ad1c6287cee96831ca64c71171c0afcbd99e","unresolved":false,"context_lines":[{"line_number":440,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dri.ns_name)"},{"line_number":441,"context_line":"        rtr_2_fip_dev, fip_2_rtr_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"},{"line_number":442,"context_line":"                                                           fip_2_rtr_name,"},{"line_number":443,"context_line":"                                                           fip_ns_name)"},{"line_number":444,"context_line":"        mtu \u003d ri.get_ex_gw_port().get(\u0027mtu\u0027)"},{"line_number":445,"context_line":"        if mtu:"},{"line_number":446,"context_line":"            rtr_2_fip_dev.link.set_mtu(mtu)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_1cee0822","line":443,"in_reply_to":"1f1a1f67_01cc5bba","updated":"2017-07-24 21:26:11.000000000","message":"In the current code base the create_rtr_2_fip_link will only be called once. If the rtr_to_fip_link_connect is True, it will not be called.\nThat\u0027s the reason I thought even if you have the mtu, addrs and route to set all time, this piece of code may not get executed.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9d92defa49f1ee9f714fc6658ebabbb378e8aa10","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            ip_rule.rule.add(ip\u003dstr(fip_2_rtr.ip),"},{"line_number":317,"context_line":"                             iif\u003dfip_2_rtr_name,"},{"line_number":318,"context_line":"                             table\u003drt_tbl_index,"},{"line_number":319,"context_line":"                             priority\u003drt_tbl_index)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _update_gateway_port(self, agent_gateway_port, interface_name):"},{"line_number":322,"context_line":"        if (self.agent_gateway_port and"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff346bd7_e71b2bc7","line":319,"updated":"2017-07-27 20:03:49.000000000","message":"I dug into this some more and found that the ip_lib code isn\u0027t matching the existing entry correctly, there\u0027s a one-line change needed over in the iprule.add() code to specify the \u0027from\u0027 address to be 0.0.0.0/0 when an iif is specified.\n\nI\u0027ll update this patch based on that.","commit_id":"c8ceb7efc0032eefb5ea743f667977b1b8391730"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"0387bc4e3c6711734cae0c64b0ba238b9565bbfa","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        # interface, pass the \"any\" IP address, for example, 0.0.0.0/0,"},{"line_number":478,"context_line":"        # else pass the given IP."},{"line_number":479,"context_line":"        if kwargs.get(\u0027iif\u0027):"},{"line_number":480,"context_line":"            if ip_version \u003d\u003d constants.IP_VERSION_4:"},{"line_number":481,"context_line":"                kwargs.update({\u0027from\u0027: constants.IPv4_ANY})"},{"line_number":482,"context_line":"            else:"},{"line_number":483,"context_line":"                kwargs.update({\u0027from\u0027: constants.IPv6_ANY})"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            kwargs.update({\u0027from\u0027: ip})"},{"line_number":486,"context_line":"        canonical_kwargs \u003d self._make_canonical(ip_version, kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff346bd7_e99ad95f","line":483,"range":{"start_line":480,"start_character":12,"end_line":483,"end_character":59},"updated":"2017-07-28 01:56:21.000000000","message":"Maybe this can be short as:\nkwargs.update({\u0027from\u0027: constants.IP_ANY[ip_version]})","commit_id":"15ec9e128c86afa82087ae203c561dce18d0e46a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"faf517b918d20864197e75e5d8f34a24c1026169","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        # interface, pass the \"any\" IP address, for example, 0.0.0.0/0,"},{"line_number":478,"context_line":"        # else pass the given IP."},{"line_number":479,"context_line":"        if kwargs.get(\u0027iif\u0027):"},{"line_number":480,"context_line":"            if ip_version \u003d\u003d constants.IP_VERSION_4:"},{"line_number":481,"context_line":"                kwargs.update({\u0027from\u0027: constants.IPv4_ANY})"},{"line_number":482,"context_line":"            else:"},{"line_number":483,"context_line":"                kwargs.update({\u0027from\u0027: constants.IPv6_ANY})"},{"line_number":484,"context_line":"        else:"},{"line_number":485,"context_line":"            kwargs.update({\u0027from\u0027: ip})"},{"line_number":486,"context_line":"        canonical_kwargs \u003d self._make_canonical(ip_version, kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff346bd7_6f5dc913","line":483,"range":{"start_line":480,"start_character":12,"end_line":483,"end_character":59},"in_reply_to":"ff346bd7_e99ad95f","updated":"2017-07-28 03:04:08.000000000","message":"Yes, that\u0027s much easier, and used elsewhere in this code too.","commit_id":"15ec9e128c86afa82087ae203c561dce18d0e46a"}],"neutron/tests/unit/agent/l3/test_dvr_fip_ns.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"d18fb8a10cc3b520479b1a8529800da408a59621","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        self.fip_ns._add_rtr_ext_route_rule_to_route_table \u003d mock.Mock()"},{"line_number":289,"context_line":"        self.fip_ns.create_rtr_2_fip_link(ri)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        if not dev_exists:"},{"line_number":292,"context_line":"            ip_wrapper.add_veth.assert_called_with(rtr_2_fip_name,"},{"line_number":293,"context_line":"                                                   fip_2_rtr_name,"},{"line_number":294,"context_line":"                                                   fip_ns_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_4b21494d","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":26},"updated":"2017-07-11 01:32:10.000000000","message":"Maybe we need to assert both rtr_2_fip_device and fip_2_rtr_device called here.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"c5b2170fe2f73af5a119a0378451f0307ff68ca1","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        self.fip_ns._add_rtr_ext_route_rule_to_route_table \u003d mock.Mock()"},{"line_number":289,"context_line":"        self.fip_ns.create_rtr_2_fip_link(ri)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        if not dev_exists:"},{"line_number":292,"context_line":"            ip_wrapper.add_veth.assert_called_with(rtr_2_fip_name,"},{"line_number":293,"context_line":"                                                   fip_2_rtr_name,"},{"line_number":294,"context_line":"                                                   fip_ns_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_b4fdbc3b","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":26},"in_reply_to":"3f1d235d_4b21494d","updated":"2017-07-11 17:50:59.000000000","message":"We are asserting for both devices, but the argument is passed to check if both are there or not.\nthey are veth pairs and I don\u0027t think we will have just one versus the other.","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"ba113faf6acde9bc7ccb26615b487ee740d989cd","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        self.fip_ns._add_rtr_ext_route_rule_to_route_table \u003d mock.Mock()"},{"line_number":289,"context_line":"        self.fip_ns.create_rtr_2_fip_link(ri)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        if not dev_exists:"},{"line_number":292,"context_line":"            ip_wrapper.add_veth.assert_called_with(rtr_2_fip_name,"},{"line_number":293,"context_line":"                                                   fip_2_rtr_name,"},{"line_number":294,"context_line":"                                                   fip_ns_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f1d235d_521c2ec0","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":26},"in_reply_to":"3f1d235d_b4fdbc3b","updated":"2017-07-12 01:36:28.000000000","message":"Done","commit_id":"6c460dc29223e44f6c77af8ff0114cbd180a2c2b"}]}
