)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":22220,"name":"Anindita Das","email":"anindita.das@utexas.edu","username":"anudas"},"change_message_id":"b5e6aee19f4a0a3c6f276d0536d14e516ab8ed3b","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Router namespace absence may lead to infinite loop in l3 agent trying"},{"line_number":10,"context_line":"to delete the router."},{"line_number":11,"context_line":"This patch adds checks before going into namespace to prevent RuntimeError"},{"line_number":12,"context_line":"and following infinite loop."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: #1606844"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9ad45d7e_8cafcce2","line":11,"updated":"2016-08-08 18:56:12.000000000","message":"nit: line exceeds 72 characters","commit_id":"31a7feea6b60dac138b00652d2f16982a3b25f78"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"44a59333929d52a29e2915b3aff658bb23be4806","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Router namespace absence may lead to infinite loop in l3 agent trying"},{"line_number":10,"context_line":"to delete the router."},{"line_number":11,"context_line":"This patch adds checks before going into namespace to prevent RuntimeError"},{"line_number":12,"context_line":"and following infinite loop."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Closes-Bug: #1606844"},{"line_number":15,"context_line":"Change-Id: Iae95ccb8eeb06d0fd5fc7d71e63408b3f843b371"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9ad45d7e_312c274a","line":12,"range":{"start_line":12,"start_character":14,"end_line":12,"end_character":27},"updated":"2016-08-09 01:42:46.000000000","message":"Actually any exception in the router deletion procedure could trigger the infinite loop. Such as: [1] and its trace log [2].\nThe resync code in [3] is the essential problem. Its better to add some retry time mechanism there. This may be another issue.\n\n\n\n[1] https://bugs.launchpad.net/neutron/+bug/1609248\n[2] http://paste.openstack.org/show/547876/\n[3] https://github.com/openstack/neutron/blob/master/neutron/agent/l3/agent.py#L471","commit_id":"31a7feea6b60dac138b00652d2f16982a3b25f78"}],"neutron/agent/l3/dvr_fip_ns.py":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"1729d0fb4c6cd992bdfbba432d3adbc28501f9c0","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def delete(self):"},{"line_number":168,"context_line":"        self.destroyed \u003d True"},{"line_number":169,"context_line":"        if not self.exists():"},{"line_number":170,"context_line":"            return"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dself.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_eb4ba257","line":169,"range":{"start_line":169,"start_character":26,"end_line":169,"end_character":29},"updated":"2016-08-03 15:25:41.000000000","message":"Should this not be before you assign self.destroyed\u003dTrue.","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def delete(self):"},{"line_number":168,"context_line":"        self.destroyed \u003d True"},{"line_number":169,"context_line":"        if not self.exists():"},{"line_number":170,"context_line":"            return"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(namespace\u003dself.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_3ebf9361","line":169,"range":{"start_line":169,"start_character":26,"end_line":169,"end_character":29},"in_reply_to":"bacf61ea_eb4ba257","updated":"2016-08-04 08:01:59.000000000","message":"I believe self.destroyed should be True if there is no namespace","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5abef1780b339e1d6a3089e36a0d083650c91014","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                                   bridge\u003dext_net_bridge,"},{"line_number":184,"context_line":"                                   namespace\u003dself.name,"},{"line_number":185,"context_line":"                                   prefix\u003dFIP_EXT_DEV_PREFIX)"},{"line_number":186,"context_line":"        self.agent_gateway_port \u003d None"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # TODO(mrsmith): add LOG warn if fip count !\u003d 0"},{"line_number":189,"context_line":"        LOG.debug(\u0027DVR: destroy fip namespace: %s\u0027, self.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_8a6dc734","line":186,"updated":"2016-08-03 14:05:52.000000000","message":"I think we want to clear this.","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                                   bridge\u003dext_net_bridge,"},{"line_number":184,"context_line":"                                   namespace\u003dself.name,"},{"line_number":185,"context_line":"                                   prefix\u003dFIP_EXT_DEV_PREFIX)"},{"line_number":186,"context_line":"        self.agent_gateway_port \u003d None"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        # TODO(mrsmith): add LOG warn if fip count !\u003d 0"},{"line_number":189,"context_line":"        LOG.debug(\u0027DVR: destroy fip namespace: %s\u0027, self.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_be7263e1","line":186,"in_reply_to":"bacf61ea_8a6dc734","updated":"2016-08-04 08:01:59.000000000","message":"we do","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"c21217a88916e6338f730e914df3ab99eadb348f","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def delete(self):"},{"line_number":168,"context_line":"        self.destroyed \u003d True"},{"line_number":169,"context_line":"        self.agent_gateway_port \u003d None"},{"line_number":170,"context_line":"        self._delete()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @namespaces.check_ns_existence"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_10b25a94","line":169,"range":{"start_line":169,"start_character":34,"end_line":169,"end_character":38},"updated":"2016-08-04 17:54:22.000000000","message":"What happens if _delete fail to remove the namespace and self.destroyed and self.agent_gateway_port is already assigned to True and None.\nShould this be moved after self._delete(), is there any issue there.","commit_id":"66b2c983d0de95dbe8f5d8b99134f9bdcb17dcba"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"889848f9a22b6f3cc4059bf80999a5566624f7bd","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def delete(self):"},{"line_number":168,"context_line":"        self.destroyed \u003d True"},{"line_number":169,"context_line":"        self.agent_gateway_port \u003d None"},{"line_number":170,"context_line":"        self._delete()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @namespaces.check_ns_existence"}],"source_content_type":"text/x-python","patch_set":5,"id":"bacf61ea_0f234259","line":169,"range":{"start_line":169,"start_character":34,"end_line":169,"end_character":38},"in_reply_to":"bacf61ea_10b25a94","updated":"2016-08-05 07:37:24.000000000","message":"With self.destroyed logic here is preserved. I can move \u0027self.agent_gateway_port \u003d None\u0027 after _delete though, to preserve that logic as well.","commit_id":"66b2c983d0de95dbe8f5d8b99134f9bdcb17dcba"}],"neutron/agent/l3/namespaces.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"cb051d621af167c24dd0027e0ce48303a8b742ec","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return build_ns_name(NS_PREFIX, router_id)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def delete(self):"},{"line_number":102,"context_line":"        if not self.exists():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        ns_ip \u003d ip_lib.IPWrapper(namespace\u003dself.name)"},{"line_number":106,"context_line":"        for d in ns_ip.get_devices(exclude_loopback\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_ec1f4a07","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":18},"updated":"2016-08-03 11:26:10.000000000","message":"I would much rather this patch and [1] will work in the same way, i.e. produce a warning message to indicate that something raceful must have happened between the server and the agent (because  such a case is the only case where this is possible, the race must have happened).\n\nSo, if the namespace doesn\u0027t exist we should probably put out a warning message, in which case the marked \u0027if\u0027 block will get even more repetitive with the other appearances in the other files, so a decorator would also be nice.\n\n[1]: https://review.openstack.org/#/c/265672/","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return build_ns_name(NS_PREFIX, router_id)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def delete(self):"},{"line_number":102,"context_line":"        if not self.exists():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        ns_ip \u003d ip_lib.IPWrapper(namespace\u003dself.name)"},{"line_number":106,"context_line":"        for d in ns_ip.get_devices(exclude_loopback\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_61268ebb","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":18},"in_reply_to":"bacf61ea_0a1277b4","updated":"2016-08-04 08:01:59.000000000","message":"I believe all those changes are not mutual exclusive. As discussed on a DVR meeting let\u0027s proceed here. \n\nI\u0027ll create a decorator for ns existence check","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5abef1780b339e1d6a3089e36a0d083650c91014","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        return build_ns_name(NS_PREFIX, router_id)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def delete(self):"},{"line_number":102,"context_line":"        if not self.exists():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        ns_ip \u003d ip_lib.IPWrapper(namespace\u003dself.name)"},{"line_number":106,"context_line":"        for d in ns_ip.get_devices(exclude_loopback\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_0a1277b4","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":18},"in_reply_to":"bacf61ea_ec1f4a07","updated":"2016-08-03 14:05:52.000000000","message":"There are a few competing changes dealing with checking for namespace existence in various calls:\n\n[1] https://review.openstack.org/#/c/309050 (in get_devices)\n[2] https://review.openstack.org/#/c/326729 (for snat namespaces)\n\nThis patch is basically doing what [1] was, except in all the callers.  Let\u0027s talk about this in the DVR meeting today since I\u0027m starting to like [1] more now.\n\n[2] isn\u0027t just dealing with namespace existence, but is sprinkling exists() calls around like this patch.","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"403b42bfadbfe16b949fdfb74d3086dd7b456ce6","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def check_ns_existence(f):"},{"line_number":64,"context_line":"    @functools.wraps(f)"},{"line_number":65,"context_line":"    def wrapped(inst, *args, **kwargs):"},{"line_number":66,"context_line":"        if not inst.exists():"},{"line_number":67,"context_line":"            LOG.warning(_LW(\u0027Namespace %(name)s does not exists. Skipping \u0027"},{"line_number":68,"context_line":"                            \u0027%(func)s\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_0cfa5743","line":65,"range":{"start_line":65,"start_character":16,"end_line":65,"end_character":20},"updated":"2016-08-04 14:03:07.000000000","message":"nit, but will really appreciate a respin: rename to self :\u003c\nEvery time we don\u0027t use \u0027self\u0027 for these things, a puppy dies.","commit_id":"2c7119306a1a5a0e8466a9839ab6a7fc21bbc28a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"571502a923e92dbb73c22238830a7288dc42f928","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def check_ns_existence(f):"},{"line_number":64,"context_line":"    @functools.wraps(f)"},{"line_number":65,"context_line":"    def wrapped(inst, *args, **kwargs):"},{"line_number":66,"context_line":"        if not inst.exists():"},{"line_number":67,"context_line":"            LOG.warning(_LW(\u0027Namespace %(name)s does not exists. Skipping \u0027"},{"line_number":68,"context_line":"                            \u0027%(func)s\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_732c8702","line":65,"range":{"start_line":65,"start_character":16,"end_line":65,"end_character":20},"in_reply_to":"bacf61ea_0cfa5743","updated":"2016-08-04 16:00:18.000000000","message":"Done","commit_id":"2c7119306a1a5a0e8466a9839ab6a7fc21bbc28a"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"2a34de7242d6049f3e7a75425b2f09f0152a575f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"def check_ns_existence(f):"},{"line_number":64,"context_line":"    @functools.wraps(f)"},{"line_number":65,"context_line":"    def wrapped(inst, *args, **kwargs):"},{"line_number":66,"context_line":"        if not inst.exists():"},{"line_number":67,"context_line":"            LOG.warning(_LW(\u0027Namespace %(name)s does not exists. Skipping \u0027"},{"line_number":68,"context_line":"                            \u0027%(func)s\u0027),"},{"line_number":69,"context_line":"                        {\u0027name\u0027: inst.name, \u0027func\u0027: f.__name__})"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_39884222","line":66,"updated":"2016-08-04 11:33:56.000000000","message":"I\u0027m not sure if we need to worry about race conditions, but if so it might be worth doing a try: except and check if the namespace is gone to determine if reraise is necessary to handle the case where the namespace is removed during the protected function.","commit_id":"2c7119306a1a5a0e8466a9839ab6a7fc21bbc28a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"571502a923e92dbb73c22238830a7288dc42f928","unresolved":false,"context_lines":[{"line_number":63,"context_line":"def check_ns_existence(f):"},{"line_number":64,"context_line":"    @functools.wraps(f)"},{"line_number":65,"context_line":"    def wrapped(inst, *args, **kwargs):"},{"line_number":66,"context_line":"        if not inst.exists():"},{"line_number":67,"context_line":"            LOG.warning(_LW(\u0027Namespace %(name)s does not exists. Skipping \u0027"},{"line_number":68,"context_line":"                            \u0027%(func)s\u0027),"},{"line_number":69,"context_line":"                        {\u0027name\u0027: inst.name, \u0027func\u0027: f.__name__})"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_3347afbd","line":66,"in_reply_to":"bacf61ea_39884222","updated":"2016-08-04 16:00:18.000000000","message":"Done","commit_id":"2c7119306a1a5a0e8466a9839ab6a7fc21bbc28a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"d1b61c3b1b19fcb0f361a63b428c4c5b1dbdb554","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            LOG.exception(msg, self.name)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def exists(self):"},{"line_number":108,"context_line":"        return self.ip_wrapper_root.netns.exists(self.name)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"class RouterNamespace(Namespace):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_2cee9b22","line":108,"updated":"2016-08-08 19:49:04.000000000","message":"This is already in master, guess the tools can auto-merge it though.","commit_id":"31a7feea6b60dac138b00652d2f16982a3b25f78"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"cb051d621af167c24dd0027e0ce48303a8b742ec","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        \"\"\""},{"line_number":1018,"context_line":"        LOG.debug(\"process router delete\")"},{"line_number":1019,"context_line":"        agent.pd.sync_router(self.router[\u0027id\u0027])"},{"line_number":1020,"context_line":"        if self.router_namespace.exists():"},{"line_number":1021,"context_line":"            self._process_internal_ports(agent.pd)"},{"line_number":1022,"context_line":"            self._process_external_on_delete(agent)"},{"line_number":1023,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_0c73be4e","line":1020,"range":{"start_line":1020,"start_character":8,"end_line":1020,"end_character":42},"updated":"2016-08-03 11:26:10.000000000","message":"If the namespace doesn\u0027t exist, why do we need to call agent.pd.sync_router()?","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"        \"\"\""},{"line_number":1018,"context_line":"        LOG.debug(\"process router delete\")"},{"line_number":1019,"context_line":"        agent.pd.sync_router(self.router[\u0027id\u0027])"},{"line_number":1020,"context_line":"        if self.router_namespace.exists():"},{"line_number":1021,"context_line":"            self._process_internal_ports(agent.pd)"},{"line_number":1022,"context_line":"            self._process_external_on_delete(agent)"},{"line_number":1023,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_de2597c2","line":1020,"range":{"start_line":1020,"start_character":8,"end_line":1020,"end_character":42},"in_reply_to":"bacf61ea_0c73be4e","updated":"2016-08-04 08:01:59.000000000","message":"Done","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"}],"neutron/tests/unit/agent/l3/test_dvr_fip_ns.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"cb051d621af167c24dd0027e0ce48303a8b742ec","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        with mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":207,"context_line":"                               \u0027delete\u0027) as delete,\\"},{"line_number":208,"context_line":"                mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":209,"context_line":"                               \u0027exists\u0027, return_value\u003dTrue) as exists:"},{"line_number":210,"context_line":"            self.fip_ns.delete()"},{"line_number":211,"context_line":"            exists.assert_called_once_with(self.fip_ns.name)"},{"line_number":212,"context_line":"            delete.assert_called_once_with(self.fip_ns.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_4c2ad67f","line":209,"range":{"start_line":209,"start_character":0,"end_line":209,"end_character":31},"updated":"2016-08-03 11:26:10.000000000","message":"nits: needs 2 more spaces here so that \u0027exists\u0027 will begin on the same column as the above line\u0027s bracket.","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        with mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":207,"context_line":"                               \u0027delete\u0027) as delete,\\"},{"line_number":208,"context_line":"                mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":209,"context_line":"                               \u0027exists\u0027, return_value\u003dTrue) as exists:"},{"line_number":210,"context_line":"            self.fip_ns.delete()"},{"line_number":211,"context_line":"            exists.assert_called_once_with(self.fip_ns.name)"},{"line_number":212,"context_line":"            delete.assert_called_once_with(self.fip_ns.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_be20a3b1","line":209,"range":{"start_line":209,"start_character":0,"end_line":209,"end_character":31},"in_reply_to":"bacf61ea_4c2ad67f","updated":"2016-08-04 08:01:59.000000000","message":"Done","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"cb051d621af167c24dd0027e0ce48303a8b742ec","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":224,"context_line":"                               \u0027delete\u0027) as delete,\\"},{"line_number":225,"context_line":"                mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":226,"context_line":"                               \u0027exists\u0027, return_value\u003dFalse) as exists:"},{"line_number":227,"context_line":"            self.fip_ns.delete()"},{"line_number":228,"context_line":"            exists.assert_called_once_with(self.fip_ns.name)"},{"line_number":229,"context_line":"            self.assertFalse(delete.called)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_ac1f125a","line":226,"range":{"start_line":226,"start_character":0,"end_line":226,"end_character":31},"updated":"2016-08-03 11:26:10.000000000","message":"ditto","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fb0c957f065cdb839793605fb15452eb56f59c98","unresolved":false,"context_lines":[{"line_number":223,"context_line":"        with mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":224,"context_line":"                               \u0027delete\u0027) as delete,\\"},{"line_number":225,"context_line":"                mock.patch.object(self.fip_ns.ip_wrapper_root.netns,"},{"line_number":226,"context_line":"                               \u0027exists\u0027, return_value\u003dFalse) as exists:"},{"line_number":227,"context_line":"            self.fip_ns.delete()"},{"line_number":228,"context_line":"            exists.assert_called_once_with(self.fip_ns.name)"},{"line_number":229,"context_line":"            self.assertFalse(delete.called)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_1e30cf00","line":226,"range":{"start_line":226,"start_character":0,"end_line":226,"end_character":31},"in_reply_to":"bacf61ea_ac1f125a","updated":"2016-08-04 08:01:59.000000000","message":"Done","commit_id":"6db1cb9c6acfd8b1600661ce025d8e9a78b96b9c"}]}
