def setUp(self, mock_server):
     super(PluribusRouterTestCase, self).setUp()
     self.service = PluribusRouterPlugin()
     self.service.server = mock_server
     self.tenant_id = 'tenant-1'
     self.context = FakeContext()
     setattr(cfg.CONF, 'core_plugin', 'neutron.plugins.ml2.plugin.Ml2Plugin')
class PluribusRouterTestCase(base.BaseTestCase,
                             Router,
                             Subnet,
                             Network,
                             Port,
                             FloatingIP):

    """Test Case for Pluribus Router service plugin."""

    @mock.patch('oslo.utils.importutils.import_object')
    def setUp(self, mock_server):
        super(PluribusRouterTestCase, self).setUp()
        self.service = PluribusRouterPlugin()
        self.service.server = mock_server
        self.tenant_id = 'tenant-1'
        self.context = FakeContext()
        setattr(cfg.CONF, 'core_plugin', 'neutron.plugins.ml2.plugin.Ml2Plugin')

    def _get_router_dict(self):
        router = {
            'name': self.router_name,
            'gw_port_id': self.gw_port_id,
            'external_gateway_info': self.external_gateway_info
        }

        return router

    def _get_server_router_dict(self):
        router = self._get_router_dict()
        router.update(
            {
                'id': self.router_id,
                'admin_state_up': self.admin_state_up,
                'status': self.status
            }
        )

        return router

    def _get_floatingip_dict(self, fixed=False):
        self.fixed_ip_address = self.ip_address if fixed else None
        self.port_id = 'port-1' if fixed else None
        fip = {
            'floating_network_id': self.floating_net_id,
            'fixed_ip_address': self.fixed_ip_address,
            'port_id': self.port_id
        }

        return fip

    def _get_floatingip_dict_server(self, fixed=False):
        self.router_id = 'router-1' if fixed else None
        fip = self._get_floatingip_dict(fixed)
        fip['floating_ip_address'] = self.floating_ip_addr
        fip['id'] = self.floating_id
        fip['status'] = self.status
        fip['router_id'] = self.router_id

        return fip

    def _get_router_interface_dict(self):
        router_intf = {
            'subnet_id': self.subnet_id
        }

        return router_intf

    def _get_subnet_info_dict(self):
        subnet_info = {
            'allocation_pools': self.allocation_pools,
            'cidr': self.cidr,
            'id': self.subnet_id,
            'name': self.subnet_name,
            'enable_dhcp': True,
            'network_id': self.network_id,
            'tenant_id': self.tenant_id,
            'gateway_ip': self.gateway_ip,
            'ip_version': self.ip_version
        }

        return subnet_info

    def _get_port_info_dict(self):
        port_info = {
            'fixed_ips': [
                {
                    'subnet_id': self.subnet_id,
                    'ip_address': self.ip_address
                }
            ],
            'id': self.port_id,
            'name': self.port_name,
            'tenant_id': self.tenant_id,
            'network_id': self.network_id
        }

        return port_info

    def test_create_router(self):
        r = self._get_router_dict()
        r_server = self._get_server_router_dict()
        with mock.patch('neutron.db.l3_db.L3_NAT_dbonly_mixin.'
                        'create_router') as create_router:
            create_router.return_value = r_server
            self.service.create_router(self.context, {'router': r})
            self.service.server.create_router.assert_called_once_with(
                name=self.router_name,
                gw_port_id=self.gw_port_id,
                external_gateway_info=self.external_gateway_info,
                id=self.router_id,
                admin_state_up=self.admin_state_up,
                status=self.status
            )

    def test_delete_router(self):
        r = {'router_id': self.router_id}
        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'delete_router') as delete_router:
            self.service.delete_router(self.context, self.router_id)
            self.service.server.delete_router.assert_called_once_with(
                router_id=self.router_id
            )

    @mock.patch('neutron.plugins.ml2.plugin.Ml2Plugin')
    def test_add_router_interface(self, mock_ml2):
        r_intf = self._get_router_interface_dict()

        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'add_router_interface') as add_intf:
            with mock.patch('neutron.services.l3_router.l3_pluribus.PluribusRouterPlugin.core_plugin', new_callable=PropertyMock) as mock_core_plugin:
                mock_core_plugin.return_value = mock_ml2
                add_intf.return_value = r_intf
                self.service.get_subnet = mock.Mock()
                self.service.get_subnet.return_value = self._get_subnet_info_dict()
		self.service.core_plugin.create_port = mock.Mock()
                self.service.core_plugin.create_port.return_value = self._get_port_info_dict()
                self.service.get_ports = mock.Mock()
                self.service.get_ports.return_value = [self._get_port_info_dict()]
                self.service.core_plugin.update_port = mock.Mock()
                self.service.add_router_interface(self.context,
                                                  self.router_id,
                                                  r_intf)
                self.service.server.plug_router_interface.assert_called_once_with(
                    network_id=self.network_id,
                    router_id=self.router_id,
                    cidr=self.cidr,
                    subnet_id=self.subnet_id,
                    interface_ip=self.gateway_ip
                )

    def test_remove_router_interface(self):
        r_intf = self._get_router_interface_dict()

        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'remove_router_interface') as rem_intf:
            self.service.get_ports = mock.Mock()
            self.service.get_ports.return_value = [self._get_port_info_dict()]
            self.service.get_subnet = mock.Mock()
            self.service.get_subnet.return_value = self._get_subnet_info_dict()
            self.service.remove_router_interface(self.context,
                                                 self.router_id,
                                                 r_intf)
            self.service.server.unplug_router_interface.\
                assert_called_once_with(network_id=self.network_id,
                                        router_id=self.router_id,
                                        subnet_id=self.subnet_id,
                                        cidr=self.cidr)

    def test_create_floatingip(self):
        fip = self._get_floatingip_dict(fixed=False)
        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'create_floatingip') as float_ip:
            float_ip.return_value = self._get_floatingip_dict_server()
            self.service.create_floatingip(self.context, fip)
            self.service.server.create_floatingip.assert_called_once_with(
                floating_network_id=self.floating_net_id,
                fixed_ip_address=self.fixed_ip_address,
                port_id=self.port_id,
                floating_ip_address=self.floating_ip_addr,
                id=self.floating_id,
                status=self.status,
                router_id=self.router_id
            )

    def test_delete_floatingip(self):
        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'delete_floatingip') as float_ip:
            self.service.delete_floatingip(self.context, self.floating_id)
            self.service.server.delete_floatingip.assert_called_once_with(
                id=self.floating_id
            )

    def test_update_floatingip(self):
        float_data = self._get_floatingip_dict(fixed=True)
        with mock.patch('neutron.db.l3_db.L3_NAT_db_mixin.'
                        'update_floatingip') as float_ip:
            float_ip.return_value = \
                self._get_floatingip_dict_server(fixed=True)
            self.service.get_ports = mock.Mock()
            self.service.get_ports.return_value = [self._get_port_info_dict()]
            self.service.update_floatingip(
                self.context,
                self.floating_id,
                float_data
            )
            self.service.server.update_floatingip.assert_called_once_with(
                floating_network_id=self.floating_net_id,
                fixed_ip_address=self.fixed_ip_address,
                port_id=self.port_id,
                floating_ip_address=self.floating_ip_addr,
                id=self.floating_id,
                subnet_id=self.subnet_id,
                status=self.status,
                router_id=self.router_id
            )

    def _test_disassociate_floatingip(self):
        pass