def test_get_network_function_device_config(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=False,
            max_interfaces=8)
        driver.network_handler = driver.network_handlers['gbp']

        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.network_handler.get_port_details = mock.MagicMock(
            return_value=('a.b.c.d', 'aa:bb:cc:dd:ee:ff', 'p.q.r.s/t',
                          'w.x.y.z'))

        device_data = {
            'service_details': {
                'device_type': 'xyz',
                'service_type': 'firewall',
                'service_vendor': 'vyos',
                'network_mode': 'gbp'
            },
            'mgmt_ip_address':
            'a.b.c.d',
            'ports': [{
                'id': '3',
                'port_model': 'gbp',
                'port_classification': 'provider'
            }]
        }

        reply = driver.get_network_function_device_config(
            device_data, nfp_constants.GENERIC_CONFIG)
        self.assertIsInstance(reply, dict, msg='')
        self.assertTrue('config' in reply)
    def test_get_network_function_device_status(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=True,
            max_interfaces=8)

        # Mock the client methods
        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.identity_handler.get_tenant_id = mock.MagicMock(
            return_value='8')
        driver.identity_handler.get_keystone_creds = mock.MagicMock(
            return_value=(None, None, 'admin', None))
        driver.compute_handler_nova.get_instance = mock.MagicMock(
            return_value={'status': 'ACTIVE'})

        device_data = {'id': '1',
                       'service_details': {'device_type': 'xyz',
                                           'service_type': 'firewall',
                                           'service_vendor': 'vyos',
                                           'network_mode': 'gbp'},
                       'token': str(pyuuid.uuid4()),
                       'tenant_id': str(pyuuid.uuid4())}

        self.assertRaises(exceptions.ComputePolicyNotSupported,
                          driver.get_network_function_device_status,
                          device_data)
        device_data['service_details']['device_type'] = 'nova'

        self.assertTrue(
            driver.get_network_function_device_status(device_data) ==
            'ACTIVE')
    def test_delete_network_function_device(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=True,
            max_interfaces=8)
        driver.network_handler = driver.network_handlers['gbp']

        # Mock the client methods
        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.identity_handler.get_tenant_id = mock.MagicMock(
            return_value='8')
        driver.identity_handler.get_keystone_creds = mock.MagicMock(
            return_value=(None, None, 'admin', None))
        driver.compute_handler_nova.delete_instance = mock.MagicMock(
            return_value=None)
        driver.network_handler.delete_port = mock.MagicMock(return_value=None)

        device_data = {'id': '1',
                       'service_details': {'device_type': 'xyz',
                                           'service_type': 'firewall',
                                           'service_vendor': 'vyos',
                                           'network_mode': 'gbp'},
                       'mgmt_port_id': {'id': '3',
                                        'port_model': 'gbp',
                                        'port_classification': 'mgmt'}}
        self.assertRaises(exceptions.ComputePolicyNotSupported,
                          driver.delete_network_function_device,
                          device_data)
        device_data['service_details']['device_type'] = 'nova'
        self.assertIsNone(driver.delete_network_function_device(device_data))
    def test_plug_network_function_device_interfaces(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=False,
            max_interfaces=8)
        driver.network_handler = driver.network_handlers['gbp']
        # Mock the client methods
        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.identity_handler.get_tenant_id = mock.MagicMock(
            return_value='8')
        driver.identity_handler.get_keystone_creds = mock.MagicMock(
            return_value=(None, None, 'admin', None))
        driver.network_handler.set_promiscuos_mode = mock.MagicMock(
            return_value=None)
        driver.network_handler.set_promiscuos_mode_fast = mock.MagicMock(
            return_value=None)
        driver.compute_handler_nova.attach_interface = mock.MagicMock(
            return_value=None)
        driver.compute_handler_nova.get_image_metadata = mock.MagicMock(
            return_value={})
        driver.network_handler.get_port_id = mock.MagicMock(return_value='7')

        device_data = {
            'id':
            '1',
            'service_details': {
                'device_type': 'xyz',
                'service_type': 'firewall',
                'service_vendor': 'vyos',
                'network_mode': 'gbp'
            },
            'ports': [{
                'id': '3',
                'port_model': 'gbp',
                'port_classification': 'provider'
            }, {
                'id': '4',
                'port_model': 'neutron',
                'port_classification': 'consumer'
            }],
            'provider_metadata': {},
            'token':
            str(pyuuid.uuid4()),
            'tenant_id':
            str(pyuuid.uuid4())
        }

        device_data['service_details']['device_type'] = 'nova'

        self.assertTrue(
            driver.plug_network_function_device_interfaces(device_data),
            msg='')
    def test_get_network_function_device_healthcheck_info(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=False,
            max_interfaces=8)

        device_data = {'id': '1', 'mgmt_ip_address': 'a.b.c.d'}

        self.assertIsInstance(driver.get_network_function_device_config(
            device_data, nfp_constants.HEALTHMONITOR_RESOURCE),
                              dict,
                              msg='')
    def test_select_network_function_device(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=True,
            max_interfaces=10)
        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.compute_handler_nova.get_image_metadata = mock.MagicMock(
            return_value='metadata')
        driver.identity_handler.get_keystone_creds = mock.MagicMock(
            return_value=(_, _, 'admin_tenant_name', _))
        driver.identity_handler.get_tenant_id = mock.MagicMock(
            return_value='admin_tenant_id')
        # test to get device when max interfaces is permissible
        devices = [{
            'id': '1',
            'interfaces_in_use': 9,
            'network_functions': []
        }]
        device_data = {
            'service_details': {
                'device_type': 'xyz',
                'service_type': 'firewall',
                'service_vendor': 'vyos',
                'network_mode': 'gbp'
            },
            'ports': [{
                'id': '2',
                'port_classification': 'provider',
                'port_model': 'gbp'
            }]
        }
        self.assertIsNone(driver.select_network_function_device(
            devices, device_data),
                          msg=('Device sharing is broken with respect to'
                               ' maximum interfaces that'
                               ' the device supports'))

        # test to get device when max interfaces is not permissible
        device_data['ports'].append({
            'id': '3',
            'port_classification': 'consumer',
            'port_model': 'gbp'
        })
        self.assertIsNone(driver.select_network_function_device(
            devices, device_data),
                          msg=('Device sharing is broken with respect to'
                               ' maximum interfaces that'
                               ' the device supports'))
 def test_get_nfd_sharing_info_when_device_sharing_unsupported(self):
     driver = orchestration_driver.OrchestrationDriver(
         cfg.CONF, supports_device_sharing=False)
     device_data = {
         'tenant_id': 'tenant_id',
         'service_details': {
             'device_type': 'xyz',
             'service_type': 'firewall',
             'service_vendor': 'vyos',
             'network_mode': 'gbp'
         }
     }
     self.assertIsNone(
         driver.get_network_function_device_sharing_info(device_data))
 def test_select_network_function_device_when_device_sharing_unsupported(
         self):
     driver = orchestration_driver.OrchestrationDriver(
         cfg.CONF, supports_device_sharing=False)
     device_data = {
         'service_details': {
             'device_type': 'xyz',
             'service_type': 'firewall',
             'service_vendor': 'vyos',
             'network_mode': 'gbp'
         },
         'ports': [{
             'id': '2',
             'port_classification': 'provider',
             'port_model': 'gbp'
         }]
     }
     devices = [{'id': '1', 'interfaces_in_use': 9}]
     self.assertIsNone(
         driver.select_network_function_device(devices, device_data))
    def test_create_network_function_device(self):
        driver = orchestration_driver.OrchestrationDriver(
            cfg.CONF,
            supports_device_sharing=True,
            supports_hotplug=True,
            max_interfaces=8)
        driver.network_handler = driver.network_handlers['gbp']

        # Mock the client methods
        driver.identity_handler.get_admin_token = mock.MagicMock(
            return_value='token')
        driver.identity_handler.get_tenant_id = mock.MagicMock(
            return_value='8')
        driver.identity_handler.get_keystone_creds = mock.MagicMock(
            return_value=(None, None, 'admin', None))
        driver.network_handler.create_port = mock.MagicMock(
            return_value={
                'id': str(pyuuid.uuid4()),
                'port_id': str(pyuuid.uuid4())
            })
        driver.network_handler.set_promiscuos_mode = mock.MagicMock(
            return_value=None)
        driver.network_handler.set_promiscuos_mode_fast = mock.MagicMock(
            return_value=None)
        driver.compute_handler_nova.get_image_id = mock.MagicMock(
            return_value='6')
        driver.compute_handler_nova.get_image_metadata = mock.MagicMock(
            return_value=[])
        driver.compute_handler_nova.create_instance = mock.MagicMock(
            return_value='8')
        driver.network_handler.delete_port = mock.MagicMock(return_value=None)
        driver.network_handler.get_port_id = mock.MagicMock(return_value='7')
        driver.network_handler.get_port_details = mock.MagicMock(
            return_value=('a.b.c.d', 'aa:bb:cc:dd:ee:ff', 'p.q.r.s/t',
                          'w.x.y.z'))
        driver.network_handler.get_neutron_port_details = mock.MagicMock(
            return_value=(1, 2, 3, 4, {
                'port': {}
            }, {
                'subnet': {}
            }))

        # test for create device when interface hotplug is enabled
        device_data = {
            'service_details': {
                'device_type': 'xyz',
                'service_type': 'firewall',
                'service_vendor': 'vyos',
                'network_mode': 'gbp'
            },
            'name':
            'FIREWALL.vyos.1.2',
            'volume_support':
            None,
            'volume_size':
            None,
            'management_network_info': {
                'id': '2'
            },
            'ports': [{
                'id': '3',
                'port_model': 'gbp',
                'port_classification': 'provider'
            }, {
                'id': '4',
                'port_model': 'gbp',
                'port_classification': 'consumer'
            }],
            'token':
            str(pyuuid.uuid4()),
            'admin_tenant_id':
            str(pyuuid.uuid4())
        }
        self.assertRaises(exceptions.ComputePolicyNotSupported,
                          driver.create_network_function_device, device_data)
        device_data['service_details']['device_type'] = 'nova'
        self.assertIsInstance(
            driver.create_network_function_device(device_data),
            dict,
            msg=('Return value from the'
                 ' create_network_function_device call'
                 ' is not a dictionary'))

        # test for create device along with provider port
        driver.supports_hotplug = False
        self.assertIsInstance(
            driver.create_network_function_device(device_data),
            dict,
            msg=('Return value from the'
                 ' create_network_function_device call'
                 ' is not a dictionary'))