NFP - Orchestration driver

Orchestration driver is responsible to Create, Delete
Service vm. Driver gets imported in device_orchestrator module.

Change-Id: Ib7ebd58e5b8db0d43d31ac75fbce0900bed1c3bb
Implements: blueprint gbp-network-services-framework
Co-Authored-By: ashutosh mishra <mca.ashu4@gmail.com>
Co-Authored-By: Yogesh Rajmane <yogesh.rajmane@oneconvergence.com>
Co-Authored-By: Akash Deep <akash.deep@oneconvergence.com>
This commit is contained in:
rajendramachani
2016-03-28 21:56:31 +05:30
committed by ashutosh mishra
parent d7926a42a4
commit 64936ab6ae
4 changed files with 1469 additions and 2 deletions

View File

@@ -0,0 +1,388 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import mock
from mock import patch
import unittest
from oslo_config import cfg
from gbpservice.nfp.common import exceptions
from gbpservice.nfp.orchestrator.drivers import (
orchestration_driver
)
import uuid as pyuuid
cfg.CONF.import_group('keystone_authtoken', 'keystonemiddleware.auth_token')
OPENSTACK_DRIVER_CLASS_PATH = ('gbpservice.nfp.orchestrator'
'.openstack.openstack_driver')
NFP_GBP_NETWORK_DRIVER_CLASS_PATH = ('gbpservice.nfp.orchestrator'
'.coal.networking'
'.nfp_gbp_network_driver')
NFP_NEUTRON_NETWORK_DRIVER_CLASS_PATH = ('gbpservice.nfp.orchestrator'
'.coal.networking'
'.nfp_neutron_network_driver')
@patch(OPENSTACK_DRIVER_CLASS_PATH + '.KeystoneClient.__init__',
mock.MagicMock(return_value=None))
@patch(OPENSTACK_DRIVER_CLASS_PATH + '.NovaClient.__init__',
mock.MagicMock(return_value=None))
@patch(NFP_GBP_NETWORK_DRIVER_CLASS_PATH + '.NFPGBPNetworkDriver.__init__',
mock.MagicMock(return_value=None))
@patch(NFP_NEUTRON_NETWORK_DRIVER_CLASS_PATH +
'.NFPNeutronNetworkDriver.__init__',
mock.MagicMock(return_value=None))
class OrchestrationDriverTestCase(unittest.TestCase):
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_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_create_network_function_device(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=True,
max_interfaces=10)
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',
'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'))
def test_delete_network_function_device(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=True,
max_interfaces=10)
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_get_network_function_device_status(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=True,
max_interfaces=10)
# 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_plug_network_function_device_interfaces(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=False,
max_interfaces=10)
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.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'}],
'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_unplug_network_function_device_interfaces(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=False,
max_interfaces=10)
driver.network_handler = driver.network_handlers['gbp']
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.detach_interface = mock.MagicMock(
return_value=None)
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'}]}
device_data['service_details']['device_type'] = 'nova'
self.assertTrue(driver.unplug_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=10)
device_data = {'id': '1',
'mgmt_ip_address': 'a.b.c.d'}
self.assertIsInstance(
driver.get_network_function_device_healthcheck_info(device_data),
dict, msg='')
def test_get_network_function_device_config_info(self):
driver = orchestration_driver.OrchestrationDriver(
cfg.CONF,
supports_device_sharing=True,
supports_hotplug=False,
max_interfaces=10)
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_info(device_data)
self.assertIsInstance(reply, dict, msg='')
self.assertTrue('config' in reply)

View File

@@ -10,6 +10,10 @@
# License for the specific language governing permissions and limitations
# under the License.
FIREWALL = 'firewall'
LOADBALANCER = 'loadbalancer'
VPN = 'vpn'
GBP_MODE = "gbp"
NEUTRON_MODE = "neutron"
NOVA_MODE = "nova"
@@ -58,3 +62,7 @@ CONFIG_TAG_RESOURCE_MAP = {
CUSTOM_JSON: 'custom_json'}
LOADBALANCER_RPC_API_VERSION = "2.0"
HEALTHMONITOR_RESOURCE = 'healthmonitor'
INTERFACE_RESOURCE = 'interfaces'
ROUTES_RESOURCE = 'routes'
MANAGEMENT_INTERFACE_NAME = 'mgmt_interface'

File diff suppressed because it is too large Load Diff