def test_process_router_2_rids_1_vrf(self):
        driver = self._mock_driver_and_hosting_device(self.routing_helper)
        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with some different IDs
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = copy.deepcopy(h_info1)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        driver._get_vrf_name = mock.Mock(
            return_value=ri1.router['hosting_info']['vrf_id'])
        self.routing_helper._process_router(ri1)

        vrf = ri1.router['hosting_info']['vrf_id']
        driver._get_vrf_name.assert_called_with(ri1)
        driver._do_create_vrf.assert_called_with(vrf)
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf[vrf]))

        driver._get_vrf_name.reset_mock()
        driver._do_create_vrf.reset_mock()

        self.routing_helper._process_router(ri2)

        driver._get_vrf_name.assert_called_with(ri2)
        driver._do_create_vrf.assert_not_called()
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(2, len(self.routing_helper._router_ids_by_vrf[vrf]))

        del ri1.router['gw_port']
        driver._get_vrf_name.reset_mock()

        self.routing_helper._process_router(ri1)
        driver._get_vrf_name.assert_called_with(ri1)
        driver._remove_vrf.assert_not_called()
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf[vrf]))

        del ri2.router['gw_port']
        driver._get_vrf_name.reset_mock()
        driver._remove_vrf.reset_mock()
        self.routing_helper._process_router(ri2)
        driver._get_vrf_name.assert_called_with(ri2)
        driver._remove_vrf.assert_called_with(ri2)
        self.assertEqual({}, self.routing_helper._router_ids_by_vrf)
    def test_process_router_2_rids_1_vrf(self):
        driver = self._mock_driver_and_hosting_device(self.routing_helper)
        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with some different IDs
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = copy.deepcopy(h_info1)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        driver._get_vrf_name = mock.Mock(
            return_value=ri1.router['hosting_info']['vrf_id'])
        self.routing_helper._process_router(ri1)

        vrf = ri1.router['hosting_info']['vrf_id']
        driver._get_vrf_name.assert_called_with(ri1)
        driver._do_create_vrf.assert_called_with(vrf)
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf[vrf]))

        driver._get_vrf_name.reset_mock()
        driver._do_create_vrf.reset_mock()

        self.routing_helper._process_router(ri2)

        driver._get_vrf_name.assert_called_with(ri2)
        driver._do_create_vrf.assert_not_called()
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(2, len(self.routing_helper._router_ids_by_vrf[vrf]))

        del ri1.router['gw_port']
        driver._get_vrf_name.reset_mock()

        self.routing_helper._process_router(ri1)
        driver._get_vrf_name.assert_called_with(ri1)
        driver._remove_vrf.assert_not_called()
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf))
        self.assertEqual(1, len(self.routing_helper._router_ids_by_vrf[vrf]))

        del ri2.router['gw_port']
        driver._get_vrf_name.reset_mock()
        driver._remove_vrf.reset_mock()
        self.routing_helper._process_router(ri2)
        driver._get_vrf_name.assert_called_with(ri2)
        driver._remove_vrf.assert_called_with(ri2)
        self.assertEqual({}, self.routing_helper._router_ids_by_vrf)
    def test_process_router_2_rids_2_vrfs_2_networks(self):
        driver = _mock_driver_and_hosting_device(self.routing_helper)
        self._set_driver_port_mocks(driver)

        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with different IDs and host info
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = create_hosting_info(net_name=TEST_NET2,
            vlan=TEST_VLAN2, gw_ip=TEST_GW_IP2, cidr=TEST_CIDR2)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        ex_gw_port1 = ri1.router.get('gw_port')
        ex_gw_port2 = ri2.router.get('gw_port')
        ex_gw_port1['hosting_info'] = h_info1
        ex_gw_port2['hosting_info'] = h_info2
        vrf1 = ri1.router['hosting_info']['vrf_id']
        vrf2 = ri2.router['hosting_info']['vrf_id']
        network_name1 = h_info1['network_name']
        network_name2 = h_info2['network_name']
        driver._get_vrf_name = mock.Mock(return_value=vrf1)
        self.routing_helper._process_router(ri1)

        driver.internal_network_added.assert_called_with(
            ri1, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1)

        v_n_r_dict = self.routing_helper._router_ids_by_vrf_and_ext_net
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf1]))
        self.assertEqual(1, len(v_n_r_dict[vrf1][network_name1]))

        driver.internal_network_added.reset_mock()
        driver.enable_internal_network_NAT.reset_mock()
        driver._get_vrf_name = mock.Mock(return_value=vrf2)

        self.routing_helper._process_router(ri2)
        driver.internal_network_added.assert_called_with(
            ri2, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2)
        self.assertEqual(2, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf1]))
        self.assertEqual(1, len(v_n_r_dict[vrf2]))
        self.assertEqual(1, len(v_n_r_dict[vrf1][network_name1]))
        self.assertEqual(1, len(v_n_r_dict[vrf2][network_name2]))

        del ri1.router[l3_constants.INTERFACE_KEY]
        driver._get_vrf_name = mock.Mock(return_value=vrf1)
        self.routing_helper._process_router(ri1)

        driver.internal_network_removed.assert_called_with(
            ri1, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1, itfc_deleted=True)
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf2]))
        self.assertFalse(v_n_r_dict.get(vrf1))
        self.assertEqual(1, len(v_n_r_dict[vrf2][network_name2]))

        driver.internal_network_removed.reset_mock()
        driver.disable_internal_network_NAT.reset_mock()

        del ri2.router[l3_constants.INTERFACE_KEY]
        driver._get_vrf_name = mock.Mock(return_value=vrf2)
        self.routing_helper._process_router(ri2)

        driver.internal_network_removed.assert_called_with(
            ri2, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2, itfc_deleted=True)
        self.assertEqual({}, v_n_r_dict)
    def test_process_router_2_rids_1_vrf_1_network(self):
        driver = _mock_driver_and_hosting_device(self.routing_helper)
        self._set_driver_port_mocks(driver)

        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with some different IDs
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = copy.deepcopy(h_info1)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        ex_gw_port1 = ri1.router.get('gw_port')
        ex_gw_port2 = ri2.router.get('gw_port')
        ex_gw_port1['hosting_info'] = h_info1
        ex_gw_port2['hosting_info'] = h_info2
        vrf = ri1.router['hosting_info']['vrf_id']
        driver._get_vrf_name = mock.Mock(return_value=vrf)
        self.routing_helper._process_router(ri1)

        driver.internal_network_added.assert_called_with(
            ri1, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1)

        v_n_r_dict = self.routing_helper._router_ids_by_vrf_and_ext_net
        network_name = h_info1['network_name']
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(1, len(v_n_r_dict[vrf][network_name]))

        driver.internal_network_added.reset_mock()
        driver.enable_internal_network_NAT.reset_mock()

        self.routing_helper._process_router(ri2)
        driver.internal_network_added.assert_called_with(
            ri2, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2)
        network_name = h_info1['network_name']
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(2, len(v_n_r_dict[vrf][network_name]))

        del ri1.router[l3_constants.INTERFACE_KEY]
        self.routing_helper._process_router(ri1)

        driver.internal_network_removed.assert_called_with(
            ri1, ports[0], itfc_deleted=False)
        driver.disable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1, itfc_deleted=False)
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(1, len(v_n_r_dict[vrf][network_name]))

        driver.internal_network_removed.reset_mock()
        driver.disable_internal_network_NAT.reset_mock()

        del ri2.router[l3_constants.INTERFACE_KEY]
        self.routing_helper._process_router(ri2)

        driver.internal_network_removed.assert_called_with(
            ri2, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2, itfc_deleted=True)
        self.assertEqual({}, v_n_r_dict)
    def test_process_router_2_rids_2_vrfs_2_networks(self):
        driver = _mock_driver_and_hosting_device(self.routing_helper)
        self._set_driver_port_mocks(driver)

        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with different IDs and host info
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = create_hosting_info(net_name=TEST_NET2,
            vlan=TEST_VLAN2, gw_ip=TEST_GW_IP2, cidr=TEST_CIDR2)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        ex_gw_port1 = ri1.router.get('gw_port')
        ex_gw_port2 = ri2.router.get('gw_port')
        ex_gw_port1['hosting_info'] = h_info1
        ex_gw_port2['hosting_info'] = h_info2
        vrf1 = ri1.router['hosting_info']['vrf_id']
        vrf2 = ri2.router['hosting_info']['vrf_id']
        network_name1 = h_info1['network_name']
        network_name2 = h_info2['network_name']
        driver._get_vrf_name = mock.Mock(return_value=vrf1)
        self.routing_helper._process_router(ri1)

        driver.internal_network_added.assert_called_with(
            ri1, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1)

        v_n_r_dict = self.routing_helper._router_ids_by_vrf_and_ext_net
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf1]))
        self.assertEqual(1, len(v_n_r_dict[vrf1][network_name1]))

        driver.internal_network_added.reset_mock()
        driver.enable_internal_network_NAT.reset_mock()
        driver._get_vrf_name = mock.Mock(return_value=vrf2)

        self.routing_helper._process_router(ri2)
        driver.internal_network_added.assert_called_with(
            ri2, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2)
        self.assertEqual(2, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf1]))
        self.assertEqual(1, len(v_n_r_dict[vrf2]))
        self.assertEqual(1, len(v_n_r_dict[vrf1][network_name1]))
        self.assertEqual(1, len(v_n_r_dict[vrf2][network_name2]))

        del ri1.router[bc.constants.INTERFACE_KEY]
        driver._get_vrf_name = mock.Mock(return_value=vrf1)
        self.routing_helper._process_router(ri1)

        driver.internal_network_removed.assert_called_with(
            ri1, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1, itfc_deleted=True)
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf2]))
        self.assertFalse(v_n_r_dict.get(vrf1))
        self.assertEqual(1, len(v_n_r_dict[vrf2][network_name2]))

        driver.internal_network_removed.reset_mock()
        driver.disable_internal_network_NAT.reset_mock()

        del ri2.router[bc.constants.INTERFACE_KEY]
        driver._get_vrf_name = mock.Mock(return_value=vrf2)
        self.routing_helper._process_router(ri2)

        driver.internal_network_removed.assert_called_with(
            ri2, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2, itfc_deleted=True)
        self.assertEqual({}, v_n_r_dict)
    def test_process_router_2_rids_1_vrf_1_network(self):
        driver = _mock_driver_and_hosting_device(self.routing_helper)
        self._set_driver_port_mocks(driver)

        router1, ports = helper.prepare_router_data()
        ri1 = svc_helper.RouterInfo(router1['id'], router=router1)

        # Router #2 is like #1, except with some different IDs
        router2 = copy.deepcopy(router1)
        router2['id'] = _uuid()
        ri2 = svc_helper.RouterInfo(router2['id'], router=router2)
        h_info1 = create_hosting_info()
        h_info2 = copy.deepcopy(h_info1)
        ri1.router['hosting_info'] = h_info1
        ri2.router['hosting_info'] = h_info2

        ex_gw_port1 = ri1.router.get('gw_port')
        ex_gw_port2 = ri2.router.get('gw_port')
        ex_gw_port1['hosting_info'] = h_info1
        ex_gw_port2['hosting_info'] = h_info2
        vrf = ri1.router['hosting_info']['vrf_id']
        driver._get_vrf_name = mock.Mock(return_value=vrf)
        self.routing_helper._process_router(ri1)

        driver.internal_network_added.assert_called_with(
            ri1, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1)

        v_n_r_dict = self.routing_helper._router_ids_by_vrf_and_ext_net
        network_name = h_info1['network_name']
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(1, len(v_n_r_dict[vrf][network_name]))

        driver.internal_network_added.reset_mock()
        driver.enable_internal_network_NAT.reset_mock()

        self.routing_helper._process_router(ri2)
        driver.internal_network_added.assert_called_with(
            ri2, ports[0])
        driver.enable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2)
        network_name = h_info1['network_name']
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(2, len(v_n_r_dict[vrf][network_name]))

        del ri1.router[bc.constants.INTERFACE_KEY]
        self.routing_helper._process_router(ri1)

        driver.internal_network_removed.assert_called_with(
            ri1, ports[0], itfc_deleted=False)
        driver.disable_internal_network_NAT.assert_called_with(
            ri1, ports[0], ex_gw_port1, itfc_deleted=False)
        self.assertEqual(1, len(v_n_r_dict))
        self.assertEqual(1, len(v_n_r_dict[vrf]))
        self.assertEqual(1, len(v_n_r_dict[vrf][network_name]))

        driver.internal_network_removed.reset_mock()
        driver.disable_internal_network_NAT.reset_mock()

        del ri2.router[bc.constants.INTERFACE_KEY]
        self.routing_helper._process_router(ri2)

        driver.internal_network_removed.assert_called_with(
            ri2, ports[0], itfc_deleted=True)
        driver.disable_internal_network_NAT.assert_called_with(
            ri2, ports[0], ex_gw_port2, itfc_deleted=True)
        self.assertEqual({}, v_n_r_dict)