)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"119340a9a516a974583218aa5862daf8ae22a867","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Delete DVR namespaces on node after removing last VM"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After removing the last VM using a distributed router,"},{"line_number":10,"context_line":"the router\u0027s namespaces are still present on the VM host"},{"line_number":11,"context_line":"when the L3 agent should have deleted them. The problem"},{"line_number":12,"context_line":"is that the neutron API server never sent the router remove"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"baada198_32f6c45e","line":9,"updated":"2014-08-12 05:12:31.000000000","message":"I think this could be a little more specific.  From inspecting the code, it looks like you are removing a section of code that deletes the router binding from the DB but does not send notifications.  When the code that should send notification is run, it gets an exception when attempting to delete the same association because it had already been deleted.  Due to this exception, the notification is skipped.  Your fix is to remove the code that initially deletes the association but does not send notification.\n\nIs this correct?  If so, please help me out by saying this in the commit message instead of being vague.","commit_id":"feac77ee108bee9a75b8d4764c050a4fb6328382"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"95dac1fdb0b2fbdbb08975e2041a390a928a06bd","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Delete DVR namespaces on node after removing last VM"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"After removing the last VM using a distributed router,"},{"line_number":10,"context_line":"the router\u0027s namespaces are still present on the VM host"},{"line_number":11,"context_line":"when the L3 agent should have deleted them. The problem"},{"line_number":12,"context_line":"is that the neutron API server never sent the router remove"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"baada198_1902ae71","line":9,"in_reply_to":"baada198_32f6c45e","updated":"2014-08-12 16:25:01.000000000","message":"I will modify the commit text to describe what was fixed.\n\nThere are 2 problems are corrected in order to resolve this bug:\n1.) The router removed notification wasn\u0027t sent because the notifier sent the notification to the L3-agent with a bad uuid.\n2.) After fixing 1, the router notification still wasn\u0027t sent. This time the problem is that the router/L3-agent binding was being deleted twice. The first time is in the L3 dvr scheduler.  The second is in the notifier routine.  This routine errored out when it tried to delete the same binding.","commit_id":"feac77ee108bee9a75b8d4764c050a4fb6328382"}],"neutron/db/l3_dvrscheduler_db.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d45160bd7dd6a2e4c3af03f013631d9e71fde41b","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        agent \u003d self._get_agent_by_type_and_host("},{"line_number":118,"context_line":"            context, q_const.AGENT_TYPE_L3, host)"},{"line_number":119,"context_line":"        agent_id \u003d str(agent.id)"},{"line_number":120,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":121,"context_line":"            (context.session.query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":122,"context_line":"             filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":123,"context_line":"             delete(synchronize_session\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_bcf86d4b","side":"PARENT","line":120,"updated":"2014-08-07 13:47:22.000000000","message":"Can you elaborate why this is no longer necessary? I am not sure I grasp why we got rid of this delete statement.","commit_id":"d8c70257b03c9877467d9efc771750b4209d7c8c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"704beca0d2e81476d5b877bfe2bdea3772d59220","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        agent \u003d self._get_agent_by_type_and_host("},{"line_number":118,"context_line":"            context, q_const.AGENT_TYPE_L3, host)"},{"line_number":119,"context_line":"        agent_id \u003d str(agent.id)"},{"line_number":120,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":121,"context_line":"            (context.session.query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":122,"context_line":"             filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":123,"context_line":"             delete(synchronize_session\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_f56516e2","side":"PARENT","line":120,"in_reply_to":"baada198_36ee348b","updated":"2014-08-12 05:13:11.000000000","message":"This is all called in the context of a delete_port in neutron/plugins/ml2/plugin.py.  In that method, the removed_router_info dicts returned from dvr_deletens_if_no_vm are gathered up and then remove_router_from_l3_agent is called on each.  So, it appears that we\u0027re good to remove this code.","commit_id":"d8c70257b03c9877467d9efc771750b4209d7c8c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b636d4989702c1fcd099c2e70705b3d198aa823e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        agent \u003d self._get_agent_by_type_and_host("},{"line_number":118,"context_line":"            context, q_const.AGENT_TYPE_L3, host)"},{"line_number":119,"context_line":"        agent_id \u003d str(agent.id)"},{"line_number":120,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":121,"context_line":"            (context.session.query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":122,"context_line":"             filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":123,"context_line":"             delete(synchronize_session\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_36ee348b","side":"PARENT","line":120,"in_reply_to":"baada198_bcf86d4b","updated":"2014-08-08 03:38:58.000000000","message":"The deletion of the row with (agent_id, router_id) from the RouterL3AgentBinding table is also done from the L3AgentSchedulerDbMixin. remove_router_from_l3_agent() method, which also sends out the router removed notfication.  It throws the AgentNotFound exception if there is the row with (agent_id, router_id) in the table.","commit_id":"d8c70257b03c9877467d9efc771750b4209d7c8c"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"08797cc320d130c695c0aeb85f1ce8f54358eca1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            info \u003d {\u0027router_id\u0027: router_id, \u0027host\u0027: port_host,"},{"line_number":156,"context_line":"                    \u0027agent_id\u0027: str(agent.id)}"},{"line_number":157,"context_line":"            removed_router_info.append(info)"},{"line_number":158,"context_line":"            LOG.debug(\u0027Deleted router namespace %(router_id)s \u0027"},{"line_number":159,"context_line":"                      \u0027on host %(host)s\u0027, info)"},{"line_number":160,"context_line":"        return removed_router_info"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_e42aea2d","line":158,"updated":"2014-08-11 13:11:12.000000000","message":"Is this log message still accurate?","commit_id":"d149871a72adfd198ccf09a1c442819028c619bb"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"287e828495134fa515d8d4dec8ea182663d780d1","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            info \u003d {\u0027router_id\u0027: router_id, \u0027host\u0027: port_host,"},{"line_number":156,"context_line":"                    \u0027agent_id\u0027: str(agent.id)}"},{"line_number":157,"context_line":"            removed_router_info.append(info)"},{"line_number":158,"context_line":"            LOG.debug(\u0027Deleted router namespace %(router_id)s \u0027"},{"line_number":159,"context_line":"                      \u0027on host %(host)s\u0027, info)"},{"line_number":160,"context_line":"        return removed_router_info"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_5acfea27","line":158,"in_reply_to":"baada198_e42aea2d","updated":"2014-08-11 14:59:51.000000000","message":"Changed the message.","commit_id":"d149871a72adfd198ccf09a1c442819028c619bb"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"9f6951b07d01bcde440ac3a490c45100c23956db","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                    dvr_binding.update(dvr_binding)"},{"line_number":152,"context_line":"            agent \u003d self._get_agent_by_type_and_host(context,"},{"line_number":153,"context_line":"                                                     q_const.AGENT_TYPE_L3,"},{"line_number":154,"context_line":"                                                     port_host)"},{"line_number":155,"context_line":"            info \u003d {\u0027router_id\u0027: router_id, \u0027host\u0027: port_host,"},{"line_number":156,"context_line":"                    \u0027agent_id\u0027: str(agent.id)}"},{"line_number":157,"context_line":"            removed_router_info.append(info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0a4b1db3","line":154,"updated":"2014-08-12 23:14:17.000000000","message":"Where is the binding removal done now?","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"f6999f1b9ce727b8e0750542d7f8c96d150a10c2","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                    dvr_binding.update(dvr_binding)"},{"line_number":152,"context_line":"            agent \u003d self._get_agent_by_type_and_host(context,"},{"line_number":153,"context_line":"                                                     q_const.AGENT_TYPE_L3,"},{"line_number":154,"context_line":"                                                     port_host)"},{"line_number":155,"context_line":"            info \u003d {\u0027router_id\u0027: router_id, \u0027host\u0027: port_host,"},{"line_number":156,"context_line":"                    \u0027agent_id\u0027: str(agent.id)}"},{"line_number":157,"context_line":"            removed_router_info.append(info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_adedeb26","line":154,"in_reply_to":"baada198_0a4b1db3","updated":"2014-08-12 23:29:16.000000000","message":"The binding removal is done from l3plugin.remove_router_from_l3_agent (called from L1026 in neutron/plugins/ml2/plugin.py).","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d45160bd7dd6a2e4c3af03f013631d9e71fde41b","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"            l3plugin.notify_routers_updated(context, router_ids)"},{"line_number":1025,"context_line":"            for router in removed_routers:"},{"line_number":1026,"context_line":"                l3plugin.remove_router_from_l3_agent("},{"line_number":1027,"context_line":"                    context, router[\u0027agent_id\u0027], router[\u0027router_id\u0027])"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        try:"},{"line_number":1030,"context_line":"            # for both normal and DVR Interface ports, only one invocation of"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_1c31590a","line":1027,"updated":"2014-08-07 13:47:22.000000000","message":"good catch. We\u0027d want a test for this though","commit_id":"1f8b142e05a423311cb59f6909adcc3748af3867"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b636d4989702c1fcd099c2e70705b3d198aa823e","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"            l3plugin.notify_routers_updated(context, router_ids)"},{"line_number":1025,"context_line":"            for router in removed_routers:"},{"line_number":1026,"context_line":"                l3plugin.remove_router_from_l3_agent("},{"line_number":1027,"context_line":"                    context, router[\u0027agent_id\u0027], router[\u0027router_id\u0027])"},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        try:"},{"line_number":1030,"context_line":"            # for both normal and DVR Interface ports, only one invocation of"}],"source_content_type":"text/x-python","patch_set":1,"id":"baada198_75c41160","line":1027,"in_reply_to":"baada198_1c31590a","updated":"2014-08-08 03:38:58.000000000","message":"will be done.","commit_id":"1f8b142e05a423311cb59f6909adcc3748af3867"}],"neutron/tests/unit/ml2/test_ml2_plugin.py":[{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"5d3d4b778ce6e6cdb35f577ed5543476c06fd8a5","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    _plugin_name \u003d PLUGIN_NAME"},{"line_number":56,"context_line":"    _mechanism_drivers \u003d [\u0027logger\u0027, \u0027test\u0027]"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def setUp(self, l3_plugin\u003dL3_PLUGIN_NAME):"},{"line_number":59,"context_line":"        # We need a L3 service plugin"},{"line_number":60,"context_line":"        service_plugins \u003d {\u0027l3_plugin_name\u0027: l3_plugin}"},{"line_number":61,"context_line":"        # Enable the test mechanism driver to ensure that"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_3c306e54","line":58,"updated":"2014-08-11 17:17:23.000000000","message":"The l3_plugin argument is not needed.  Use the procedure as _mechanism_drivers to pass in the L3 plugin name.","commit_id":"d832e671c60a02d8cd909b6f07844548dc218375"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bed38d5fdc75e61e8138a73307abbabc355b85aa","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class TestMl2DvrPortsV2(TestMl2PortsV2):"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _l3_plugin \u003d (\u0027neutron.tests.unit.test_l3_plugin.\u0027"},{"line_number":179,"context_line":"                  \u0027TestL3NatAgentDvrSchedulingServicePlugin\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_delete_last_vm_port(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_318dad7e","line":178,"updated":"2014-08-13 04:00:30.000000000","message":"nit: another approach to mocking out the L3 plugin could be the one used here;\n\nhttps://github.com/openstack/neutron/blob/master/neutron/tests/unit/ml2/test_rpcapi.py#L38\n\nThis way you don\u0027t need changes to test_l3_plugin.py at all.","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"34ab99a9c673a9d75a0a22ac91c3aeb2fcda89b7","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class TestMl2DvrPortsV2(TestMl2PortsV2):"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _l3_plugin \u003d (\u0027neutron.tests.unit.test_l3_plugin.\u0027"},{"line_number":179,"context_line":"                  \u0027TestL3NatAgentDvrSchedulingServicePlugin\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_delete_last_vm_port(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ab29df4_9ada29e8","line":178,"in_reply_to":"baada198_0cff996a","updated":"2014-08-13 19:16:50.000000000","message":"Done","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2b8b833b125f035d590c8dd006ea23cf04f9dc43","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class TestMl2DvrPortsV2(TestMl2PortsV2):"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _l3_plugin \u003d (\u0027neutron.tests.unit.test_l3_plugin.\u0027"},{"line_number":179,"context_line":"                  \u0027TestL3NatAgentDvrSchedulingServicePlugin\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_delete_last_vm_port(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0cff996a","line":178,"in_reply_to":"baada198_318dad7e","updated":"2014-08-13 15:01:03.000000000","message":"I slept on it and I changed my mind, I\u0027d really like you to clean this up :)","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bed38d5fdc75e61e8138a73307abbabc355b85aa","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                  \u0027TestL3NatAgentDvrSchedulingServicePlugin\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_delete_last_vm_port(self):"},{"line_number":182,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":183,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":184,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":185,"context_line":"            service_constants.L3_ROUTER_NAT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_11d7c951","line":182,"updated":"2014-08-13 04:00:30.000000000","message":"might make these class members","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"34ab99a9c673a9d75a0a22ac91c3aeb2fcda89b7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                  \u0027TestL3NatAgentDvrSchedulingServicePlugin\u0027)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def test_delete_last_vm_port(self):"},{"line_number":182,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":183,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":184,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":185,"context_line":"            service_constants.L3_ROUTER_NAT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_afc85f4e","line":182,"in_reply_to":"baada198_11d7c951","updated":"2014-08-13 19:16:50.000000000","message":"It turns out parent class Ml2PluginV2TestCase has context.get_admin_context() saved as self.context.  Will use self.context instead.","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"418968ad4560649ef940a12b3da5e2f2e4876ace","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                          ns_to_delete[\u0027router_id\u0027])"},{"line_number":203,"context_line":"            ])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def delete_last_vm_port_with_floatingip(self):"},{"line_number":206,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":207,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":208,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("}],"source_content_type":"text/x-python","patch_set":5,"id":"9ab29df4_1dd0d352","line":205,"updated":"2014-08-13 19:30:10.000000000","message":"Found out that this function isn\u0027t being run.  Test function names needs to begin with \u0027test_\u0027. Otherwise, the test infrastructure won\u0027t run it.","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"26ea79d0b5741cf86d14046b7093e4213077f051","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                          ns_to_delete[\u0027router_id\u0027])"},{"line_number":203,"context_line":"            ])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def delete_last_vm_port_with_floatingip(self):"},{"line_number":206,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":207,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":208,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("}],"source_content_type":"text/x-python","patch_set":5,"id":"9ab29df4_a088a0c7","line":205,"in_reply_to":"9ab29df4_1dd0d352","updated":"2014-08-13 20:05:52.000000000","message":"correct!","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bed38d5fdc75e61e8138a73307abbabc355b85aa","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            ])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def delete_last_vm_port_with_floatingip(self):"},{"line_number":206,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":207,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":208,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":209,"context_line":"            service_constants.L3_ROUTER_NAT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_31d4cd4a","line":206,"updated":"2014-08-13 04:00:30.000000000","message":"ditto","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"34ab99a9c673a9d75a0a22ac91c3aeb2fcda89b7","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            ])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def delete_last_vm_port_with_floatingip(self):"},{"line_number":206,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":207,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":208,"context_line":"        l3plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":209,"context_line":"            service_constants.L3_ROUTER_NAT)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_cfd593e7","line":206,"in_reply_to":"baada198_31d4cd4a","updated":"2014-08-13 19:16:50.000000000","message":"Done","commit_id":"d2f0b26c1cc29672e52eabbad506dd7c6ef0907c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b41b2f30ba344fe80f416b5981f977d283fc8180","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"class TestMl2DvrPortsV2(TestMl2PortsV2):"},{"line_number":179,"context_line":"    def _setup_l3_plugin(self):"},{"line_number":180,"context_line":"        extensions \u003d [\u0027router\u0027,"},{"line_number":181,"context_line":"                      constants.L3_AGENT_SCHEDULER_EXT_ALIAS,"},{"line_number":182,"context_line":"                      constants.L3_DISTRIBUTED_EXT_ALIAS]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_0befadb1","line":179,"updated":"2014-08-13 20:30:55.000000000","message":"have you considered doing this in setUp() and setting the l3plugin as a class member? That would save you the call in each test case.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b42df4e8582ef903f5d16fb4ac8c75e330408403","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"class TestMl2DvrPortsV2(TestMl2PortsV2):"},{"line_number":179,"context_line":"    def _setup_l3_plugin(self):"},{"line_number":180,"context_line":"        extensions \u003d [\u0027router\u0027,"},{"line_number":181,"context_line":"                      constants.L3_AGENT_SCHEDULER_EXT_ALIAS,"},{"line_number":182,"context_line":"                      constants.L3_DISTRIBUTED_EXT_ALIAS]"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_4617dca3","line":179,"in_reply_to":"9ab29df4_0befadb1","updated":"2014-08-13 21:09:37.000000000","message":"Good point!.  will fix.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b41b2f30ba344fe80f416b5981f977d283fc8180","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        extensions \u003d [\u0027router\u0027,"},{"line_number":181,"context_line":"                      constants.L3_AGENT_SCHEDULER_EXT_ALIAS,"},{"line_number":182,"context_line":"                      constants.L3_DISTRIBUTED_EXT_ALIAS]"},{"line_number":183,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":184,"context_line":"        mock_l3plugin \u003d mock.Mock()"},{"line_number":185,"context_line":"        type(mock_l3plugin).supported_extension_aliases \u003d ("},{"line_number":186,"context_line":"            mock.PropertyMock(return_value\u003dextensions))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_6b0ca995","line":183,"updated":"2014-08-13 20:30:55.000000000","message":"this doesn\u0027t look to be used.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b42df4e8582ef903f5d16fb4ac8c75e330408403","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                      constants.L3_AGENT_SCHEDULER_EXT_ALIAS,"},{"line_number":182,"context_line":"                      constants.L3_DISTRIBUTED_EXT_ALIAS]"},{"line_number":183,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":184,"context_line":"        mock_l3plugin \u003d mock.Mock()"},{"line_number":185,"context_line":"        type(mock_l3plugin).supported_extension_aliases \u003d ("},{"line_number":186,"context_line":"            mock.PropertyMock(return_value\u003dextensions))"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_061de4bd","line":184,"updated":"2014-08-13 21:09:37.000000000","message":"The \u0027mock_l3plugin\u0027 can be an member of this class also.  So does \u0027plugin\u0027.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b41b2f30ba344fe80f416b5981f977d283fc8180","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return mock_l3plugin"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def test_delete_last_vm_port(self):"},{"line_number":191,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        fip_set \u003d set()"},{"line_number":194,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_eb48b9ce","line":191,"updated":"2014-08-13 20:30:55.000000000","message":"this doesn\u0027t look to be used.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"66aa9af41e7e6779d6b107021f8b922da9c0376c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return mock_l3plugin"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def test_delete_last_vm_port(self):"},{"line_number":191,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        fip_set \u003d set()"},{"line_number":194,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac7a964_f68c2082","line":191,"in_reply_to":"9ab29df4_26602835","updated":"2014-08-13 21:20:04.000000000","message":"oops brainfart ;)","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b42df4e8582ef903f5d16fb4ac8c75e330408403","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        return mock_l3plugin"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def test_delete_last_vm_port(self):"},{"line_number":191,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        fip_set \u003d set()"},{"line_number":194,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_26602835","line":191,"in_reply_to":"9ab29df4_eb48b9ce","updated":"2014-08-13 21:09:37.000000000","message":"Yes plugin it is used in L214.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b42df4e8582ef903f5d16fb4ac8c75e330408403","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"},{"line_number":195,"context_line":"                        \u0027router_id\u0027: \u0027my_router\u0027}"},{"line_number":196,"context_line":"        l3plugin \u003d self._setup_l3_plugin()"},{"line_number":197,"context_line":"        service_plugins \u003d {\u0027L3_ROUTER_NAT\u0027: l3plugin}"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"        with contextlib.nested("},{"line_number":200,"context_line":"            mock.patch.object(manager.NeutronManager,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_a601983b","line":197,"updated":"2014-08-13 21:09:37.000000000","message":"Plugin, l3plugin, and service_plugins can be made into members of this class.  And their values can be initialized in a setUp function.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b41b2f30ba344fe80f416b5981f977d283fc8180","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            ])"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_delete_last_vm_port_with_floatingip(self):"},{"line_number":223,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"},{"line_number":226,"context_line":"                        \u0027router_id\u0027: \u0027my_router\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_8b11fdae","line":223,"updated":"2014-08-13 20:30:55.000000000","message":"this doesn\u0027t look to be used","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"66aa9af41e7e6779d6b107021f8b922da9c0376c","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            ])"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_delete_last_vm_port_with_floatingip(self):"},{"line_number":223,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"},{"line_number":226,"context_line":"                        \u0027router_id\u0027: \u0027my_router\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"7ac7a964_16e99c1a","line":223,"in_reply_to":"9ab29df4_064b24b1","updated":"2014-08-13 21:20:04.000000000","message":"ditto","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"},{"author":{"_account_id":6876,"name":"stephen-ma","email":"stephenbma43@gmail.com","username":"stephen-ma"},"change_message_id":"b42df4e8582ef903f5d16fb4ac8c75e330408403","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            ])"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def test_delete_last_vm_port_with_floatingip(self):"},{"line_number":223,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        ns_to_delete \u003d {\u0027host\u0027: \u0027vmhost\u0027, \u0027agent_id\u0027: \u0027vm_l3_agent\u0027,"},{"line_number":226,"context_line":"                        \u0027router_id\u0027: \u0027my_router\u0027}"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ab29df4_064b24b1","line":223,"in_reply_to":"9ab29df4_8b11fdae","updated":"2014-08-13 21:09:37.000000000","message":"This is used in L246.","commit_id":"be3cf0e37ecfba7aef01e2461a1dcd7b319e7c63"}]}
