Detach dpdk and hugepages config method from test class

This refactor is required for new nvf test implemented later

Change-Id: Id50a9d4dc414d66b569cf1f0ac7c06754d6484a5
This commit is contained in:
Vladimir Khlyunev 2016-11-21 13:26:50 +03:00
parent c4bf7e51fb
commit 834a07e77b
5 changed files with 129 additions and 111 deletions

View File

@ -3029,6 +3029,113 @@ class FuelWebClient29(object):
}
return _net_pool
def setup_hugepages(self, nailgun_node_id,
hp_2mb=0, hp_1gb=0, hp_dpdk_mb=0):
node_attributes = self.client.get_node_attributes(nailgun_node_id)
node_attributes['hugepages']['nova']['value']['2048'] = hp_2mb
node_attributes['hugepages']['nova']['value']['1048576'] = hp_1gb
node_attributes['hugepages']['dpdk']['value'] = hp_dpdk_mb
self.client.upload_node_attributes(node_attributes, nailgun_node_id)
def check_dpdk(self, nailgun_node_id, net='private'):
compute_net = self.client.get_node_interfaces(nailgun_node_id)
dpdk_available = False
dpdk_enabled = False
for interface in compute_net:
if net not in [n['name'] for n in interface['assigned_networks']]:
continue
if 'dpdk' not in interface['interface_properties']:
continue
dpdk_available = interface['interface_properties']['dpdk'][
'available']
if 'enabled' in interface['interface_properties']['dpdk']:
dpdk_enabled = interface['interface_properties']['dpdk'][
'enabled']
break
return {'available': dpdk_available, 'enabled': dpdk_enabled}
def enable_dpdk(self, nailgun_node_id, switch_to=True, net='private',
forceEnable=False):
if not forceEnable:
assert_true(self.check_dpdk(nailgun_node_id, net=net)['available'],
'DPDK not available on selected interface')
compute_net = self.client.get_node_interfaces(
nailgun_node_id)
for interface in compute_net:
for ids in interface['assigned_networks']:
if ids['name'] == net:
if interface['type'] == 'bond':
interface['bond_properties']['type__'] = 'dpdkovs'
interface['interface_properties']['dpdk'].update(
{'enabled': switch_to})
else:
interface['interface_properties']['dpdk'][
'enabled'] = switch_to
break
self.client.put_node_interfaces(
[{'id': nailgun_node_id, 'interfaces': compute_net}])
return self.check_dpdk(
nailgun_node_id, net=net)['enabled'] == switch_to
def check_sriov(self, nailgun_node_id):
nailgun_node_ifaces = self.client.get_node_interfaces(
nailgun_node_id)
devops_node = self.get_devops_node_by_nailgun_node(
nailgun_node_id)
devops_sriov_macs = [i.mac_address for i in devops_node.interfaces
if 'sriov' in i.features]
nailgun_sriov_nics = []
devops_sriov_nics = []
for interface in nailgun_node_ifaces:
if interface['mac'] in devops_sriov_macs:
devops_sriov_nics.append(interface['name'])
if interface['assigned_networks']:
continue
if 'sriov' not in interface['interface_properties']:
continue
sriov_available = interface['interface_properties']['sriov'][
'available']
if sriov_available:
nailgun_sriov_nics.append(interface['name'])
return set(devops_sriov_nics).intersection(nailgun_sriov_nics)
def enable_sriov(self, nailgun_node_id):
nics_to_enable_sriov = self.check_sriov(nailgun_node_id)
assert_true(nics_to_enable_sriov,
'There are no NICs with SR-IOV support on '
'node with ID {0}!'.format(nailgun_node_id))
node_networks = self.client.get_node_interfaces(nailgun_node_id)
for interface in node_networks:
if interface['name'] not in nics_to_enable_sriov:
continue
interface['interface_properties']['sriov']['enabled'] = True
interface['interface_properties']['sriov']['sriov_numvfs'] = \
interface['interface_properties']['sriov']['sriov_totalvfs']
self.client.put_node_interfaces(
[{'id': nailgun_node_id, 'interfaces': node_networks}])
def enable_cpu_pinning(self, nailgun_node_id, cpu_count=None):
nailgun_node = [node for node in self.client.list_nodes()
if node['id'] == nailgun_node_id].pop()
vcpu_total = nailgun_node['meta']['cpu']['total']
node_attrs = self.client.get_node_attributes(nailgun_node_id)
if cpu_count is None:
cpu_count = vcpu_total - 1
else:
assert_true(
cpu_count < vcpu_total,
"Too many cpu requested for cpu pinning! Should be less"
"than vcpu count (requested {!r}, vcpu found {!r}".format(
cpu_count, vcpu_total))
node_attrs['cpu_pinning']['nova']['value'] = cpu_count
self.client.upload_node_attributes(node_attrs, nailgun_node_id)
class FuelWebClient30(FuelWebClient29):
"""FuelWebClient that works with fuel-devops 3.0

View File

@ -105,10 +105,10 @@ ADMIN_NODE_BOOTSTRAP_TIMEOUT = os.environ.get(
HARDWARE = {
"admin_node_memory": os.environ.get("ADMIN_NODE_MEMORY", 3072),
"admin_node_cpu": os.environ.get("ADMIN_NODE_CPU", 2),
"slave_node_cpu": os.environ.get("SLAVE_NODE_CPU", 1),
"numa_nodes": os.environ.get("NUMA_NODES", 0),
"admin_node_memory": int(os.environ.get("ADMIN_NODE_MEMORY", 3072)),
"admin_node_cpu": int(os.environ.get("ADMIN_NODE_CPU", 2)),
"slave_node_cpu": int(os.environ.get("SLAVE_NODE_CPU", 1)),
"numa_nodes": int(os.environ.get("NUMA_NODES", 0))
}
if OPENSTACK_RELEASE_UBUNTU in OPENSTACK_RELEASE:
slave_mem_default = 2560

View File

@ -91,61 +91,6 @@ class TestDPDK(TestBasic):
os_conn.delete_instance(server)
os_conn.delete_flavor(flavor)
def setup_hugepages(self, nailgun_node,
hp_2mb=0, hp_1gb=0, hp_dpdk_mb=0):
node_attributes = self.fuel_web.client.get_node_attributes(
nailgun_node['id'])
node_attributes['hugepages']['nova']['value']['2048'] = hp_2mb
node_attributes['hugepages']['nova']['value']['1048576'] = hp_1gb
node_attributes['hugepages']['dpdk']['value'] = hp_dpdk_mb
self.fuel_web.client.upload_node_attributes(node_attributes,
nailgun_node['id'])
def check_dpdk(self, nailgun_node, net='private'):
compute_net = self.fuel_web.client.get_node_interfaces(
nailgun_node['id'])
dpdk_available = False
dpdk_enabled = False
for interface in compute_net:
if net not in [n['name'] for n in interface['assigned_networks']]:
continue
if 'dpdk' not in interface['interface_properties']:
continue
dpdk_available = interface['interface_properties']['dpdk'][
'available']
if 'enabled' in interface['interface_properties']['dpdk']:
dpdk_enabled = interface['interface_properties']['dpdk'][
'enabled']
break
return {'available': dpdk_available, 'enabled': dpdk_enabled}
def enable_dpdk(self, nailgun_node, switch_to=True, net='private',
forceEnable=False):
if not forceEnable:
assert_true(self.check_dpdk(nailgun_node, net=net)['available'],
'DPDK not available on selected interface')
compute_net = self.fuel_web.client.get_node_interfaces(
nailgun_node['id'])
for interface in compute_net:
for ids in interface['assigned_networks']:
if ids['name'] == net:
if interface['type'] == 'bond':
interface['bond_properties']['type__'] = 'dpdkovs'
interface['interface_properties']['dpdk'].update(
{'enabled': switch_to})
else:
interface['interface_properties']['dpdk'][
'enabled'] = switch_to
break
self.fuel_web.client.put_node_interfaces(
[{'id': nailgun_node['id'], 'interfaces': compute_net}])
return self.check_dpdk(nailgun_node, net=net)['enabled'] == switch_to
@test(groups=["support_dpdk"])
class SupportDPDK(TestDPDK):
@ -201,10 +146,11 @@ class SupportDPDK(TestDPDK):
cluster_id, ['compute'], role_status='pending_roles')[0]
self.show_step(4)
self.setup_hugepages(compute, hp_2mb=256, hp_dpdk_mb=128)
self.fuel_web.setup_hugepages(
compute['id'], hp_2mb=256, hp_dpdk_mb=128)
self.show_step(5)
self.enable_dpdk(compute)
self.fuel_web.enable_dpdk(compute['id'])
self.show_step(6)
self.fuel_web.verify_network(cluster_id)
@ -276,12 +222,13 @@ class SupportDPDK(TestDPDK):
cluster_id, ['compute'], role_status='pending_roles')[0]
self.show_step(4)
self.setup_hugepages(compute, hp_2mb=256, hp_dpdk_mb=128)
self.fuel_web.setup_hugepages(
compute['id'], hp_2mb=256, hp_dpdk_mb=128)
self.show_step(5)
assert_raises(
exceptions.BadRequest,
self.enable_dpdk, compute,
self.fuel_web.enable_dpdk, compute['id'],
forceEnable=True)
@test(depends_on=[SetupEnvironment.prepare_slaves_3],
@ -324,7 +271,8 @@ class SupportDPDK(TestDPDK):
cluster_id, ['compute'], role_status='pending_roles')[0]
self.show_step(4)
self.setup_hugepages(compute, hp_2mb=256, hp_dpdk_mb=128)
self.fuel_web.setup_hugepages(
compute['id'], hp_2mb=256, hp_dpdk_mb=128)
self.show_step(5)
assigned_networks = {
@ -338,7 +286,7 @@ class SupportDPDK(TestDPDK):
interfaces_dict=assigned_networks)
assert_raises(
exceptions.BadRequest,
self.enable_dpdk, compute,
self.fuel_web.enable_dpdk, compute['id'],
forceEnable=True)
@ -410,11 +358,12 @@ class SupportDPDKBond(BondingTestDPDK, TestDPDK):
self.show_step(5)
for node in computes:
self.setup_hugepages(node, hp_2mb=256, hp_dpdk_mb=128)
self.fuel_web.setup_hugepages(
node['id'], hp_2mb=256, hp_dpdk_mb=128)
self.show_step(6)
for node in computes:
self.enable_dpdk(node)
self.fuel_web.enable_dpdk(node['id'])
self.show_step(7)
self.fuel_web.verify_network(cluster_id)

View File

@ -23,45 +23,6 @@ from fuelweb_test.tests.base_test_case import TestBasic
@test(groups=['sriov'])
class TestSRIOV(TestBasic):
def check_sriov(self, nailgun_node):
nailgun_node_ifaces = self.fuel_web.client.get_node_interfaces(
nailgun_node['id'])
devops_node = self.fuel_web.get_devops_node_by_nailgun_node(
nailgun_node)
devops_sriov_macs = [i.mac_address for i in devops_node.interfaces
if 'sriov' in i.features]
nailgun_sriov_nics = []
devops_sriov_nics = []
for interface in nailgun_node_ifaces:
if interface['mac'] in devops_sriov_macs:
devops_sriov_nics.append(interface['name'])
if interface['assigned_networks']:
continue
if 'sriov' not in interface['interface_properties']:
continue
sriov_available = interface['interface_properties']['sriov'][
'available']
if sriov_available:
nailgun_sriov_nics.append(interface['name'])
return set(devops_sriov_nics).intersection(nailgun_sriov_nics)
def enable_sriov(self, nailgun_node):
nics_to_enable_sriov = self.check_sriov(nailgun_node)
assert_true(nics_to_enable_sriov,
'There are no NICs with SR-IOV support on '
'node with ID {0}!'.format(nailgun_node['id']))
node_networks = self.fuel_web.client.get_node_interfaces(
nailgun_node['id'])
for interface in node_networks:
if interface['name'] not in nics_to_enable_sriov:
continue
interface['interface_properties']['sriov']['enabled'] = True
interface['interface_properties']['sriov']['sriov_numvfs'] = \
interface['interface_properties']['sriov']['sriov_totalvfs']
self.fuel_web.client.put_node_interfaces(
[{'id': nailgun_node['id'], 'interfaces': node_networks}])
@test(depends_on_groups=['prepare_slaves_all'],
groups=['deploy_cluster_with_sriov'])
@log_snapshot_after_test
@ -103,7 +64,8 @@ class TestSRIOV(TestBasic):
)
self.show_step(2)
nodes = self.fuel_web.client.list_nodes()
sriov_nailgun_nodes = [n for n in nodes if self.check_sriov(n)]
sriov_nailgun_nodes = [n for n in nodes
if self.fuel_web.check_sriov(n['id'])]
assert_true(len(sriov_nailgun_nodes) >= 2,
'At least 2 nodes with SR-IOV support are required for '
'this test! But, only {0} nodes are '
@ -142,12 +104,12 @@ class TestSRIOV(TestBasic):
cluster_id, ['compute'], role_status='pending_roles')
computes_with_sriov_support = [n for n in computes
if self.check_sriov(n)]
if self.fuel_web.check_sriov(n['id'])]
assert_true(computes_with_sriov_support, 'There is no compute with '
'SR-IOV support available!')
for compute in computes_with_sriov_support:
self.enable_sriov(compute)
self.fuel_web.enable_sriov(compute['id'])
self.show_step(5)
self.fuel_web.verify_network(cluster_id)

View File

@ -110,11 +110,11 @@ class SupportHugepages(TestBasic):
raise exceptions.FuelQAVariableNotSet(
'DRIVER_ENABLE_ACPI', 'true')
if not settings.HARDWARE['numa_nodes'] == "2":
if settings.HARDWARE['numa_nodes'] != 2:
raise exceptions.FuelQAVariableNotSet(
'NUMA_NODES', 2)
if not settings.HARDWARE['slave_node_cpu'] == "4":
if settings.HARDWARE['slave_node_cpu'] != 4:
raise exceptions.FuelQAVariableNotSet(
'SLAVE_NODE_CPU', 4)