def test__ensure_local_port_no_neutron_port(self, fake_import, fake_uuid,
                                                fake_ip_lib, fake_socket):
        fake_socket.gethostname.return_value = 'foo_hostname'
        fake_ip_lib.device_exists.return_value = True
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_created_port = {'port': fakes.fake_port().to_dict()}
        fake_client = mock.Mock(
            list_ports=mock.Mock(return_value={'ports': []}),
            create_port=mock.Mock(return_value=fake_created_port))
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id', 'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64', 'service')

        exp_port_create_dict = {
            'port': {
                'admin_state_up': True,
                'binding:host_id': 'foo_hostname',
                'device_id': 'fake_host_id',
                'device_owner': 'network:router_interface',
                'fixed_ips': [{
                    'subnet_id': 'fake_subnet_id'
                }],
                'name': 'ASTARA:RUG:SERVICE',
                'network_id': 'fake_network_id'
            }
        }
        fake_client.create_port.assert_called_with(exp_port_create_dict)
        self.fake_interface_driver.init_l3.assert_called_with(
            'fake_dev', ['fdca:3ba5:a17a:acda:f816:3eff:fe2b:ced0/64'])
    def test__ensure_local_port_neutron_port_exists(self, fake_import,
                                                    fake_uuid, fake_ip_lib):
        fake_ip_lib.device_exists.return_value = True
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_port = fakes.fake_port()
        fake_port_dict = {
            'ports': [fake_port._neutron_port_dict],
        }
        fake_client = mock.Mock(list_ports=mock.Mock(
            return_value=fake_port_dict))
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id', 'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64', 'service')

        exp_query = {
            'network_id': 'fake_network_id',
            'device_owner': 'network:astara',
            'name': 'ASTARA:RUG:SERVICE',
            'device_id': 'fake_host_id'
        }
        fake_client.list_ports.assert_called_with(**exp_query)
        self.fake_interface_driver.init_l3.assert_called_with(
            'fake_dev', ['fdca:3ba5:a17a:acda:f816:3eff:fe2b:ced0/64'])
    def test__ensure_local_port_plug(self, fake_import,
                                     fake_uuid, fake_ip_lib, fake_sleep):
        fake_ip_lib.device_exists.return_value = False
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_port = fakes.fake_port()
        fake_port_dict = {
            'ports': [fake_port._neutron_port_dict],
        }
        fake_client = mock.Mock(
            list_ports=mock.Mock(return_value=fake_port_dict)
        )
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id',
            'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64',
            'service')

        self.fake_interface_driver.plug.assert_called_with(
            'fake_network_id',
            fake_port.id,
            'fake_dev',
            fake_port.mac_address)
    def test__ensure_local_port_no_neutron_port(self, fake_import, fake_uuid,
                                                fake_ip_lib, fake_socket):
        fake_socket.gethostname.return_value = 'foo_hostname'
        fake_ip_lib.device_exists.return_value = True
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_created_port = {'port': fakes.fake_port().to_dict()}
        fake_client = mock.Mock(
            list_ports=mock.Mock(return_value={'ports': []}),
            create_port=mock.Mock(return_value=fake_created_port))
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id',
            'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64',
            'service')

        exp_port_create_dict = {'port': {
            'admin_state_up': True,
            'binding:host_id': 'foo_hostname',
            'device_id': 'fake_host_id',
            'device_owner': 'network:router_interface',
            'fixed_ips': [{'subnet_id': 'fake_subnet_id'}],
            'name': 'ASTARA:RUG:SERVICE',
            'network_id': 'fake_network_id'
        }}
        fake_client.create_port.assert_called_with(exp_port_create_dict)
        self.fake_interface_driver.init_l3.assert_called_with(
            'fake_dev', ['fdca:3ba5:a17a:acda:f816:3eff:fe2b:ced0/64']
        )
    def test__ensure_local_port_neutron_port_exists(self, fake_import,
                                                    fake_uuid, fake_ip_lib):
        fake_ip_lib.device_exists.return_value = True
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_port = fakes.fake_port()
        fake_port_dict = {
            'ports': [fake_port._neutron_port_dict],
        }
        fake_client = mock.Mock(
            list_ports=mock.Mock(return_value=fake_port_dict)
        )
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id',
            'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64',
            'service')

        exp_query = {
            'network_id': 'fake_network_id',
            'device_owner': 'network:astara',
            'name': 'ASTARA:RUG:SERVICE',
            'device_id': 'fake_host_id'
        }
        fake_client.list_ports.assert_called_with(**exp_query)
        self.fake_interface_driver.init_l3.assert_called_with(
            'fake_dev', ['fdca:3ba5:a17a:acda:f816:3eff:fe2b:ced0/64']
        )
    def test__ensure_local_port_plug(self, fake_import, fake_uuid, fake_ip_lib,
                                     fake_sleep):
        fake_ip_lib.device_exists.return_value = False
        fake_uuid.uuid5.return_value = 'fake_host_id'
        fake_import.import_object.return_value = self.fake_interface_driver

        fake_port = fakes.fake_port()
        fake_port_dict = {
            'ports': [fake_port._neutron_port_dict],
        }
        fake_client = mock.Mock(list_ports=mock.Mock(
            return_value=fake_port_dict))
        self.neutron_wrapper.api_client = fake_client
        self.fake_interface_driver.get_device_name.return_value = 'fake_dev'

        self.neutron_wrapper._ensure_local_port(
            'fake_network_id', 'fake_subnet_id',
            'fdca:3ba5:a17a:acda:f816:3eff:fe2b::1/64', 'service')

        self.fake_interface_driver.plug.assert_called_with(
            'fake_network_id', fake_port.id, 'fake_dev', fake_port.mac_address)