)]}'
{"neutron/plugins/ml2/drivers/linuxbridge/agent/linuxbridge_neutron_agent.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4bc829a95c0273a83fd605c4113ee568e709ebb7","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                return True"},{"line_number":122,"context_line":"        return False"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_existed_bridge_name(self, physical_network):"},{"line_number":125,"context_line":"        if not physical_network:"},{"line_number":126,"context_line":"            return None"},{"line_number":127,"context_line":"        return self.bridge_mappings.get(physical_network)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_a1d9a8f6","line":124,"updated":"2015-08-13 23:58:10.000000000","message":"replace everywhere existed by existing","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"086c37b37bdb15dd2f3c85066d24184693954dc2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                return True"},{"line_number":122,"context_line":"        return False"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def get_existed_bridge_name(self, physical_network):"},{"line_number":125,"context_line":"        if not physical_network:"},{"line_number":126,"context_line":"            return None"},{"line_number":127,"context_line":"        return self.bridge_mappings.get(physical_network)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_98a68eac","line":124,"in_reply_to":"1a4dcd0f_a1d9a8f6","updated":"2015-08-21 09:43:14.000000000","message":"Done","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4bc829a95c0273a83fd605c4113ee568e709ebb7","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # NOTE(nick-ma-z): Add pre-existed user-defined bridges"},{"line_number":181,"context_line":"        for bridge_name in self.bridge_mappings.values():"},{"line_number":182,"context_line":"            if ip_lib.device_exists(bridge_name):"},{"line_number":183,"context_line":"                neutron_bridge_list.append(bridge_name)"},{"line_number":184,"context_line":"        return neutron_bridge_list"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_interfaces_on_bridge(self, bridge_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_a1520867","line":183,"updated":"2015-08-13 23:58:10.000000000","message":"you can add multiple times the same bridge_name because nothing ensure bridge_mappings values are unique.\n\nMoreover validate_bridge_mappings call in __init__ ensures all bridges in bridge_mapping exist ... except if you want to support the case where a bridge is deleted between LinuxBridgeManager instantiate and  get_all_neutron_bridges call (in such case validate_bridge_mappings call in __init__ seems useless)","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"086c37b37bdb15dd2f3c85066d24184693954dc2","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # NOTE(nick-ma-z): Add pre-existed user-defined bridges"},{"line_number":181,"context_line":"        for bridge_name in self.bridge_mappings.values():"},{"line_number":182,"context_line":"            if ip_lib.device_exists(bridge_name):"},{"line_number":183,"context_line":"                neutron_bridge_list.append(bridge_name)"},{"line_number":184,"context_line":"        return neutron_bridge_list"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_interfaces_on_bridge(self, bridge_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_ee0a601f","line":183,"in_reply_to":"1a4dcd0f_a1520867","updated":"2015-08-21 09:43:14.000000000","message":"I follow the interface_mapping way to initialize the bridge_mapping.  I tried to make sure the user-defined bridge cannot be deleted by neutron operations.","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1be061c0cadbc86b050d3fb857be1cb8c90b6b69","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # NOTE(nick-ma-z): Add pre-existed user-defined bridges"},{"line_number":181,"context_line":"        for bridge_name in self.bridge_mappings.values():"},{"line_number":182,"context_line":"            if (bridge_name not in"},{"line_number":183,"context_line":"                neutron_bridge_list) and ip_lib.device_exists("},{"line_number":184,"context_line":"               bridge_name):"},{"line_number":185,"context_line":"                neutron_bridge_list.append(bridge_name)"},{"line_number":186,"context_line":"        return neutron_bridge_list"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_3af076c9","line":183,"updated":"2015-08-21 20:11:29.000000000","message":"Why checking bridge existence? It has already been done by validate_bridge_mapping","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"f545c9dcf84e32fdbd94722df4b3f34f6b0442f5","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        # NOTE(nick-ma-z): Add pre-existed user-defined bridges"},{"line_number":181,"context_line":"        for bridge_name in self.bridge_mappings.values():"},{"line_number":182,"context_line":"            if (bridge_name not in"},{"line_number":183,"context_line":"                neutron_bridge_list) and ip_lib.device_exists("},{"line_number":184,"context_line":"               bridge_name):"},{"line_number":185,"context_line":"                neutron_bridge_list.append(bridge_name)"},{"line_number":186,"context_line":"        return neutron_bridge_list"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_d70a6879","line":183,"in_reply_to":"fa1b9901_3af076c9","updated":"2015-08-22 01:51:54.000000000","message":"Done","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1be061c0cadbc86b050d3fb857be1cb8c90b6b69","unresolved":false,"context_lines":[{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def remove_empty_bridges(self):"},{"line_number":542,"context_line":"        for network_id in list(self.network_map.keys()):"},{"line_number":543,"context_line":"            # NOTE(nick-ma-z): Don\u0027t remove pre-existed user-defined bridges"},{"line_number":544,"context_line":"            phy_net \u003d self.network_map[network_id].physical_network"},{"line_number":545,"context_line":"            if phy_net and phy_net in self.bridge_mappings:"},{"line_number":546,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_3ac3963a","line":543,"updated":"2015-08-21 20:11:29.000000000","message":"pre-existing?","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"f545c9dcf84e32fdbd94722df4b3f34f6b0442f5","unresolved":false,"context_lines":[{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def remove_empty_bridges(self):"},{"line_number":542,"context_line":"        for network_id in list(self.network_map.keys()):"},{"line_number":543,"context_line":"            # NOTE(nick-ma-z): Don\u0027t remove pre-existed user-defined bridges"},{"line_number":544,"context_line":"            phy_net \u003d self.network_map[network_id].physical_network"},{"line_number":545,"context_line":"            if phy_net and phy_net in self.bridge_mappings:"},{"line_number":546,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_571f38b7","line":543,"in_reply_to":"fa1b9901_3ac3963a","updated":"2015-08-22 01:51:54.000000000","message":"Done","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1be061c0cadbc86b050d3fb857be1cb8c90b6b69","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        LOG.debug(\"network_delete received\")"},{"line_number":741,"context_line":"        network_id \u003d kwargs.get(\u0027network_id\u0027)"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        # NOTE(nick-ma-z): Don\u0027t remove pre-existed user-defined bridges"},{"line_number":744,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":745,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":746,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_da013a6c","line":743,"updated":"2015-08-21 20:11:29.000000000","message":"itto","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"f545c9dcf84e32fdbd94722df4b3f34f6b0442f5","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        LOG.debug(\"network_delete received\")"},{"line_number":741,"context_line":"        network_id \u003d kwargs.get(\u0027network_id\u0027)"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        # NOTE(nick-ma-z): Don\u0027t remove pre-existed user-defined bridges"},{"line_number":744,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":745,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":746,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_771cbcc1","line":743,"in_reply_to":"fa1b9901_da013a6c","updated":"2015-08-22 01:51:54.000000000","message":"Done","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1be061c0cadbc86b050d3fb857be1cb8c90b6b69","unresolved":false,"context_lines":[{"line_number":744,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":745,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":746,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"},{"line_number":747,"context_line":"                LOG.warn(_LW(\"Physical network %s cannot be deleted.\"),"},{"line_number":748,"context_line":"                         network_id)"},{"line_number":749,"context_line":"                return"},{"line_number":750,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_fa299ef3","line":747,"updated":"2015-08-21 20:11:29.000000000","message":"Why logging at warning level? imo, info seems better as there is no \"warning\"?","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"f545c9dcf84e32fdbd94722df4b3f34f6b0442f5","unresolved":false,"context_lines":[{"line_number":744,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":745,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":746,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"},{"line_number":747,"context_line":"                LOG.warn(_LW(\"Physical network %s cannot be deleted.\"),"},{"line_number":748,"context_line":"                         network_id)"},{"line_number":749,"context_line":"                return"},{"line_number":750,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa1b9901_976cf037","line":747,"in_reply_to":"fa1b9901_fa299ef3","updated":"2015-08-22 01:51:54.000000000","message":"Done","commit_id":"69b398de9b24090ea8449bac3cb7a258f8a34309"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"369ac1a13c50c6114b1ce3772b2f5e573d4ba6ca","unresolved":false,"context_lines":[{"line_number":729,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":730,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":731,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"},{"line_number":732,"context_line":"                LOG.info(_LI(\"Physical network %s cannot be deleted.\"),"},{"line_number":733,"context_line":"                         network_id)"},{"line_number":734,"context_line":"                return"},{"line_number":735,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_f9e2ca00","line":732,"updated":"2015-09-02 20:04:34.000000000","message":"I would prefer this log message state why it can\u0027t be deleted.\n\n\"Physical network %s is defined in bridge_mappings and cannot be deleted\"","commit_id":"77e30160e071076144e816b0dee146c14bafd0a3"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"331813787e51180c2c993cb71caa40a678c72fee","unresolved":false,"context_lines":[{"line_number":729,"context_line":"        if network_id in self.agent.br_mgr.network_map:"},{"line_number":730,"context_line":"            phynet \u003d self.agent.br_mgr.network_map[network_id].physical_network"},{"line_number":731,"context_line":"            if phynet and phynet in self.agent.br_mgr.bridge_mappings:"},{"line_number":732,"context_line":"                LOG.info(_LI(\"Physical network %s cannot be deleted.\"),"},{"line_number":733,"context_line":"                         network_id)"},{"line_number":734,"context_line":"                return"},{"line_number":735,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da20952f_6064a8e4","line":732,"in_reply_to":"da20952f_f9e2ca00","updated":"2015-09-03 06:21:35.000000000","message":"Done","commit_id":"77e30160e071076144e816b0dee146c14bafd0a3"}],"neutron/tests/unit/plugins/ml2/drivers/linuxbridge/agent/test_linuxbridge_neutron_agent.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4bc829a95c0273a83fd605c4113ee568e709ebb7","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_get_existed_bridge_name(self):"},{"line_number":383,"context_line":"        phy_net \u003d \u0027physnet0\u0027"},{"line_number":384,"context_line":"        self.assertEqual(self.lbm.get_existed_bridge_name(phy_net),"},{"line_number":385,"context_line":"                         \u0027br-eth2\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        phy_net \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_21611812","line":384,"updated":"2015-08-13 23:58:10.000000000","message":"u should respect the pattern:\n\n self.assertEqual(expected, observed)","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"086c37b37bdb15dd2f3c85066d24184693954dc2","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    def test_get_existed_bridge_name(self):"},{"line_number":383,"context_line":"        phy_net \u003d \u0027physnet0\u0027"},{"line_number":384,"context_line":"        self.assertEqual(self.lbm.get_existed_bridge_name(phy_net),"},{"line_number":385,"context_line":"                         \u0027br-eth2\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        phy_net \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_58da3618","line":384,"in_reply_to":"1a4dcd0f_21611812","updated":"2015-08-21 09:43:14.000000000","message":"Done","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4bc829a95c0273a83fd605c4113ee568e709ebb7","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                         \u0027br-eth2\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        phy_net \u003d \u0027\u0027"},{"line_number":388,"context_line":"        self.assertEqual(self.lbm.get_existed_bridge_name(phy_net),"},{"line_number":389,"context_line":"                         None)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def test_get_bridge_name(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_61a88021","line":388,"updated":"2015-08-13 23:58:10.000000000","message":"use assertNone","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"086c37b37bdb15dd2f3c85066d24184693954dc2","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                         \u0027br-eth2\u0027)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        phy_net \u003d \u0027\u0027"},{"line_number":388,"context_line":"        self.assertEqual(self.lbm.get_existed_bridge_name(phy_net),"},{"line_number":389,"context_line":"                         None)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"    def test_get_bridge_name(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_f8ff8a63","line":388,"in_reply_to":"1a4dcd0f_61a88021","updated":"2015-08-21 09:43:14.000000000","message":"AttributeError: \u0027TestLinuxBridgeManager\u0027 object has no attribute \u0027assertNone\u0027","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"4bc829a95c0273a83fd605c4113ee568e709ebb7","unresolved":false,"context_lines":[{"line_number":523,"context_line":"    def test_ensure_flat_bridge_with_existed_brq(self):"},{"line_number":524,"context_line":"        with mock.patch.object(self.lbm, \u0027ensure_bridge\u0027) as ens:"},{"line_number":525,"context_line":"            ens.return_value \u003d \"br-eth2\""},{"line_number":526,"context_line":"            self.assertEqual(self.lbm.ensure_flat_bridge(\"123\","},{"line_number":527,"context_line":"                                                         \"br-eth2\","},{"line_number":528,"context_line":"                                                         None),"},{"line_number":529,"context_line":"                             \"br-eth2\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_bc0eab30","line":526,"updated":"2015-08-13 23:58:10.000000000","message":"itto","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"086c37b37bdb15dd2f3c85066d24184693954dc2","unresolved":false,"context_lines":[{"line_number":523,"context_line":"    def test_ensure_flat_bridge_with_existed_brq(self):"},{"line_number":524,"context_line":"        with mock.patch.object(self.lbm, \u0027ensure_bridge\u0027) as ens:"},{"line_number":525,"context_line":"            ens.return_value \u003d \"br-eth2\""},{"line_number":526,"context_line":"            self.assertEqual(self.lbm.ensure_flat_bridge(\"123\","},{"line_number":527,"context_line":"                                                         \"br-eth2\","},{"line_number":528,"context_line":"                                                         None),"},{"line_number":529,"context_line":"                             \"br-eth2\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_b824b20c","line":526,"in_reply_to":"1a4dcd0f_bc0eab30","updated":"2015-08-21 09:43:14.000000000","message":"Done","commit_id":"f9d4d203560c3d9f5940c6538e2dfb568b1d7d21"}]}
