config/sysinv/sysinv/sysinv/sysinv/tests/puppet/test_interface.py

2252 lines
105 KiB
Python

# Copyright (c) 2017-2018 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
from __future__ import print_function
import os
import uuid
import yaml
from sysinv.common import constants
from sysinv.puppet import interface
from sysinv.puppet import puppet
from sysinv.puppet import quoted_str
from sysinv.objects import base as objbase
from sysinv.tests.db import base as dbbase
from sysinv.tests.db import utils as dbutils
from sysinv.tests.puppet import base
NETWORKTYPES_WITH_V4_ADDRESSES = [constants.NETWORK_TYPE_MGMT,
constants.NETWORK_TYPE_OAM,
constants.NETWORK_TYPE_CLUSTER_HOST,
constants.NETWORK_TYPE_PXEBOOT]
NETWORKTYPES_WITH_V6_ADDRESSES = [constants.NETWORK_TYPE_DATA]
NETWORKTYPES_WITH_V4_ROUTES = [constants.NETWORK_TYPE_DATA]
NETWORKTYPES_WITH_V6_ROUTES = [constants.NETWORK_TYPE_DATA]
class InterfaceTestCaseMixin(base.PuppetTestCaseMixin):
""" This InterfaceTestCaseMixin needs to be used with a subclass
of BaseHostTestCase
"""
def assertIn(self, needle, haystack, message=''):
"""Custom assertIn that handles object comparison"""
if isinstance(needle, objbase.SysinvObject):
# compare objects based on unique DB identifier
needle = needle.id
haystack = [o.id for o in haystack]
super(InterfaceTestCaseMixin, self).assertIn(needle, haystack, message)
def assertEqual(self, expected, observed, message=''):
"""Custom assertEqual that handles object comparison"""
if (isinstance(expected, objbase.SysinvObject) and
isinstance(observed, objbase.SysinvObject)):
expected = expected.id
observed = observed.id
super(InterfaceTestCaseMixin, self).assertEqual(expected, observed, message)
def _setup_address_and_routes(self, iface):
if not iface['ifclass'] or iface['ifclass'] == constants.INTERFACE_CLASS_NONE:
return None
if iface['ifclass'] == constants.INTERFACE_CLASS_PLATFORM:
address = {'interface_id': iface['id'],
'family': 4,
'prefix': 24,
'address': '192.168.1.2'}
self.addresses.append(dbutils.create_test_address(**address))
elif iface['ifclass'] == constants.INTERFACE_CLASS_DATA:
address = {'interface_id': iface['id'],
'family': 6,
'prefix': 64,
'address': '2001:1::2'}
self.addresses.append(dbutils.create_test_address(**address))
if iface['ifclass'] == constants.INTERFACE_CLASS_DATA:
route = {'interface_id': iface['id'],
'family': 4,
'prefix': 24,
'network': '192.168.1.0',
'gateway': '192.168.1.1',
'metric': '1'}
self.routes.append(dbutils.create_test_route(**route))
route = {'interface_id': iface['id'],
'family': 4,
'prefix': 0,
'network': '0.0.0.0',
'gateway': '192.168.1.1',
'metric': '1'}
self.routes.append(dbutils.create_test_route(**route))
if iface['ifclass'] == constants.INTERFACE_CLASS_DATA:
route = {'interface_id': iface['id'],
'family': 6,
'prefix': 64,
'network': '2001:1::',
'gateway': '2001:1::1',
'metric': '1'}
self.routes.append(dbutils.create_test_route(**route))
route = {'interface_id': iface['id'],
'family': 6,
'prefix': 0,
'network': '::',
'gateway': '2001:1::1',
'metric': '1'}
self.routes.append(dbutils.create_test_route(**route))
def _find_network_by_type(self, networktype):
for network in self.networks:
if network['type'] == networktype:
return network
def _find_address_pool_by_uuid(self, pool_uuid):
for pool in self.address_pools:
if pool['uuid'] == pool_uuid:
return pool
def _get_network_ids_by_type(self, networktype):
if isinstance(networktype, list):
networktypelist = networktype
elif networktype:
networktypelist = [networktype]
else:
networktypelist = []
networks = []
for network_type in networktypelist:
network = self._find_network_by_type(networktype)
networks.append(str(network['id']))
return networks
def _update_interface_address_pool(self, iface, networktype):
network = self._find_network_by_type(networktype)
pool = self._find_address_pool_by_uuid(network['pool_uuid'])
addresses = self.context['addresses'].get(iface['ifname'], [])
for address in addresses:
address['pool_uuid'] = pool['uuid']
def _create_ethernet_test(self, ifname=None, ifclass=None,
networktype=None, **kwargs):
interface_id = len(self.interfaces)
if not ifname:
ifname = (networktype or 'eth') + str(interface_id)
if not ifclass:
ifclass = constants.INTERFACE_CLASS_NONE
if ifclass == constants.INTERFACE_CLASS_PLATFORM:
networks = self._get_network_ids_by_type(networktype)
else:
networks = []
interface = {'id': interface_id,
'uuid': str(uuid.uuid4()),
'forihostid': self.host.id,
'ifname': ifname,
'iftype': constants.INTERFACE_TYPE_ETHERNET,
'imac': '02:11:22:33:44:' + str(10 + interface_id),
'uses': [],
'used_by': [],
'ifclass': ifclass,
'networks': networks,
'networktype': networktype,
'imtu': 1500,
'sriov_numvfs': kwargs.get('sriov_numvfs', 0),
'sriov_vf_driver': kwargs.get('sriov_vf_driver', None)}
db_interface = dbutils.create_test_interface(**interface)
self.interfaces.append(db_interface)
port_id = len(self.ports)
port = {'id': port_id,
'uuid': str(uuid.uuid4()),
'name': 'eth' + str(port_id),
'interface_id': interface_id,
'host_id': self.host.id,
'mac': interface['imac'],
'driver': kwargs.get('driver', 'ixgbe'),
'dpdksupport': kwargs.get('dpdksupport', True),
'pciaddr': kwargs.get('pciaddr',
'0000:00:00.' + str(port_id + 1)),
'dev_id': kwargs.get('dev_id', 0),
'sriov_vf_driver': kwargs.get('sriov_vf_driver', None),
'sriov_vf_pdevice_id': kwargs.get('sriov_vf_pdevice_id', None),
'sriov_vfs_pci_address': kwargs.get('sriov_vfs_pci_address', '')}
db_port = dbutils.create_test_ethernet_port(**port)
self.ports.append(db_port)
self._setup_address_and_routes(db_interface)
return db_port, db_interface
def _create_vlan_test(self, ifname, ifclass, networktype, vlan_id,
lower_iface=None):
if not lower_iface:
lower_port, lower_iface = self._create_ethernet_test()
if not ifname:
ifname = 'vlan' + str(vlan_id)
if not ifclass:
ifclass = constants.INTERFACE_CLASS_NONE
if ifclass == constants.INTERFACE_CLASS_PLATFORM:
networks = self._get_network_ids_by_type(networktype)
else:
networks = []
interface_id = len(self.interfaces)
interface = {'id': interface_id,
'uuid': str(uuid.uuid4()),
'forihostid': self.host.id,
'ifname': ifname,
'iftype': constants.INTERFACE_TYPE_VLAN,
'vlan_id': vlan_id,
'imac': '02:11:22:33:44:' + str(10 + interface_id),
'uses': [lower_iface['ifname']],
'used_by': [],
'ifclass': ifclass,
'networks': networks,
'networktype': networktype,
'imtu': 1500}
lower_iface['used_by'].append(interface['ifname'])
db_interface = dbutils.create_test_interface(**interface)
self.interfaces.append(db_interface)
self._setup_address_and_routes(db_interface)
return db_interface
def _create_bond_test(self, ifname, ifclass=None, networktype=None):
port1, iface1 = self._create_ethernet_test()
port2, iface2 = self._create_ethernet_test()
interface_id = len(self.interfaces)
if not ifname:
ifname = 'bond' + str(interface_id)
if not ifclass:
ifclass = constants.INTERFACE_CLASS_NONE
if ifclass == constants.INTERFACE_CLASS_PLATFORM:
networks = self._get_network_ids_by_type(networktype)
else:
networks = []
interface = {'id': interface_id,
'uuid': str(uuid.uuid4()),
'forihostid': self.host.id,
'ifname': ifname,
'iftype': constants.INTERFACE_TYPE_AE,
'imac': '02:11:22:33:44:' + str(10 + interface_id),
'uses': [iface1['ifname'], iface2['ifname']],
'used_by': [],
'ifclass': ifclass,
'networks': networks,
'networktype': networktype,
'imtu': 1500,
'txhashpolicy': 'layer2'}
lacp_types = [constants.NETWORK_TYPE_MGMT,
constants.NETWORK_TYPE_PXEBOOT]
if networktype in lacp_types:
interface['aemode'] = '802.3ad'
else:
interface['aemode'] = 'balanced'
iface1['used_by'].append(interface['ifname'])
iface2['used_by'].append(interface['ifname'])
db_interface = dbutils.create_test_interface(**interface)
self.interfaces.append(db_interface)
self._setup_address_and_routes(db_interface)
return db_interface
def _create_vf_test(self, ifname, num_vfs, vf_driver=None,
lower_iface=None):
if not lower_iface:
lower_port, lower_iface = self._create_ethernet_test(
'sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
if not ifname:
ifname = 'vf-' + lower_iface['ifname']
if not num_vfs:
num_vfs = 1
networks = []
ifclass = constants.INTERFACE_CLASS_PCI_SRIOV
interface_id = len(self.interfaces)
interface = {'id': interface_id,
'uuid': str(uuid.uuid4()),
'forihostid': self.host.id,
'ifname': ifname,
'iftype': constants.INTERFACE_TYPE_VF,
'imac': '02:11:22:33:44:' + str(10 + interface_id),
'uses': [lower_iface['ifname']],
'used_by': [],
'ifclass': ifclass,
'networks': networks,
'networktype': constants.NETWORK_TYPE_PCI_SRIOV,
'imtu': 1500,
'sriov_numvfs': num_vfs,
'sriov_vf_driver': vf_driver}
lower_iface['used_by'].append(interface['ifname'])
db_interface = dbutils.create_test_interface(**interface)
self.interfaces.append(db_interface)
self._setup_address_and_routes(db_interface)
return db_interface
def _create_test_host(self, personality, subfunction=None):
subfunctions = [personality]
if subfunction:
subfunctions.append(subfunction)
host = {'personality': personality,
'hostname': '%s-0' % personality,
'forisystemid': self.system.id,
'subfunctions': ",".join(subfunctions)}
return dbutils.create_test_ihost(**host)
@puppet.puppet_context
def _update_context(self):
# interface is added as an operator by systemconfig.puppet_plugins
self.context = \
self.operator.interface._create_interface_context(self.host) # pylint: disable=no-member
# Update the puppet context with generated interface context
self.operator.context.update(self.context)
def _setup_context(self):
self.ports = []
self.interfaces = []
self.addresses = []
self.routes = []
self._setup_configuration()
self._update_context()
def _setup_configuration(self):
pass
class InterfaceTestCase(InterfaceTestCaseMixin, dbbase.BaseHostTestCase):
def setUp(self):
super(InterfaceTestCase, self).setUp()
self._setup_context()
def _setup_configuration(self):
# Create a single port/interface for basic function testing
self.host = self._create_test_host(constants.CONTROLLER)
self.port, self.iface = self._create_ethernet_test(
"mgmt0", constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self.mgmt_gateway_address = self.mgmt_subnet[1]
self.oam_gateway_address = self.oam_subnet[1]
def _update_context(self):
# ensure DB entries are updated prior to updating the context which
# will re-read the entries from the DB.
self.host.save(self.admin_context)
self.port.save(self.admin_context)
self.iface.save(self.admin_context)
super(InterfaceTestCase, self)._update_context()
def test_is_platform_network_type_true(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
result = interface.is_platform_network_type(self.iface)
self.assertTrue(result)
def test_is_platform_network_type_false(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
result = interface.is_platform_network_type(self.iface)
self.assertFalse(result)
def test_get_port_interface_id_index(self):
index = self.operator.interface._get_port_interface_id_index(self.host) # pylint: disable=no-member
for port in self.ports:
self.assertTrue(port['interface_id'] in index)
self.assertEqual(index[port['interface_id']], port)
def test_get_port_pciaddr_index(self):
index = self.operator.interface._get_port_pciaddr_index(self.host) # pylint: disable=no-member
for port in self.ports:
self.assertTrue(port['pciaddr'] in index)
self.assertIn(port, index[port['pciaddr']])
def test_get_interface_name_index(self):
index = self.operator.interface._get_interface_name_index(self.host) # pylint: disable=no-member
for iface in self.interfaces:
self.assertTrue(iface['ifname'] in index)
self.assertEqual(index[iface['ifname']], iface)
def test_get_network_type_index(self):
index = self.operator.interface._get_network_type_index() # pylint: disable=no-member
for network in self.networks:
self.assertTrue(network['type'] in index)
self.assertEqual(index[network['type']], network)
def test_get_address_interface_name_index(self):
index = self.operator.interface._get_address_interface_name_index(self.host) # pylint: disable=no-member
for address in self.addresses:
self.assertTrue(address['ifname'] in index)
self.assertIn(address, index[address['ifname']])
def test_get_routes_interface_name_index(self):
index = self.operator.interface._get_routes_interface_name_index(self.host) # pylint: disable=no-member
for route in self.routes:
self.assertTrue(route['ifname'] in index)
self.assertIn(route, index[route['ifname']])
def test_get_gateway_index(self):
index = self.operator.interface._get_gateway_index() # pylint: disable=no-member
self.assertEqual(len(index), 2)
self.assertEqual(index[constants.NETWORK_TYPE_MGMT],
str(self.mgmt_gateway_address))
self.assertEqual(index[constants.NETWORK_TYPE_OAM],
str(self.oam_gateway_address))
def test_is_worker_subfunction_true(self):
self.host['personality'] = constants.WORKER
self.host['subfunctions'] = constants.WORKER
self._update_context()
self.assertTrue(interface.is_worker_subfunction(self.context))
def test_is_worker_subfunction_true_cpe(self):
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self._update_context()
self.assertTrue(interface.is_worker_subfunction(self.context))
def test_is_worker_subfunction_false(self):
self.host['personality'] = constants.STORAGE
self.host['subfunctions'] = constants.STORAGE
self._update_context()
self.assertFalse(interface.is_worker_subfunction(self.context))
def test_is_worker_subfunction_false_cpe(self):
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.CONTROLLER
self._update_context()
self.assertFalse(interface.is_worker_subfunction(self.context))
def test_is_pci_interface_true(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.assertTrue(interface.is_pci_interface(self.iface))
def test_is_pci_interface_false(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.assertFalse(interface.is_pci_interface(self.iface))
def test_get_interface_mtu(self):
value = interface.get_interface_mtu(self.context, self.iface)
self.assertEqual(value, self.iface['imtu'])
def test_get_interface_port(self):
value = interface.get_interface_port(self.context, self.iface)
self.assertEqual(value, self.port)
def test_get_interface_port_name(self):
value = interface.get_interface_port_name(self.context, self.iface)
self.assertEqual(value, self.port['name'])
def test_get_lower_interface_vlan(self):
vlan = self._create_vlan_test(
"cluster-host", constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 1, self.iface)
self._update_context()
value = interface.get_lower_interface(self.context, vlan)
self.assertEqual(value, self.iface)
def test_get_lower_interface_vf(self):
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
vf = self._create_vf_test("vf1", 1, None, lower_iface=iface)
self._update_context()
value = interface.get_lower_interface(self.context, vf)
self.assertEqual(value, iface)
def test_get_interface_os_ifname_ethernet(self):
value = interface.get_interface_os_ifname(self.context, self.iface)
self.assertEqual(value, self.port['name'])
def test_get_interface_os_ifname_bond(self):
self.iface['iftype'] = constants.INTERFACE_TYPE_AE
value = interface.get_interface_os_ifname(self.context, self.iface)
self.assertEqual(value, self.iface['ifname'])
def test_get_interface_os_ifname_vlan_over_ethernet(self):
vlan = self._create_vlan_test(
"cluster-host", constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 1, self.iface)
self._update_context()
value = interface.get_interface_os_ifname(self.context, vlan)
self.assertEqual(value, "vlan1")
def test_get_interface_os_ifname_vlan_over_bond(self):
bond = self._create_bond_test("none")
vlan = self._create_vlan_test(
"cluster-host", constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 1, bond)
self._update_context()
value = interface.get_interface_os_ifname(self.context, vlan)
self.assertEqual(value, "vlan1")
def test_get_interface_primary_address(self):
address = interface.get_interface_primary_address(
self.context, self.iface)
self.assertIsNotNone(address)
self.assertEqual(address['address'], '192.168.1.2')
self.assertEqual(address['prefix'], 24)
self.assertEqual(address['netmask'], '255.255.255.0')
def test_get_interface_primary_address_none(self):
self.context['addresses'] = {}
address = interface.get_interface_primary_address(
self.context, self.iface)
self.assertIsNone(address)
def test_get_interface_address_family_ipv4(self):
family = interface.get_interface_address_family(
self.context, self.iface)
self.assertEqual(family, 'inet')
def test_get_interface_address_family_ipv6(self):
address = interface.get_interface_primary_address(
self.context, self.iface)
address['address'] = '2001::1'
address['prefix'] = 64
address['family'] = 6
family = interface.get_interface_address_family(
self.context, self.iface)
self.assertEqual(family, 'inet6')
def test_get_interface_address_family_none(self):
self.context['addresses'] = {}
family = interface.get_interface_address_family(
self.context, self.iface)
self.assertEqual(family, 'inet')
def test_get_interface_gateway_address_oam(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_OAM
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
gateway = interface.get_interface_gateway_address(
self.context, constants.NETWORK_TYPE_OAM)
expected = str(self.oam_gateway_address)
self.assertEqual(gateway, expected)
def test_get_interface_gateway_address_mgmt(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
gateway = interface.get_interface_gateway_address(
self.context, constants.NETWORK_TYPE_MGMT)
expected = str(self.mgmt_gateway_address)
self.assertEqual(gateway, expected)
def test_get_interface_gateway_address_none(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
gateway = interface.get_interface_gateway_address(
self.context, constants.NETWORK_TYPE_DATA)
self.assertIsNone(gateway)
def test_get_interface_address_method_for_none(self):
self.iface['ifclass'] = None
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_data(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_pci_sriov(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_pci_pthru(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_PASSTHROUGH
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_PASSTHROUGH
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_pxeboot_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_PXEBOOT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_PXEBOOT)
self.host['personality'] = constants.WORKER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_PXEBOOT)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_PXEBOOT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_pxeboot_storage(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_PXEBOOT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_PXEBOOT)
self.host['personality'] = constants.STORAGE
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_PXEBOOT)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_PXEBOOT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'manual')
def test_get_interface_address_method_for_pxeboot_controller(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_PXEBOOT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_PXEBOOT)
self.host['personality'] = constants.CONTROLLER
self._update_context()
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_PXEBOOT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_mgmt_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self.host['personality'] = constants.WORKER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_MGMT)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_MGMT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'dhcp')
def test_get_interface_address_method_for_mgmt_storage(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self.host['personality'] = constants.STORAGE
self._update_context()
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_MGMT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'dhcp')
def test_get_interface_address_method_for_mgmt_controller(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self.host['personality'] = constants.CONTROLLER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_MGMT)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_MGMT)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_cluster_host_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self.host['personality'] = constants.WORKER
self._update_context()
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_cluster_host_storage(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self.host['personality'] = constants.STORAGE
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_CLUSTER_HOST)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_cluster_host_controller(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self.host['personality'] = constants.CONTROLLER
self._update_context()
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_oam_controller(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_OAM
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
self.host['personality'] = constants.CONTROLLER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_OAM)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_OAM)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_platform_ipv4(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['ipv4_mode'] = constants.IPV4_STATIC
self.iface['networktype'] = constants.NETWORK_TYPE_NONE
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_platform_ipv6(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['ipv6_mode'] = constants.IPV6_STATIC
self.iface['networktype'] = constants.NETWORK_TYPE_NONE
method = interface.get_interface_address_method(
self.context, self.iface)
self.assertEqual(method, 'static')
def test_get_interface_address_method_for_platform_invalid(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['ipv4_mode'] = constants.IPV4_STATIC
self.iface['networktype'] = constants.NETWORK_TYPE_OAM
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
self.host['personality'] = constants.WORKER
self._update_context()
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_OAM)
method = interface.get_interface_address_method(
self.context, self.iface, network.id)
self.assertEqual(method, 'dhcp')
def test_get_interface_traffic_classifier_for_mgmt(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktypelist'] = [constants.NETWORK_TYPE_MGMT]
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
classifier = interface.get_interface_traffic_classifier(
self.context, self.iface)
print(self.context)
expected = ('%s %s %s %s > /dev/null' %
(constants.TRAFFIC_CONTROL_SCRIPT,
self.port['name'], constants.NETWORK_TYPE_MGMT,
constants.LINK_SPEED_10G))
self.assertEqual(classifier, expected)
def test_get_interface_traffic_classifier_for_cluster_host(self):
self.iface['ifname'] = 'cluster_host0'
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktypelist'] = [constants.NETWORK_TYPE_CLUSTER_HOST]
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
classifier = interface.get_interface_traffic_classifier(
self.context, self.iface)
self.assertIsNone(classifier)
def test_get_interface_traffic_classifier_for_oam(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktypelist'] = [constants.NETWORK_TYPE_OAM]
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
classifier = interface.get_interface_traffic_classifier(
self.context, self.iface)
self.assertIsNone(classifier)
def test_get_interface_traffic_classifier_for_none(self):
classifier = interface.get_interface_traffic_classifier(
self.context, self.iface)
self.assertIsNone(classifier)
def test_get_sriov_interface_port(self):
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
vf = self._create_vf_test("vf1", 1, None, lower_iface=iface)
self._update_context()
value = interface.get_sriov_interface_port(self.context, vf)
self.assertEqual(value, port)
def test_get_sriov_interface_port_invalid(self):
port, iface = self._create_ethernet_test('pthru',
constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
self._update_context()
self.assertRaises(AssertionError,
interface.get_sriov_interface_port,
self.context,
iface)
def test_get_sriov_interface_vf_addrs(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr_list = [vf_addr1, vf_addr2]
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
vf1 = self._create_vf_test("vf1", 1, None, lower_iface=iface)
self._update_context()
addrs1 = interface.get_sriov_interface_vf_addrs(
self.context, iface, vf_addr_list)
self.assertEqual(len(addrs1), 1)
addrs2 = interface.get_sriov_interface_vf_addrs(
self.context, vf1, vf_addr_list)
self.assertEqual(len(addrs2), 1)
def test_get_sriov_interface_vf_addrs_multiple_children(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr3 = "0000:81:02.0"
vf_addr_list = [vf_addr1, vf_addr2, vf_addr3]
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=3,
sriov_vf_driver=None)
vf1 = self._create_vf_test("vf1", 1, None, lower_iface=iface)
vf2 = self._create_vf_test("vf2", 1, None, lower_iface=iface)
self._update_context()
addrs1 = interface.get_sriov_interface_vf_addrs(
self.context, vf1, vf_addr_list)
self.assertEqual(len(addrs1), 1)
addrs2 = interface.get_sriov_interface_vf_addrs(
self.context, vf2, vf_addr_list)
self.assertEqual(len(addrs2), 1)
addrs3 = interface.get_sriov_interface_vf_addrs(
self.context, iface, vf_addr_list)
self.assertEqual(len(addrs3), 1)
def test_get_sriov_interface_vf_addrs_multiple_parents(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr3 = "0000:81:02.0"
vf_addr_list = [vf_addr1, vf_addr2, vf_addr3]
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=3,
sriov_vf_driver=None)
vf1 = self._create_vf_test("vf1", 2, None, lower_iface=iface)
vf2 = self._create_vf_test("vf2", 1, None, lower_iface=vf1)
self._update_context()
addrs1 = interface.get_sriov_interface_vf_addrs(
self.context, vf1, vf_addr_list)
self.assertEqual(len(addrs1), 1)
addrs2 = interface.get_sriov_interface_vf_addrs(
self.context, vf2, vf_addr_list)
self.assertEqual(len(addrs2), 1)
addrs3 = interface.get_sriov_interface_vf_addrs(
self.context, iface, vf_addr_list)
self.assertEqual(len(addrs3), 1)
def test_get_bridge_interface_name_none_dpdk_supported(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.port['dpdksupport'] = True
self._update_context()
ifname = interface.get_bridge_interface_name(self.context, self.iface)
self.assertIsNone(ifname)
def test_get_bridge_interface_name_none_not_data(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
ifname = interface.get_bridge_interface_name(self.context, self.iface)
self.assertIsNone(ifname)
def test_get_bridge_interface_name(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.port['dpdksupport'] = False
self._update_context()
ifname = interface.get_bridge_interface_name(self.context, self.iface)
self.assertEqual(ifname, 'br-' + self.port['name'])
def test_needs_interface_config_kernel_mgmt(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_MGMT
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self.host['personality'] = constants.CONTROLLER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_kernel_cluster_host(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self.host['personality'] = constants.CONTROLLER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_kernel_oam(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_OAM
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
self.host['personality'] = constants.CONTROLLER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.port['dpdksupport'] = True
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_data_slow(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.port['dpdksupport'] = False
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_data_mlx4(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.port['driver'] = constants.DRIVER_MLX_CX3
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_data_mlx5(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.port['driver'] = constants.DRIVER_MLX_CX4
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_data_slow_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.WORKER
self.port['dpdksupport'] = False
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data_mlx4_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.WORKER
self.port['driver'] = constants.DRIVER_MLX_CX3
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data_mlx5_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.WORKER
self.port['driver'] = constants.DRIVER_MLX_CX4
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_sriov_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['iftype'] = constants.INTERFACE_TYPE_ETHERNET
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.host['personality'] = constants.WORKER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_pthru_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_PASSTHROUGH
self.iface['iftype'] = constants.INTERFACE_TYPE_ETHERNET
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_PASSTHROUGH
self.host['personality'] = constants.WORKER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self.port['dpdksupport'] = True
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_data_slow_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self.port['dpdksupport'] = False
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data_mlx4_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self.port['driver'] = constants.DRIVER_MLX_CX3
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_data_mlx5_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_DATA
self.iface['networktype'] = constants.NETWORK_TYPE_DATA
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self.port['driver'] = constants.DRIVER_MLX_CX4
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_sriov_cpe(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['iftype'] = constants.INTERFACE_TYPE_ETHERNET
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.CONTROLLER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertFalse(needed)
def test_needs_interface_config_sriov_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['iftype'] = constants.INTERFACE_TYPE_ETHERNET
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def test_needs_interface_config_pthru_cpe_worker(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_PASSTHROUGH
self.iface['iftype'] = constants.INTERFACE_TYPE_ETHERNET
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_PASSTHROUGH
self.host['personality'] = constants.CONTROLLER
self.host['subfunctions'] = constants.WORKER
self._update_context()
needed = interface.needs_interface_config(self.context, self.iface)
self.assertTrue(needed)
def _get_network_config(self, ifname='eth0', ensure='present',
family='inet', method='dhcp',
hotplug='false', onboot='true',
mtu=None, options=None, **kwargs):
config = {'ifname': ifname,
'ensure': ensure,
'family': family,
'method': method,
'hotplug': hotplug,
'onboot': onboot}
if mtu:
config['mtu'] = str(mtu)
config['options'] = options or {}
config.update(**kwargs)
return config
def _get_static_network_config(self, **kwargs):
ifname = kwargs.pop('ifname', 'eth0')
method = kwargs.pop('method', 'static')
ipaddress = kwargs.pop('ipaddress', '192.168.1.2')
netmask = kwargs.pop('netmask', '255.255.255.0')
return self._get_network_config(
ifname=ifname, method=method,
ipaddress=ipaddress, netmask=netmask, **kwargs)
def _get_route_config(self, name='default', ensure='present',
gateway='1.2.3.1', interface='eth0',
netmask='0.0.0.0', network='default',
metric=1):
config = {'name': name,
'ensure': ensure,
'gateway': gateway,
'interface': interface,
'netmask': netmask,
'network': network,
'options': 'metric ' + str(metric)}
return config
def _get_sriov_config(self, ifname='default',
vf_driver=constants.SRIOV_DRIVER_TYPE_VFIO,
vf_addrs=None, num_vfs=2,
pf_addr=None):
if vf_addrs is None:
vf_addrs = []
config = {'ifname': ifname,
'pf_addr': pf_addr if pf_addr else self.port['pciaddr'],
'num_vfs': num_vfs,
'vf_driver': vf_driver,
'vf_addrs': vf_addrs}
return config
def _get_loopback_config(self):
network_config = self._get_network_config(
ifname=interface.LOOPBACK_IFNAME, method=interface.LOOPBACK_METHOD)
return interface.format_network_config(network_config)
def test_generate_loopback_config(self):
config = {
interface.NETWORK_CONFIG_RESOURCE: {},
}
interface.generate_loopback_config(config)
expected = self._get_loopback_config()
result = config[interface.NETWORK_CONFIG_RESOURCE].get(
interface.LOOPBACK_IFNAME)
self.assertEqual(result, expected)
def test_get_controller_ethernet_config_oam(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_OAM
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_OAM)
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_OAM)
network = self.dbapi.network_get_by_type(constants.NETWORK_TYPE_OAM)
config = interface.get_interface_network_config(
self.context, self.iface, network.id)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20'}
expected = self._get_static_network_config(
ifname=self.port['name'], mtu=1500, gateway='10.10.10.1',
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_ethernet_config_mgmt(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktypelist'] = [constants.NETWORK_TYPE_MGMT]
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_MGMT)
network = self.dbapi.network_get_by_type(constants.NETWORK_TYPE_MGMT)
config = interface.get_interface_network_config(
self.context, self.iface, network.id)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20',
'post_up':
'%s %s %s %s > /dev/null' %
(constants.TRAFFIC_CONTROL_SCRIPT,
self.port['name'], constants.NETWORK_TYPE_MGMT,
constants.LINK_SPEED_10G)}
expected = self._get_static_network_config(
ifname=self.port['name'], mtu=1500, gateway='192.168.204.1',
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_ethernet_config_cluster_host(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_CLUSTER_HOST)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
config = interface.get_interface_network_config(
self.context, self.iface, network.id)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20'}
expected = self._get_static_network_config(
ifname=self.port['name'], mtu=1500,
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_ethernet_config_slave(self):
bond = self._create_bond_test("bond0")
self._update_context()
iface = self.context['interfaces'][bond['uses'][0]]
port = self.context['ports'][iface['id']]
config = interface.get_interface_network_config(self.context, iface)
options = {'IPV6_AUTOCONF': 'no',
'SLAVE': 'yes',
'PROMISC': 'yes',
'MASTER': 'bond0',
'LINKDELAY': '20'}
expected = self._get_network_config(
ifname=port['name'], mtu=1500, method='manual', options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_bond_config_balanced(self):
bond = self._create_bond_test("bond0")
self._update_context()
config = interface.get_interface_network_config(self.context, bond)
options = {'IPV6_AUTOCONF': 'no',
'up': 'sleep 10',
'MACADDR': bond['imac'],
'BONDING_OPTS':
'mode=balance-xor xmit_hash_policy=layer2 miimon=100'}
expected = self._get_network_config(
ifname=bond['ifname'], mtu=1500, method='manual', options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_bond_config_8023ad(self):
bond = self._create_bond_test("bond0")
bond['aemode'] = '802.3ad'
self._update_context()
config = interface.get_interface_network_config(self.context, bond)
options = {'IPV6_AUTOCONF': 'no',
'up': 'sleep 10',
'MACADDR': bond['imac'],
'BONDING_OPTS':
'mode=802.3ad lacp_rate=fast '
'xmit_hash_policy=layer2 miimon=100'}
expected = self._get_network_config(
ifname=bond['ifname'], mtu=1500, method='manual', options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_bond_config_active_standby(self):
bond = self._create_bond_test("bond0")
bond['aemode'] = 'active_standby'
self._update_context()
config = interface.get_interface_network_config(self.context, bond)
options = {'IPV6_AUTOCONF': 'no',
'up': 'sleep 10',
'MACADDR': bond['imac'],
'BONDING_OPTS': 'mode=active-backup miimon=100 primary=eth1'}
expected = self._get_network_config(
ifname=bond['ifname'], mtu=1500, method='manual', options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_vlan_config(self):
vlan = self._create_vlan_test("vlan1", None, None, 1, self.iface)
self._update_context()
config = interface.get_interface_network_config(self.context, vlan)
options = {'IPV6_AUTOCONF': 'no',
'PHYSDEV': self.port['name'],
'VLAN': 'yes',
'pre_up': '/sbin/modprobe -q 8021q'}
expected = self._get_network_config(
ifname=self.port['name'] + ".1", mtu=1500, method='manual',
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_controller_vlan_config_over_bond(self):
bond = self._create_bond_test("bond0")
vlan = self._create_vlan_test("vlan1", None, None, 1, bond)
self._update_context()
config = interface.get_interface_network_config(self.context, vlan)
options = {'IPV6_AUTOCONF': 'no',
'PHYSDEV': bond['ifname'],
'VLAN': 'yes',
'pre_up': '/sbin/modprobe -q 8021q'}
expected = self._get_network_config(
ifname=bond['ifname'] + ".1", mtu=1500, method='manual',
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_worker_ethernet_config_mgmt(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktypelist'] = [constants.NETWORK_TYPE_MGMT]
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_MGMT)
self.host['personality'] = constants.WORKER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_MGMT)
network = self.dbapi.network_get_by_type(constants.NETWORK_TYPE_MGMT)
config = interface.get_interface_network_config(
self.context, self.iface, network.id)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20',
'post_up':
'%s %s %s %s > /dev/null' %
(constants.TRAFFIC_CONTROL_SCRIPT,
self.port['name'], constants.NETWORK_TYPE_MGMT,
constants.LINK_SPEED_10G)}
expected = self._get_network_config(
ifname=self.port['name'], mtu=1500, options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_worker_ethernet_config_cluster_host(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PLATFORM
self.iface['networktype'] = constants.NETWORK_TYPE_CLUSTER_HOST
self.iface['networks'] = self._get_network_ids_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
self.host['personality'] = constants.WORKER
self._update_context()
self._update_interface_address_pool(
self.iface, constants.NETWORK_TYPE_CLUSTER_HOST)
network = self.dbapi.network_get_by_type(
constants.NETWORK_TYPE_CLUSTER_HOST)
config = interface.get_interface_network_config(
self.context, self.iface, network.id)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20'}
expected = self._get_static_network_config(
ifname=self.port['name'], mtu=1500, options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_worker_ethernet_config_pci_sriov(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.host['personality'] = constants.WORKER
self._update_context()
config = interface.get_interface_network_config(
self.context, self.iface)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20',
'pre_up':
'echo 0 > /sys/class/net/eth0/device/sriov_numvfs; '
'echo 0 > /sys/class/net/eth0/device/sriov_numvfs'}
expected = self._get_network_config(
ifname=self.port['name'], method='manual',
mtu=1500, options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_worker_ethernet_config_pci_pthru(self):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_PASSTHROUGH
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_PASSTHROUGH
self.host['personality'] = constants.WORKER
self._update_context()
config = interface.get_interface_network_config(
self.context, self.iface)
options = {'IPV6_AUTOCONF': 'no',
'LINKDELAY': '20',
'pre_up':
'if [ -f /sys/class/net/eth0/device/sriov_numvfs ]; then'
' echo 0 > /sys/class/net/eth0/device/sriov_numvfs; fi'}
expected = self._get_network_config(
ifname=self.port['name'], mtu=1500, method='manual',
options=options)
print(expected)
self.assertEqual(expected, config)
def test_get_worker_ethernet_config_pci_sriov_vf(self):
port, iface = self._create_ethernet_test(
'sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
vf = self._create_vf_test("vf", 1, None, lower_iface=iface)
self._update_context()
config = interface.get_interface_network_config(self.context, vf)
expected = {}
print(expected)
self.assertEqual(expected, config)
def test_get_route_config(self):
route = {'network': '1.2.3.0',
'prefix': 24,
'gateway': '1.2.3.1',
'metric': 20}
config = interface.get_route_config(route, "eth0")
expected = self._get_route_config(
name='1.2.3.0/24', network='1.2.3.0',
netmask='255.255.255.0', metric=20)
print(expected)
self.assertEqual(expected, config)
def test_get_route_config_default(self):
route = {'network': '0.0.0.0',
'prefix': 0,
'gateway': '1.2.3.1',
'metric': 1}
config = interface.get_route_config(route, "eth0")
expected = self._get_route_config()
print(expected)
self.assertEqual(expected, config)
def _create_sriov_vf_config(self, iface_vf_driver, port_vf_driver,
vf_addr_list, num_vfs):
self.iface['ifclass'] = constants.INTERFACE_CLASS_PCI_SRIOV
self.iface['networktype'] = constants.NETWORK_TYPE_PCI_SRIOV
self.iface['sriov_vf_driver'] = iface_vf_driver
self.iface['sriov_numvfs'] = num_vfs
self.port['sriov_vf_driver'] = port_vf_driver
self.port['sriov_vfs_pci_address'] = vf_addr_list
self._update_context()
config = interface.get_sriov_config(self.context, self.iface)
return config
def test_get_sriov_config_netdevice(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr_list = "{},{}".format(vf_addr1, vf_addr2)
num_vfs = 2
config = self._create_sriov_vf_config(
constants.SRIOV_DRIVER_TYPE_NETDEVICE, 'i40evf', vf_addr_list,
num_vfs)
expected = self._get_sriov_config(
self.iface['ifname'], 'i40evf',
[quoted_str(vf_addr1),
quoted_str(vf_addr2)],
num_vfs)
self.assertEqual(expected, config)
def test_get_sriov_config_vfio(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr_list = "{},{}".format(vf_addr1, vf_addr2)
num_vfs = 4
config = self._create_sriov_vf_config(
constants.SRIOV_DRIVER_TYPE_VFIO, 'i40evf', vf_addr_list,
num_vfs)
expected = self._get_sriov_config(
self.iface['ifname'], 'vfio-pci',
[quoted_str(vf_addr1),
quoted_str(vf_addr2)],
num_vfs)
self.assertEqual(expected, config)
def test_get_sriov_config_default(self):
vf_addr1 = "0000:81:00.0"
vf_addr2 = "0000:81:01.0"
vf_addr_list = "{},{}".format(vf_addr1, vf_addr2)
num_vfs = 1
config = self._create_sriov_vf_config(
None, 'i40evf', vf_addr_list, num_vfs)
expected = self._get_sriov_config(
self.iface['ifname'], None,
[quoted_str(vf_addr1),
quoted_str(vf_addr2)],
num_vfs)
self.assertEqual(expected, config)
def test_get_sriov_config_iftype_vf(self):
port, iface = self._create_ethernet_test(
'sriov1', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
vf = self._create_vf_test("vf1", 1, None, lower_iface=iface)
self._update_context()
config = interface.get_sriov_config(self.context, vf)
expected = self._get_sriov_config(
vf['ifname'], None,
None,
None, pf_addr=port['pciaddr'])
self.assertEqual(expected, config)
def test_is_a_mellanox_cx3_device_false(self):
self.assertFalse(
interface.is_a_mellanox_cx3_device(self.context, self.iface))
def test_is_a_mellanox_cx3_device_true(self):
self.port['driver'] = constants.DRIVER_MLX_CX3
self._update_context()
self.assertTrue(
interface.is_a_mellanox_cx3_device(self.context, self.iface))
def test_find_sriov_interfaces_by_driver_none(self):
ifaces = interface.find_sriov_interfaces_by_driver(
self.context, constants.DRIVER_MLX_CX3)
self.assertTrue(not ifaces)
def test_find_sriov_interfaces_by_driver_one(self):
expected = ['sriov_cx3_0']
vf_num = 2
for ifname in expected:
self._create_sriov_cx3_if_test(ifname, vf_num)
self._update_context()
ifaces = interface.find_sriov_interfaces_by_driver(
self.context, constants.DRIVER_MLX_CX3)
results = [iface['ifname'] for iface in ifaces]
self.assertEqual(sorted(results), sorted(expected))
def test_find_sriov_interfaces_by_driver_two(self):
expected = ['sriov_cx3_0', 'sriov_cx3_1']
vf_num = 2
for ifname in expected:
self._create_sriov_cx3_if_test(ifname, vf_num)
self._update_context()
ifaces = interface.find_sriov_interfaces_by_driver(
self.context, constants.DRIVER_MLX_CX3)
results = [iface['ifname'] for iface in ifaces]
self.assertEqual(sorted(results), sorted(expected))
def test_build_mlx4_num_vfs_options_none(self):
expected = ""
num_vfs_options = interface.build_mlx4_num_vfs_options(self.context)
self.assertEqual(num_vfs_options, expected)
def test_build_mlx4_num_vfs_options_one(self):
ifname = 'sriov_cx3_0'
vf_num = 2
port, iface = self._create_sriov_cx3_if_test(ifname, vf_num)
self._update_context()
expected = "%s-%d;0;0" % (port['pciaddr'], vf_num)
num_vfs_options = interface.build_mlx4_num_vfs_options(self.context)
self.assertEqual(num_vfs_options, expected)
def test_build_mlx4_num_vfs_options_two(self):
ifname0, ifname1 = 'sriov_cx3_0', 'sriov_cx3_1'
vf_num = 2
port0, iface0 = self._create_sriov_cx3_if_test(ifname0, vf_num)
port1, iface1 = self._create_sriov_cx3_if_test(ifname1, vf_num)
self._update_context()
expected = [
"%s-%d;0;0,%s-%d;0;0" % (port0['pciaddr'], vf_num,
port1['pciaddr'], vf_num),
"%s-%d;0;0,%s-%d;0;0" % (port1['pciaddr'], vf_num,
port0['pciaddr'], vf_num),
]
num_vfs_options = interface.build_mlx4_num_vfs_options(self.context)
self.assertIn(num_vfs_options, expected)
def test_build_mlx4_num_vfs_options_dup(self):
ifname0, ifname1 = 'sriov_cx3_0', 'sriov_cx3_1'
vf_num = 2
port0, iface0 = self._create_sriov_cx3_if_test(ifname0, vf_num)
port1, iface1 = self._create_sriov_cx3_if_test(
ifname1, vf_num, pciaddr=port0['pciaddr'], dev_id=1)
self._update_context()
expected = "%s-%d;0;0" % (port0['pciaddr'], vf_num)
num_vfs_options = interface.build_mlx4_num_vfs_options(self.context)
self.assertEqual(num_vfs_options, expected)
def _create_sriov_cx3_if_test(self, name, vf_num, **kwargs):
port, iface = self._create_ethernet_test(
name, constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV,
driver=constants.DRIVER_MLX_CX3, sriov_numvfs=vf_num, **kwargs)
return port, iface
class InterfaceHostTestCase(InterfaceTestCaseMixin, dbbase.BaseHostTestCase):
def setUp(self):
super(InterfaceHostTestCase, self).setUp()
self._setup_context()
self.expected_platform_interfaces = []
self.expected_data_interfaces = []
self.expected_pci_interfaces = []
self.expected_slow_interfaces = []
self.expected_bridged_interfaces = []
self.expected_slave_interfaces = []
self.expected_mlx_interfaces = []
self.expected_bmc_interface = None
def _setup_configuration(self):
# Personality is set to worker to avoid issues due to missing OAM
# interface in this empty/dummy configuration
self.host = self._create_test_host(constants.WORKER)
def _update_context(self):
# ensure DB entries are updated prior to updating the context which
# will re-read the entries from the DB.
self.host.save(self.admin_context)
super(InterfaceHostTestCase, self)._update_context()
def _create_hieradata_directory(self):
hiera_path = os.path.join(os.environ['VIRTUAL_ENV'], 'hieradata')
if not os.path.exists(hiera_path):
os.mkdir(hiera_path, 0o755)
return hiera_path
def _get_config_filename(self, hiera_directory):
class_name = self.__class__.__name__
return os.path.join(hiera_directory, class_name) + ".yaml"
def test_generate_interface_config(self):
hieradata_directory = self._create_hieradata_directory()
config_filename = self._get_config_filename(hieradata_directory)
with open(config_filename, 'w') as config_file:
config = self.operator.interface.get_host_config(self.host) # pylint: disable=no-member
self.assertIsNotNone(config)
yaml.dump(config, config_file, default_flow_style=False)
def test_create_interface_context(self):
context = self.operator.interface._create_interface_context(self.host) # pylint: disable=no-member
self.assertIn('personality', context)
self.assertIn('subfunctions', context)
self.assertIn('devices', context)
self.assertIn('ports', context)
self.assertIn('interfaces', context)
self.assertIn('addresses', context)
self.assertIn('routes', context)
self.assertIn('gateways', context)
def test_is_platform_interface(self):
for iface in self.interfaces:
expected = bool(
iface['ifname'] in self.expected_platform_interfaces)
if interface.is_platform_interface(self.context,
iface) != expected:
print("iface %s is %sa kernel interface" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_is_data_interface(self):
for iface in self.interfaces:
expected = bool(iface['ifname'] in self.expected_data_interfaces)
if interface.is_data_interface(self.context, iface) != expected:
print("iface %s is %sa data interface" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_is_pci_interface(self):
for iface in self.interfaces:
expected = bool(iface['ifname'] in self.expected_pci_interfaces)
if interface.is_pci_interface(iface) != expected:
print("iface %s is %sa pci interface" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_is_a_mellanox_device(self):
for iface in self.interfaces:
if iface['iftype'] != constants.INTERFACE_TYPE_ETHERNET:
continue
expected = bool(iface['ifname'] in self.expected_mlx_interfaces)
if interface.is_a_mellanox_device(self.context,
iface) != expected:
print("iface %s is %sa mellanox device" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_is_dpdk_compatible_false(self):
for iface in self.interfaces:
expected = bool(iface['ifname'] in self.expected_slow_interfaces)
if interface.is_dpdk_compatible(self.context, iface) == expected:
print("iface %s is %sdpdk compatible" % (
iface['ifname'], ('not ' if not expected else '')))
self.assertFalse(True)
def test_is_bridged_interface(self):
for iface in self.interfaces:
expected = bool(
iface['ifname'] in self.expected_bridged_interfaces)
if interface.is_bridged_interface(self.context,
iface) != expected:
print("iface %s is %sa bridged interface" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_is_slave_interface(self):
for iface in self.interfaces:
expected = bool(iface['ifname'] in self.expected_slave_interfaces)
if interface.is_slave_interface(self.context, iface) != expected:
print("iface %s is %sa slave interface" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
def test_needs_interface_config(self):
expected_configured = (self.expected_platform_interfaces +
[self.expected_bmc_interface])
if interface.is_worker_subfunction(self.context):
expected_configured += (self.expected_pci_interfaces +
self.expected_slow_interfaces +
self.expected_mlx_interfaces)
for iface in self.interfaces:
expected = bool(iface['ifname'] in expected_configured)
actual = interface.needs_interface_config(self.context, iface)
if expected != actual:
print("iface %s is %sconfigured" % (
iface['ifname'], ('not ' if expected else '')))
self.assertFalse(True)
class InterfaceControllerEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where all platform interfaces are
# ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
self._create_ethernet_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_ethernet_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_ethernet_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceControllerEthernet, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['oam', 'mgmt', 'cluster-host']
class InterfaceControllerBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where all platform interfaces are
# aggregated ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
self._create_bond_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_bond_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_bond_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
def setUp(self):
super(InterfaceControllerBond, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['eth0', 'eth1', 'oam',
'eth3', 'eth4', 'mgmt',
'eth6', 'eth7', 'cluster-host']
self.expected_slave_interfaces = ['eth0', 'eth1',
'eth3', 'eth4',
'eth6', 'eth7']
class InterfaceControllerVlanOverBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where all platform interfaces are
# vlan interfaces over aggregated ethernet interfaces
self.host = self._create_test_host(constants.CONTROLLER)
bond = self._create_bond_test('pxeboot',
constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, bond)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, bond)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3,
bond)
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceControllerVlanOverBond, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['eth0', 'eth1', 'pxeboot',
'oam', 'mgmt', 'cluster-host']
self.expected_slave_interfaces = ['eth0', 'eth1']
class InterfaceControllerVlanOverEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where all platform interfaces are
# vlan interfaces over ethernet interfaces
self.host = self._create_test_host(constants.CONTROLLER)
port, iface = self._create_ethernet_test(
'pxeboot', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, iface)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, iface)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3, iface)
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceControllerVlanOverEthernet, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['eth0', 'pxeboot', 'oam',
'mgmt', 'cluster-host']
class InterfaceComputeEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# worker and all interfaces are ethernet interfaces.
self.host = self._create_test_host(constants.WORKER)
self._create_ethernet_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_ethernet_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_ethernet_test('data', constants.INTERFACE_CLASS_DATA)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
port, iface = (
self._create_ethernet_test('slow', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
dpdksupport=False))
port, iface = (
self._create_ethernet_test('mlx4', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX3))
port, iface = (
self._create_ethernet_test('mlx5', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX4))
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceComputeEthernet, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['mgmt', 'cluster-host']
self.expected_data_interfaces = ['slow', 'data', 'mlx4', 'mlx5']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slow_interfaces = ['slow']
self.expected_bridged_interfaces = ['slow']
self.expected_slave_interfaces = []
self.expected_mlx_interfaces = ['mlx4', 'mlx5']
class InterfaceComputeVlanOverEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# worker and all interfaces are vlan interfaces over ethernet
# interfaces.
self.host = self._create_test_host(constants.WORKER)
port, iface = self._create_ethernet_test(
'pxeboot', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, iface)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3)
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceComputeVlanOverEthernet, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['pxeboot', 'mgmt',
'eth2', 'cluster-host']
self.expected_data_interfaces = ['eth4', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru']
class InterfaceComputeVfOverSriov(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# worker and all interfaces are ethernet interfaces, aside from
# a VF interface over SR-IOV
self.host = self._create_test_host(constants.WORKER)
self._create_ethernet_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_ethernet_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_ethernet_test('data', constants.INTERFACE_CLASS_DATA)
port, iface = self._create_ethernet_test(
'sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV, sriov_numvfs=2,
sriov_vf_driver=None)
self._create_vf_test("vf", 1, None, lower_iface=iface)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceComputeVfOverSriov, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['pxeboot', 'mgmt',
'eth2', 'cluster-host']
self.expected_data_interfaces = ['eth4', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru', 'vf']
class InterfaceComputeBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# worker and all interfaces are aggregated ethernet interfaces.
self.host = self._create_test_host(constants.WORKER)
self._create_bond_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_bond_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_bond_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA)
self._create_ethernet_test('sriov',
constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru',
constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceComputeBond, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['eth0', 'eth1', 'mgmt',
'eth3', 'eth4', 'cluster-host']
self.expected_data_interfaces = ['eth6', 'eth7', 'data',
'eth12', 'eth13', 'ex']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slave_interfaces = ['eth0', 'eth1', 'eth3', 'eth4',
'eth6', 'eth7', 'eth9', 'eth10',
'eth12', 'eth13']
class InterfaceComputeVlanOverBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# worker and all interfaces are vlan interfaces over ethernet
# interfaces.
self.host = self._create_test_host(constants.WORKER)
bond = self._create_bond_test('pxeboot',
constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, bond)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, bond)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3, bond)
bond2 = self._create_bond_test('bond2')
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5, bond2)
self._create_ethernet_test('sriov',
constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru',
constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceComputeVlanOverBond, self).setUp()
self.expected_platform_interfaces = ['eth0', 'eth1', 'pxeboot',
'oam', 'mgmt', 'cluster-host']
self.expected_data_interfaces = ['eth6', 'eth7', 'bond2', 'data',
'eth14', 'eth15']
self.expected_slave_interfaces = ['eth0', 'eth1',
'eth6', 'eth7',
'eth10', 'eth11']
self.expected_pci_interfaces = ['sriov', 'pthru']
class InterfaceCpeEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a controller subfunction and all interfaces are
# ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
self._create_ethernet_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_ethernet_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_ethernet_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_ethernet_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
port, iface = (
self._create_ethernet_test('slow', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
dpdksupport=False))
port, iface = (
self._create_ethernet_test('mlx4', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX3))
port, iface = (
self._create_ethernet_test('mlx5', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX4))
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceCpeEthernet, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['oam', 'mgmt', 'cluster-host']
self.expected_data_interfaces = ['slow', 'data', 'mlx4', 'mlx5']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slow_interfaces = ['slow']
self.expected_bridged_interfaces = ['slow']
self.expected_slave_interfaces = []
self.expected_mlx_interfaces = ['mlx4', 'mlx5']
class InterfaceCpeVlanOverEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a controller subfunction and all interfaces are
# vlan interfaces over ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
port, iface = self._create_ethernet_test(
'pxeboot', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, iface)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, iface)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3)
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeVlanOverEthernet, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['pxeboot', 'mgmt', 'oam',
'eth3', 'cluster-host']
self.expected_data_interfaces = ['eth5', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru']
class InterfaceCpeBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a controller subfunction and all interfaces are
# aggregated ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
self._create_bond_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_bond_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_bond_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_bond_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeBond, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['eth0', 'eth1', 'oam',
'eth3', 'eth4', 'mgmt',
'eth6', 'eth7', 'cluster-host']
self.expected_data_interfaces = ['eth9', 'eth10', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slave_interfaces = ['eth0', 'eth1', 'eth3', 'eth4',
'eth6', 'eth7', 'eth9', 'eth10',
'eth12', 'eth13']
class InterfaceCpeVlanOverBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a controller subfunction and all interfaces are
# vlan interfaces over aggregated ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER)
bond = self._create_bond_test('pxeboot', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, bond)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, bond)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3, bond)
bond2 = self._create_bond_test('bond4')
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5,
bond2)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeVlanOverBond, self).setUp()
self.expected_platform_interfaces = ['eth0', 'eth1', 'pxeboot',
'oam', 'mgmt', 'cluster-host']
self.expected_data_interfaces = ['eth6', 'eth7', 'bond4', 'data']
self.expected_slave_interfaces = ['eth0', 'eth1',
'eth6', 'eth7']
self.expected_pci_interfaces = ['sriov', 'pthru']
class InterfaceCpeComputeEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a worker subfunction and all interfaces are
# ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER, constants.WORKER)
self._create_ethernet_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
self._create_ethernet_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_ethernet_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_ethernet_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
port, iface = (
self._create_ethernet_test('slow', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
dpdksupport=False))
port, iface = (
self._create_ethernet_test('mlx4', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX3))
port, iface = (
self._create_ethernet_test('mlx5', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA,
driver=constants.DRIVER_MLX_CX4))
self._create_ethernet_test('none')
def setUp(self):
super(InterfaceCpeComputeEthernet, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['oam', 'mgmt', 'cluster-host']
self.expected_data_interfaces = ['slow', 'data', 'mlx4', 'mlx5']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slow_interfaces = ['slow']
self.expected_bridged_interfaces = ['slow']
self.expected_slave_interfaces = []
self.expected_mlx_interfaces = ['mlx4', 'mlx5']
class InterfaceCpeComputeVlanOverEthernet(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a worker subfunction and all interfaces are
# vlan interfaces over ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER, constants.WORKER)
port, iface = self._create_ethernet_test(
'pxeboot', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, iface)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, iface)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3)
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeComputeVlanOverEthernet, self).setUp()
self.expected_bmc_interface = 'pxeboot'
self.expected_platform_interfaces = ['pxeboot', 'oam', 'mgmt',
'eth3', 'cluster-host']
self.expected_data_interfaces = ['eth5', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru']
class InterfaceCpeComputeBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a worker subfunction and all interfaces are
# aggregated ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER, constants.WORKER)
self._create_bond_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM)
self._create_bond_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT)
self._create_bond_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST)
self._create_bond_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeComputeBond, self).setUp()
self.expected_bmc_interface = 'mgmt'
self.expected_platform_interfaces = ['eth0', 'eth1', 'oam',
'eth3', 'eth4', 'mgmt',
'eth6', 'eth7', 'cluster-host']
self.expected_data_interfaces = ['eth9', 'eth10', 'data']
self.expected_pci_interfaces = ['sriov', 'pthru']
self.expected_slave_interfaces = ['eth0', 'eth1', 'eth3', 'eth4',
'eth6', 'eth7', 'eth9', 'eth10',
'eth12', 'eth13']
class InterfaceCpeComputeVlanOverBond(InterfaceHostTestCase):
def _setup_configuration(self):
# Setup a sample configuration where the personality is set to a
# controller with a worker subfunction and all interfaces are
# vlan interfaces over aggregated ethernet interfaces.
self.host = self._create_test_host(constants.CONTROLLER, constants.WORKER)
bond = self._create_bond_test('pxeboot',
constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_PXEBOOT)
self._create_vlan_test('oam', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_OAM, 1, bond)
self._create_vlan_test('mgmt', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_MGMT, 2, bond)
self._create_vlan_test('cluster-host', constants.INTERFACE_CLASS_PLATFORM,
constants.NETWORK_TYPE_CLUSTER_HOST, 3, bond)
bond2 = self._create_bond_test('bond2')
self._create_vlan_test('data', constants.INTERFACE_CLASS_DATA,
constants.NETWORK_TYPE_DATA, 5,
bond2)
self._create_ethernet_test('sriov', constants.INTERFACE_CLASS_PCI_SRIOV,
constants.NETWORK_TYPE_PCI_SRIOV)
self._create_ethernet_test('pthru', constants.INTERFACE_CLASS_PCI_PASSTHROUGH,
constants.NETWORK_TYPE_PCI_PASSTHROUGH)
def setUp(self):
super(InterfaceCpeComputeVlanOverBond, self).setUp()
self.expected_platform_interfaces = ['eth0', 'eth1', 'pxeboot',
'oam', 'mgmt', 'cluster-host']
self.expected_data_interfaces = ['eth6', 'eth7', 'bond2', 'data']
self.expected_slave_interfaces = ['eth0', 'eth1',
'eth6', 'eth7']
self.expected_pci_interfaces = ['sriov', 'pthru']