)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"8da5f6af08ed1502aa464819276cd528a3a738bf","unresolved":false,"context_lines":[{"line_number":15,"context_line":"patched with commit 58a3e8270fe72f8ed92687d3a3132c2a708582dd or it is"},{"line_number":16,"context_line":"new enough to include it without being patched."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Fixes bug 1250596"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ice5242c6f0446d16aaaa7ee353d674310297ef72"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2FMAc%3D","line":18,"updated":"2013-11-13 08:01:15.000000000","message":"nit: Closes-Bug: #1250596","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3302d6b9f18fb485e37ea3cd09b7d59ab7dc1f5d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"patched with commit 58a3e8270fe72f8ed92687d3a3132c2a708582dd or it is"},{"line_number":16,"context_line":"new enough to include it without being patched."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Fixes bug 1250596"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ice5242c6f0446d16aaaa7ee353d674310297ef72"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2FKUg%3D","line":18,"in_reply_to":"AAAATn%2F%2FMAc%3D","updated":"2013-11-13 15:28:58.000000000","message":"Done","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"}],"neutron/agent/l3_agent.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"6b9dc042b344867578bb3fd4420f98a7d2608f14","unresolved":false,"context_lines":[{"line_number":258,"context_line":"                    ns[len(NS_PREFIX):],"},{"line_number":259,"context_line":"                    self.root_helper,"},{"line_number":260,"context_line":"                    ns)"},{"line_number":261,"context_line":"                pm.disable()"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                try:"},{"line_number":264,"context_line":"                    self._destroy_router_namespace(ns)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FM8s%3D","line":261,"updated":"2013-11-13 00:17:17.000000000","message":"I found that the metadata proxy was not destroyed in this case.  It was necessary to fix this before deleting the namespace.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":2531,"name":"Xu Chen","email":"xchenum@gmail.com","username":"xchenum"},"change_message_id":"93ff9147f4fb61895acf7f007ac98c3afc758a20","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                    self.root_helper,"},{"line_number":260,"context_line":"                    ns)"},{"line_number":261,"context_line":"                pm.disable()"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                try:"},{"line_number":264,"context_line":"                    self._destroy_router_namespace(ns)"},{"line_number":265,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FM1Y%3D","line":262,"updated":"2013-11-13 01:21:19.000000000","message":"It might be easier to use the \"ip netns pids \u003cns\u003e\" to list all the processes in the namespace. This is useful specially when some processes are spawn outside of OpenStack.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3302d6b9f18fb485e37ea3cd09b7d59ab7dc1f5d","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                    self.root_helper,"},{"line_number":260,"context_line":"                    ns)"},{"line_number":261,"context_line":"                pm.disable()"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"                try:"},{"line_number":264,"context_line":"                    self._destroy_router_namespace(ns)"},{"line_number":265,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FKTs%3D","line":262,"in_reply_to":"AAAATn%2F%2FM1Y%3D","updated":"2013-11-13 15:28:58.000000000","message":"ip netns pids is not a valid command in Ubuntu 12.04 which is the base operating system that we\u0027re using.  I suspect many others will be the same for a while.\n\nThe Ubuntu installation guide is written for Ubuntu 12.04.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"8da5f6af08ed1502aa464819276cd528a3a738bf","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                                   prefix\u003dEXTERNAL_DEV_PREFIX)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if self.conf.router_delete_namespaces:"},{"line_number":282,"context_line":"            ns_ip.netns.delete(namespace)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _create_router_namespace(self, ri):"},{"line_number":285,"context_line":"            ip_wrapper_root \u003d ip_lib.IPWrapper(self.root_helper)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FL4o%3D","line":282,"updated":"2013-11-13 08:01:15.000000000","message":"there is garbage_collect_namespace function in ip_lib. It might be better to use it.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"ceac255feab0cb012fea41f08ee85c016be6c03d","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                                   prefix\u003dEXTERNAL_DEV_PREFIX)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if self.conf.router_delete_namespaces:"},{"line_number":282,"context_line":"            ns_ip.netns.delete(namespace)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _create_router_namespace(self, ri):"},{"line_number":285,"context_line":"            ip_wrapper_root \u003d ip_lib.IPWrapper(self.root_helper)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FKM4%3D","line":282,"in_reply_to":"AAAATn%2F%2FKSg%3D","updated":"2013-11-13 15:45:41.000000000","message":"So, a quick glance through the garbage collect function reminded me of why I chose not to use it.\n\nGiven that we just cleaned out the namespace, all of the calls around the call to self.netns.delete are redundant, especially self.namespace_is_empty().\n\nNormally, this wouldn\u0027t be a big deal.  However, given that some kernels (e.g. Ubuntu 12.04/10\u0027s) make it a little expensive to run \"ip netns exec ...\" it is better to avoid running \"ip link list\" in this case.\n\nThe garbage collect method was designed for the netns_cleanup_util script where it was necessary to determine if it was safe to delete.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3302d6b9f18fb485e37ea3cd09b7d59ab7dc1f5d","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                                   prefix\u003dEXTERNAL_DEV_PREFIX)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        if self.conf.router_delete_namespaces:"},{"line_number":282,"context_line":"            ns_ip.netns.delete(namespace)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _create_router_namespace(self, ri):"},{"line_number":285,"context_line":"            ip_wrapper_root \u003d ip_lib.IPWrapper(self.root_helper)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2FKSg%3D","line":282,"in_reply_to":"AAAATn%2F%2FL4o%3D","updated":"2013-11-13 15:28:58.000000000","message":"I will have a quick look at this again.  I have a vague recollection that it did not quite work for me.","commit_id":"5e3deaacb6293cd5eb2acd62042883b9243ae32c"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b70a6c53ba57afd11b47484da1026eaa5781be8a","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        root_ip \u003d ip_lib.IPWrapper(self.root_helper)"},{"line_number":251,"context_line":"        for ns in root_ip.get_namespaces(self.root_helper):"},{"line_number":252,"context_line":"            if ns.startswith(NS_PREFIX):"},{"line_number":253,"context_line":"                if only_router_id and not ns.endswith(only_router_id):"},{"line_number":254,"context_line":"                    continue"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"                pm \u003d external_process.ProcessManager("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B2Aw%3D","line":253,"updated":"2013-11-19 13:19:08.000000000","message":"(Suggestion only) Since the router id is used both here and on line 258, consider extracting it out of the namespace for use in both places, e.g.\n\nrouter_id \u003d ns[len(NS_PREFIX):]\n...","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8aeee20026575d0331fc948aae0caa4463d65e16","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        root_ip \u003d ip_lib.IPWrapper(self.root_helper)"},{"line_number":251,"context_line":"        for ns in root_ip.get_namespaces(self.root_helper):"},{"line_number":252,"context_line":"            if ns.startswith(NS_PREFIX):"},{"line_number":253,"context_line":"                if only_router_id and not ns.endswith(only_router_id):"},{"line_number":254,"context_line":"                    continue"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"                pm \u003d external_process.ProcessManager("}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B1Ao%3D","line":253,"in_reply_to":"AAAATn%2F%2B2Aw%3D","updated":"2013-11-19 16:58:23.000000000","message":"Yes, I like that.  Done.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b70a6c53ba57afd11b47484da1026eaa5781be8a","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                if only_router_id and not ns.endswith(only_router_id):"},{"line_number":254,"context_line":"                    continue"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"                pm \u003d external_process.ProcessManager("},{"line_number":257,"context_line":"                    self.conf,"},{"line_number":258,"context_line":"                    ns[len(NS_PREFIX):],"},{"line_number":259,"context_line":"                    self.root_helper,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B1%2Fw%3D","line":256,"updated":"2013-11-19 13:19:08.000000000","message":"(Suggestion only) Rather than duplicating the call to kill the metadata proxy, consider refactoring _spawn/_destroy_metadata_proxy to accept router_id and namespace instead of router_info (since those are the only attributes used by either one) and then reusing _destroy_metadata_proxy here.  This will make maintenance easier and also serves to document intent, since it wasn\u0027t immediately obvious to me what was being killed here and why.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8aeee20026575d0331fc948aae0caa4463d65e16","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                if only_router_id and not ns.endswith(only_router_id):"},{"line_number":254,"context_line":"                    continue"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"                pm \u003d external_process.ProcessManager("},{"line_number":257,"context_line":"                    self.conf,"},{"line_number":258,"context_line":"                    ns[len(NS_PREFIX):],"},{"line_number":259,"context_line":"                    self.root_helper,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B1AM%3D","line":256,"in_reply_to":"AAAATn%2F%2B1%2Fw%3D","updated":"2013-11-19 16:58:23.000000000","message":"Good idea.  This is one that I had considered before but I chose not to because I thought it went a bit too far outside the scope of this patch.  I\u0027ll put up a follow-on patch to this one today as a pure refactor.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8b768372feae46bfd51d5d1271b8602c09895026","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                if only_router_id and not ns.endswith(only_router_id):"},{"line_number":254,"context_line":"                    continue"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"                pm \u003d external_process.ProcessManager("},{"line_number":257,"context_line":"                    self.conf,"},{"line_number":258,"context_line":"                    ns[len(NS_PREFIX):],"},{"line_number":259,"context_line":"                    self.root_helper,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B0lw%3D","line":256,"in_reply_to":"AAAATn%2F%2B1AM%3D","updated":"2013-11-19 17:55:27.000000000","message":"Followed up with:  https://review.openstack.org/#/c/57293","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"64b0baf9840bfc7d491521096b51c29b2ffc949e","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        If only_router_id is passed, only destroy single namespace, to allow"},{"line_number":247,"context_line":"        for multiple l3 agents on the same host, without stepping on each"},{"line_number":248,"context_line":"        other\u0027s toes on init.  This only makes sense if only_router_id is set."},{"line_number":249,"context_line":"        \"\"\""},{"line_number":250,"context_line":"        root_ip \u003d ip_lib.IPWrapper(self.root_helper)"},{"line_number":251,"context_line":"        for ns in root_ip.get_namespaces(self.root_helper):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B02M%3D","line":248,"updated":"2013-11-19 17:09:18.000000000","message":"I felt that it was appropriate to fix this here because I now introduce router_id making this comment ambiguous (in addition to being incorrect).","commit_id":"6837dd639caadf0a32307abf667ee0ec55cb435a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"2de0f611a586f4ff2e524725b2e65bd7a5a2b9bf","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                if only_router_id and not only_router_id \u003d\u003d router_id:"},{"line_number":255,"context_line":"                    continue"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"                pm \u003d external_process.ProcessManager("},{"line_number":258,"context_line":"                    self.conf,"},{"line_number":259,"context_line":"                    router_id,"},{"line_number":260,"context_line":"                    self.root_helper,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B0uE%3D","line":257,"updated":"2013-11-19 17:27:19.000000000","message":"This should only be run conditionally:\n\nif self.conf.enable_metadata_proxy:","commit_id":"6837dd639caadf0a32307abf667ee0ec55cb435a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"32d11783362fd9dead0144111a39593984052017","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                ns_ip.netns.delete(namespace)"},{"line_number":281,"context_line":"            except RuntimeError:"},{"line_number":282,"context_line":"                msg \u003d _(\u0027Failed trying to delete namespace: %s\u0027)"},{"line_number":283,"context_line":"                LOG.exception(msg % namespace)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def _create_router_namespace(self, ri):"},{"line_number":286,"context_line":"            ip_wrapper_root \u003d ip_lib.IPWrapper(self.root_helper)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BuGk%3D","line":283,"updated":"2013-11-21 04:18:33.000000000","message":"super minor nit: \n LOG.exception(msg, namespace)","commit_id":"7336f3bd27d138b3d11d601f977a1e3df2a44b3e"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b70a6c53ba57afd11b47484da1026eaa5781be8a","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                    ns_ip.netns.delete(self.network.namespace)"},{"line_number":201,"context_line":"                except RuntimeError:"},{"line_number":202,"context_line":"                    msg \u003d _(\u0027Failed trying to delete namespace: %s\u0027)"},{"line_number":203,"context_line":"                    LOG.exception(msg % self.network.namespace)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def _remove_config_files(self):"},{"line_number":206,"context_line":"        confs_dir \u003d os.path.abspath(os.path.normpath(self.conf.dhcp_confs))"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B51w%3D","line":203,"updated":"2013-11-19 13:19:08.000000000","message":"Prefer lazy string substitution - replace \u0027,\u0027 with a %\u0027.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"}],"neutron/tests/unit/test_l3_agent.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"14eee95c80af7a6820dd7c611a208cf8824c3b69","unresolved":false,"context_lines":[{"line_number":629,"context_line":""},{"line_number":630,"context_line":"        self.mock_ip.get_namespaces.return_value \u003d namespaces"},{"line_number":631,"context_line":"        self.mock_ip.get_devices.return_value \u003d [FakeDev(\u0027qr-aaaa\u0027),"},{"line_number":632,"context_line":"                                                 FakeDev(\u0027qgw-aaaa\u0027)]"},{"line_number":633,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"        pm \u003d self.external_process.return_value"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2FM9E%3D","line":632,"updated":"2013-11-13 00:14:55.000000000","message":"I did not intend to delete the line below here.  I will add it back in a follow-on.","commit_id":"05ea0d3c17df6b1efdbf22b459eb85d08d16ed12"},{"author":{"_account_id":2035,"name":"Maru Newby","email":"marun@redhat.com","username":"maru"},"change_message_id":"b70a6c53ba57afd11b47484da1026eaa5781be8a","unresolved":false,"context_lines":[{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        self.assertEqual(agent._destroy_router_namespace.call_count, 1)"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"    def test_dont_delete_namespace(self):"},{"line_number":647,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":648,"context_line":"        agent._destroy_router_namespace(\"fakens\")"},{"line_number":649,"context_line":"        self.assertEqual(self.mock_ip.netns.delete.call_count, 0)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B1%2FA%3D","line":646,"updated":"2013-11-19 13:19:08.000000000","message":"(Suggestion only) Consider following the convention of test naming that includes the name of the function under test and specializes it to include the expected behavior, e.g.\n\ntest_destroy_router_namespace_skips_ns_removal\ntest_destroy_router_namespace_removes_ns\n\nThis convention makes it easy to tell the intended purpose of a test for both review and maintenance purposes.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8aeee20026575d0331fc948aae0caa4463d65e16","unresolved":false,"context_lines":[{"line_number":643,"context_line":""},{"line_number":644,"context_line":"        self.assertEqual(agent._destroy_router_namespace.call_count, 1)"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"    def test_dont_delete_namespace(self):"},{"line_number":647,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":648,"context_line":"        agent._destroy_router_namespace(\"fakens\")"},{"line_number":649,"context_line":"        self.assertEqual(self.mock_ip.netns.delete.call_count, 0)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2B0%2FI%3D","line":646,"in_reply_to":"AAAATn%2F%2B1%2FA%3D","updated":"2013-11-19 16:58:23.000000000","message":"Agreed.  Done.","commit_id":"2985ea9c5512c9eaeeef4fb6e3aa1448368bb68a"}]}
