)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"4fbb70bf679e6462eb318fedf68338fb85588d00","unresolved":false,"context_lines":[{"line_number":15,"context_line":"was not removed even after the DHCP agent was started"},{"line_number":16,"context_line":"again on the host.  The end result is that there are two"},{"line_number":17,"context_line":"DHCP ports for the same network. One of these is found"},{"line_number":18,"context_line":"on the host that is no longer hosting the dhcp-server."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Closes-Bug: #1244860"},{"line_number":21,"context_line":"Change-Id: Ie0bafdac698810b5455550c306c6a75ddf91d9bb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2B7t4%3D","line":18,"updated":"2013-11-18 12:37:47.000000000","message":"Nit: this describes the problem, but not the solution taken. May want to elaborate on what this fix is doing.","commit_id":"7af69e84d75d84f7e491e41930ca1110caaa5108"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"3325ca9c77833d6da36bec278367124c48d2ded4","unresolved":false,"context_lines":[{"line_number":15,"context_line":"was not removed even after the DHCP agent was started"},{"line_number":16,"context_line":"again on the host.  The end result is that there are two"},{"line_number":17,"context_line":"DHCP ports for the same network. One of these is found"},{"line_number":18,"context_line":"on the host that is no longer hosting the dhcp-server."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Closes-Bug: #1244860"},{"line_number":21,"context_line":"Change-Id: Ie0bafdac698810b5455550c306c6a75ddf91d9bb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2B4%2Bw%3D","line":18,"in_reply_to":"AAAATn%2F%2B7t4%3D","updated":"2013-11-18 22:21:43.000000000","message":"The text now describes the cause of the problem and how it was fixed.","commit_id":"7af69e84d75d84f7e491e41930ca1110caaa5108"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0e4ac509becb36056b047974a727ea4c747fbc5d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Stephen Ma \u003cstephen.ma@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-11-18 14:10:15 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"DHCP port without DHCP server on a network node"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A DHCP-network was deleted from one host using neutron"},{"line_number":10,"context_line":"dhcp-agent-network-remove and then added to another host"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2B1i4%3D","line":7,"updated":"2013-11-19 15:01:01.000000000","message":"The summary line should describe what this commit does.\nPlease consider adding \"Delete\" at the beginning of line: \"Delete DHCP port without ....\".","commit_id":"32d3f3847d457aa816d37cbda367d4afa20bdd76"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"f0da7bfe6255102c1d937abaeb369711f73b80f5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Stephen Ma \u003cstephen.ma@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-11-18 14:10:15 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"DHCP port without DHCP server on a network node"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"A DHCP-network was deleted from one host using neutron"},{"line_number":10,"context_line":"dhcp-agent-network-remove and then added to another host"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2BzXw%3D","line":7,"in_reply_to":"AAAATn%2F%2B1i4%3D","updated":"2013-11-19 23:39:33.000000000","message":"Done","commit_id":"32d3f3847d457aa816d37cbda367d4afa20bdd76"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"cd64f0eb271037d1e0c85d49e28edc2fd1f01cef","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            if not retain_port:"},{"line_number":182,"context_line":"                self.device_manager.destroy(self.network, self.interface_name)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        elif pid:"},{"line_number":185,"context_line":"            LOG.debug(_(\u0027DHCP for %(net_id)s is stale, pid %(pid)d \u0027"},{"line_number":186,"context_line":"                        \u0027does not exist, performing cleanup\u0027),"},{"line_number":187,"context_line":"                      {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BrGE%3D","line":184,"updated":"2014-02-19 21:27:17.000000000","message":"revise 178-189:\n\nif pid:\n    if self.active:\n        cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, pid]\n        utils.execute(cmd, self.root_helper)\n    else:\n        LOG.debug(...)\n    if not retain_port:\n        self.device_manager.destroy(self.network, self.interface_name)","commit_id":"a57a650128a7917be1a9c5f2ea8b188f6d0580f1"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"d24f3b8066e53d5181aace346f8cf1a5a5ab10d0","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            if not retain_port:"},{"line_number":182,"context_line":"                self.device_manager.destroy(self.network, self.interface_name)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        elif pid:"},{"line_number":185,"context_line":"            LOG.debug(_(\u0027DHCP for %(net_id)s is stale, pid %(pid)d \u0027"},{"line_number":186,"context_line":"                        \u0027does not exist, performing cleanup\u0027),"},{"line_number":187,"context_line":"                      {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BcdU%3D","line":184,"in_reply_to":"AAAAUX%2F%2BrGE%3D","updated":"2014-02-21 04:42:35.000000000","message":"I will modify as suggested above. I will also check for the existence of the device if not active but pid file exists.","commit_id":"a57a650128a7917be1a9c5f2ea8b188f6d0580f1"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"d99acb18dc1feab2177fac73de653b2892e9ab6f","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if pid:"},{"line_number":181,"context_line":"            is_active \u003d self.active"},{"line_number":182,"context_line":"            if is_active:"},{"line_number":183,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, pid]"},{"line_number":184,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9t9A%3D","line":182,"updated":"2014-04-02 15:46:31.000000000","message":"We should be able to remove always_unplug parameter later in the code.\n\nif self.active:","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"852b59e2a97b91bc51730500e9c958329dede4d5","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if pid:"},{"line_number":181,"context_line":"            is_active \u003d self.active"},{"line_number":182,"context_line":"            if is_active:"},{"line_number":183,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, pid]"},{"line_number":184,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9XtY%3D","line":182,"in_reply_to":"AAAAWH%2F9t9A%3D","updated":"2014-04-05 05:09:16.000000000","message":"Done","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"0cc98f496b5e7f108290aa42b6c105535be097c5","unresolved":false,"context_lines":[{"line_number":820,"context_line":""},{"line_number":821,"context_line":"    def destroy(self, network, device_name, always_unplug\u003dTrue):"},{"line_number":822,"context_line":"        \"\"\"Destroy the device used for the network\u0027s DHCP on this host.\"\"\""},{"line_number":823,"context_line":"        if (always_unplug or"},{"line_number":824,"context_line":"            ip_lib.device_exists(device_name,"},{"line_number":825,"context_line":"                                 self.root_helper,"},{"line_number":826,"context_line":"                                 network.namespace)):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FIuI%3D","line":823,"updated":"2014-03-08 12:10:44.000000000","message":"is always_unplug really necessary? Why not just always call device_exists() to check if there is a device to unplug?","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"d99acb18dc1feab2177fac73de653b2892e9ab6f","unresolved":false,"context_lines":[{"line_number":820,"context_line":""},{"line_number":821,"context_line":"    def destroy(self, network, device_name, always_unplug\u003dTrue):"},{"line_number":822,"context_line":"        \"\"\"Destroy the device used for the network\u0027s DHCP on this host.\"\"\""},{"line_number":823,"context_line":"        if (always_unplug or"},{"line_number":824,"context_line":"            ip_lib.device_exists(device_name,"},{"line_number":825,"context_line":"                                 self.root_helper,"},{"line_number":826,"context_line":"                                 network.namespace)):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9t%2FU%3D","line":823,"in_reply_to":"AAAAVn%2F%2FIuI%3D","updated":"2014-04-02 15:46:31.000000000","message":"Agreed.  I don\u0027t think always_unplug is needed.","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"852b59e2a97b91bc51730500e9c958329dede4d5","unresolved":false,"context_lines":[{"line_number":820,"context_line":""},{"line_number":821,"context_line":"    def destroy(self, network, device_name, always_unplug\u003dTrue):"},{"line_number":822,"context_line":"        \"\"\"Destroy the device used for the network\u0027s DHCP on this host.\"\"\""},{"line_number":823,"context_line":"        if (always_unplug or"},{"line_number":824,"context_line":"            ip_lib.device_exists(device_name,"},{"line_number":825,"context_line":"                                 self.root_helper,"},{"line_number":826,"context_line":"                                 network.namespace)):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9XtM%3D","line":823,"in_reply_to":"AAAAWH%2F9t%2FU%3D","updated":"2014-04-05 05:09:16.000000000","message":"Done","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"2940347af4a24f7eafc974da927ea8973b99f53e","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        \"\"\"Destroy the device used for the network\u0027s DHCP on this host.\"\"\""},{"line_number":871,"context_line":"        if (ip_lib.device_exists(device_name,"},{"line_number":872,"context_line":"                                 self.root_helper,"},{"line_number":873,"context_line":"                                 network.namespace)):"},{"line_number":874,"context_line":"            self.driver.unplug(device_name, namespace\u003dnetwork.namespace)"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"        self.plugin.release_dhcp_port(network.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2Fn8Y%3D","line":873,"updated":"2014-04-11 16:14:21.000000000","message":"I\u0027ve recently done some work to remove the need for this check before unplug.  It isn\u0027t necessary anymore.  It runs an extra command under rootwrap that slows things down.\n\nSee:  https://review.openstack.org/#/c/67475/","commit_id":"b6b33fb5623d8bbece64491d975026271c386866"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"83486ffc7468f41d615e33aef8eb3ddb7be2d149","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        \"\"\"Destroy the device used for the network\u0027s DHCP on this host.\"\"\""},{"line_number":871,"context_line":"        if (ip_lib.device_exists(device_name,"},{"line_number":872,"context_line":"                                 self.root_helper,"},{"line_number":873,"context_line":"                                 network.namespace)):"},{"line_number":874,"context_line":"            self.driver.unplug(device_name, namespace\u003dnetwork.namespace)"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"        self.plugin.release_dhcp_port(network.id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAXH%2F%2F%2Fak%3D","line":873,"in_reply_to":"AAAAW3%2F%2Fn8Y%3D","updated":"2014-04-16 01:59:23.000000000","message":"Reverted back the changes in destroy.","commit_id":"b6b33fb5623d8bbece64491d975026271c386866"}],"neutron/tests/unit/test_dhcp_agent.py":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"0cc98f496b5e7f108290aa42b6c105535be097c5","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"            plugin.assert_has_calls("},{"line_number":1268,"context_line":"                [mock.call.release_dhcp_port(fake_net.id, mock.ANY)])"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def test_destroy_false_device_exists(self):"},{"line_number":1271,"context_line":"        dhcp_port_uuid \u003d \u002711223344-5566-7788-99aabbccddeeff\u0027"},{"line_number":1272,"context_line":"        dhcp_tap_device \u003d \u0027tap\u0027 + dhcp_port_uuid[:11]"},{"line_number":1273,"context_line":"        with mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027) as dvr_cls:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FIt4%3D","line":1270,"updated":"2014-03-08 12:10:44.000000000","message":"what does the \"false\" mean here?","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"d2bf3a9aa244c83eb96ee2a93fc0fe981af8335d","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"            plugin.assert_has_calls("},{"line_number":1268,"context_line":"                [mock.call.release_dhcp_port(fake_net.id, mock.ANY)])"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def test_destroy_false_device_exists(self):"},{"line_number":1271,"context_line":"        dhcp_port_uuid \u003d \u002711223344-5566-7788-99aabbccddeeff\u0027"},{"line_number":1272,"context_line":"        dhcp_tap_device \u003d \u0027tap\u0027 + dhcp_port_uuid[:11]"},{"line_number":1273,"context_line":"        with mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027) as dvr_cls:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F%2Fvio%3D","line":1270,"in_reply_to":"AAAAVn%2F%2FIt4%3D","updated":"2014-03-14 03:31:58.000000000","message":"Maybe test_destroy_device_exists_dnsmasq_inactive is better?","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"852b59e2a97b91bc51730500e9c958329dede4d5","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"            plugin.assert_has_calls("},{"line_number":1268,"context_line":"                [mock.call.release_dhcp_port(fake_net.id, mock.ANY)])"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def test_destroy_false_device_exists(self):"},{"line_number":1271,"context_line":"        dhcp_port_uuid \u003d \u002711223344-5566-7788-99aabbccddeeff\u0027"},{"line_number":1272,"context_line":"        dhcp_tap_device \u003d \u0027tap\u0027 + dhcp_port_uuid[:11]"},{"line_number":1273,"context_line":"        with mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027) as dvr_cls:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9YcI%3D","line":1270,"in_reply_to":"AAAAWH%2F%2Fvio%3D","updated":"2014-04-05 05:09:16.000000000","message":"With the always_unplug argument removed from DeviceManager.destroy(), this test becomes identical to test_destroy().","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"852b59e2a97b91bc51730500e9c958329dede4d5","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"            plugin.assert_has_calls("},{"line_number":1291,"context_line":"                [mock.call.release_dhcp_port(fake_net.id, mock.ANY)])"},{"line_number":1292,"context_line":""},{"line_number":1293,"context_line":"    def test_destroy_false_device_missing(self):"},{"line_number":1294,"context_line":"        dhcp_port_uuid \u003d \u002722334455-6677-8899-aabbccddeeff11\u0027"},{"line_number":1295,"context_line":"        dhcp_tap_device \u003d \u0027tap\u0027 + dhcp_port_uuid[:11]"},{"line_number":1296,"context_line":"        with mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027) as dvr_cls:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F9Ybo%3D","line":1293,"updated":"2014-04-05 05:09:16.000000000","message":"renamed to test_destroy_dnsmasq_device_missing.","commit_id":"fb340a3e189a8e3b09969838409fd87eb0c65df4"}],"neutron/tests/unit/test_linux_dhcp.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0e4ac509becb36056b047974a727ea4c747fbc5d","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                lp \u003d LocalChild(self.conf, network)"},{"line_number":491,"context_line":"                lp.device_manager \u003d mock.Mock()"},{"line_number":492,"context_line":"                lp.disable()"},{"line_number":493,"context_line":"                lp.device_manager.assert_has_calls("},{"line_number":494,"context_line":"                    [mock.call.destroy(network, \u0027tap0\u0027)])"},{"line_number":495,"context_line":"                msg \u003d log.call_args[0][0]"},{"line_number":496,"context_line":"                self.assertIn(\u0027does not exist\u0027, msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B1jI%3D","line":493,"updated":"2013-11-19 15:01:01.000000000","message":"Please use assert_called_once_with rather than assert_has_calls.\n\n  lp.device_manager.assert_called_once_with(network, \u0027tap0\u0027)","commit_id":"32d3f3847d457aa816d37cbda367d4afa20bdd76"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"f0da7bfe6255102c1d937abaeb369711f73b80f5","unresolved":false,"context_lines":[{"line_number":490,"context_line":"                lp \u003d LocalChild(self.conf, network)"},{"line_number":491,"context_line":"                lp.device_manager \u003d mock.Mock()"},{"line_number":492,"context_line":"                lp.disable()"},{"line_number":493,"context_line":"                lp.device_manager.assert_has_calls("},{"line_number":494,"context_line":"                    [mock.call.destroy(network, \u0027tap0\u0027)])"},{"line_number":495,"context_line":"                msg \u003d log.call_args[0][0]"},{"line_number":496,"context_line":"                self.assertIn(\u0027does not exist\u0027, msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2BzYE%3D","line":493,"in_reply_to":"AAAATn%2F%2B1jI%3D","updated":"2013-11-19 23:39:33.000000000","message":"Done.  Changed to lp.device_manager.destroy.assert_called_once_with(network, \u0027tap0\u0027).","commit_id":"32d3f3847d457aa816d37cbda367d4afa20bdd76"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"22fa90f287e7a9b300524a3419aa36264d9d0531","unresolved":false,"context_lines":[{"line_number":589,"context_line":""},{"line_number":590,"context_line":"        self.mock_mgr.assert_has_calls(["},{"line_number":591,"context_line":"            mock.call(self.conf, \u0027sudo\u0027, None),"},{"line_number":592,"context_line":"            mock.call().destroy(network, \u0027tap0\u0027)])"},{"line_number":593,"context_line":"        exp_args \u003d [\u0027kill\u0027, \u0027-9\u0027, 5]"},{"line_number":594,"context_line":"        self.execute.assert_called_once_with(exp_args, \u0027sudo\u0027)"},{"line_number":595,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F9Xpk%3D","line":592,"updated":"2014-04-05 05:40:46.000000000","message":"This line doesn\u0027t need to change.","commit_id":"df07ba84a4d1e4d83812afa466587566c502bdf9"}]}
