Update offloading and MTU configuration due to a new API

Change-Id: I958f0a8caf8dc8156c8a95381c94690b84ee7ae6
Closes-Bug: 1644588
(cherry picked from commit 94e2fd57a2)
This commit is contained in:
Sergey Novikov 2016-12-08 18:06:33 +04:00
parent 02d7097b8e
commit 3c7d662d95
3 changed files with 182 additions and 97 deletions

View File

@ -1733,32 +1733,120 @@ class FuelWebClient29(object):
@logwrap
def get_offloading_modes(self, node_id, interfaces):
offloading_types = []
for i in self.client.get_node_interfaces(node_id):
for interface in interfaces:
if i['name'] == interface:
for offloading_type in i['offloading_modes']:
offloading_types.append(offloading_type['name'])
return offloading_types
"""Get offloading modes for predifened ifaces
:param node_id: int, nailgun node id
:param interfaces: list, list of iface names
:return: list, list of available offloading modes
"""
target_ifaces = [iface
for iface in self.client.get_node_interfaces(node_id)
if iface['name'] in interfaces]
if 'interface_properties' in target_ifaces[0]:
logger.debug("Using old interface serialization scheme")
offloading_types = set([
offloading_type['name']
for iface in target_ifaces
for offloading_type in iface['offloading_modes']])
else:
logger.debug("Using new interface serialization scheme")
offloading_types = set([
offloading_type
for iface in target_ifaces
for offloading_type in
iface['attributes']['offloading']['modes']['value']])
return list(offloading_types)
@logwrap
def update_offloads(self, node_id, update_values, interface_to_update):
interfaces = self.client.get_node_interfaces(node_id)
"""Update offloading modes for the corresponding interface
for i in interfaces:
:param node_id: int, nailgun node id
:param update_values: dict, pair of mode name and value
:param interface_to_update: str, target iface name
"""
ifaces = self.client.get_node_interfaces(node_id)
# get target iface
for i in ifaces:
if i['name'] == interface_to_update:
for new_mode in update_values['offloading_modes']:
for mode in i['offloading_modes']:
if mode['name'] == new_mode['name']:
mode.update(new_mode)
break
else:
raise Exception("Offload type '{0}' is not applicable"
" for interface {1}".format(
new_mode['name'],
interface_to_update))
iface = i
break
def prepare_offloading_modes(types):
return [{'name': name, 'state': types[name], 'sub': []}
for name in types]
if 'interface_properties' in iface:
logger.debug("Using old interface serialization scheme")
offloading_modes = prepare_offloading_modes(update_values)
for new_mode in offloading_modes:
for mode in iface['offloading_modes']:
if mode['name'] == new_mode['name']:
mode.update(new_mode)
break
else:
raise Exception("Offload type '{0}' is not applicable"
" for interface {1}".format(
new_mode['name'],
interface_to_update))
else:
logger.debug("Using new interface serialization scheme")
for mode in update_values:
iface['attributes']['offloading']['modes']['value'][mode] = \
update_values[mode]
self.client.put_node_interfaces(
[{'id': node_id, 'interfaces': interfaces}])
[{'id': node_id, 'interfaces': ifaces}])
def set_mtu(self, nailgun_node_id, iface, mtu=1500):
"""Set MTU for the corresponding interfaces
:param nailgun_node_id: int, naigun node id
:param iface: str, interface name
:param mtu: int, value of MTU
"""
ifaces = self.client.get_node_interfaces(nailgun_node_id)
# get target iface
for i in ifaces:
if i['name'] == iface:
target_iface = i
break
if 'interface_properties' in target_iface:
logger.debug("Using old interface serialization scheme")
target_iface['interface_properties']['mtu'] = mtu
else:
logger.debug("Using new interface serialization scheme")
target_iface['attributes']['mtu']['value']['value'] = mtu
self.client.put_node_interfaces([{'id': nailgun_node_id,
'interfaces': ifaces}])
def disable_offloading(self, nailgun_node_id, iface,
offloading=False):
"""Disable offloading for the corresponding interfaces
:param nailgun_node_id: int, naigun node id
:param iface: str, interface name
:param offloading: bool, enable or disable offloading
"""
ifaces = self.client.get_node_interfaces(nailgun_node_id)
# get target iface
for i in ifaces:
if i['name'] == iface:
target_iface = i
break
if 'interface_properties' in target_iface:
logger.debug("Using old interface serialization scheme")
target_iface['interface_properties']['disable_offloading'] = \
offloading
else:
logger.debug("Using new interface serialization scheme")
target_iface['attributes']['offloading']['disable']['value'] = \
offloading
self.client.put_node_interfaces([{'id': nailgun_node_id,
'interfaces': ifaces}])
def change_default_network_settings(self):
def fetch_networks(networks):

View File

@ -12,7 +12,6 @@
# License for the specific language governing permissions and limitations
# under the License.
from copy import deepcopy
import subprocess
from devops.helpers import helpers as devops_helpers
@ -45,13 +44,13 @@ class TestJumboFrames(base_test_case.TestBasic):
iface_alias('eth4'): ['storage'],
}
interfaces_update = [{
iface_update = {
'name': iface_alias('eth3'),
'interface_properties': {
'mtu': 9000,
'disable_offloading': False
},
}]
}
}
def check_node_iface_mtu(self, node, iface, mtu):
"""Check mtu on environment node network interface."""
@ -295,9 +294,10 @@ class TestJumboFrames(base_test_case.TestBasic):
self.show_step(5)
slave_nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
for node in slave_nodes:
self.fuel_web.update_node_networks(
node['id'], self.interfaces,
override_ifaces_params=self.interfaces_update)
self.fuel_web.set_mtu(node['id'],
self.iface_update['name'], mtu=9000)
self.fuel_web.disable_offloading(node['id'],
self.iface_update['name'])
self.show_step(6)
self.fuel_web.deploy_cluster_wait(cluster_id)
@ -310,13 +310,13 @@ class TestJumboFrames(base_test_case.TestBasic):
'slave-04', 'slave-05']:
node = self.fuel_web.get_nailgun_node_by_name(node_name)
with self.env.d_env.get_ssh_to_remote(node['ip']) as remote:
for iface in self.interfaces_update:
asserts.assert_true(
self.check_node_iface_mtu(remote, iface['name'], 9000),
"MTU on {0} is not 9000. "
"Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, iface['name'])))
asserts.assert_true(
self.check_node_iface_mtu(
remote, self.iface_update['name'], 9000),
"MTU on {0} is not 9000. Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, self.iface_update['name'])
))
self.show_step(9)
self.check_mtu_size_between_instances(mtu_offset=0)
@ -376,9 +376,10 @@ class TestJumboFrames(base_test_case.TestBasic):
self.show_step(5)
slave_nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
for node in slave_nodes:
self.fuel_web.update_node_networks(
node['id'], self.interfaces,
override_ifaces_params=self.interfaces_update)
self.fuel_web.set_mtu(node['id'],
self.iface_update['name'], mtu=9000)
self.fuel_web.disable_offloading(node['id'],
self.iface_update['name'])
self.show_step(6)
self.fuel_web.deploy_cluster_wait(cluster_id)
@ -391,13 +392,13 @@ class TestJumboFrames(base_test_case.TestBasic):
'slave-04', 'slave-05']:
node = self.fuel_web.get_nailgun_node_by_name(node_name)
with self.env.d_env.get_ssh_to_remote(node['ip']) as remote:
for iface in self.interfaces_update:
asserts.assert_true(
self.check_node_iface_mtu(remote, iface['name'], 9000),
"MTU on {0} is not 9000. "
"Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, iface['name'])))
asserts.assert_true(
self.check_node_iface_mtu(
remote, self.iface_update['name'], 9000),
"MTU on {0} is not 9000. Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, self.iface_update['name'])
))
self.show_step(9)
self.check_mtu_size_between_instances(mtu_offset=50)
@ -458,10 +459,10 @@ class TestJumboFrames(base_test_case.TestBasic):
self.show_step(5)
slave_nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
for node in slave_nodes:
self.fuel_web.update_node_networks(
node['id'],
interfaces_dict=deepcopy(self.interfaces),
override_ifaces_params=self.interfaces_update)
self.fuel_web.set_mtu(node['id'],
self.iface_update['name'], mtu=9000)
self.fuel_web.disable_offloading(node['id'],
self.iface_update['name'])
self.show_step(6)
self.fuel_web.deploy_cluster_wait(cluster_id)
@ -474,13 +475,13 @@ class TestJumboFrames(base_test_case.TestBasic):
'slave-04', 'slave-05']:
node = self.fuel_web.get_nailgun_node_by_name(node_name)
with self.env.d_env.get_ssh_to_remote(node['ip']) as remote:
for iface in self.interfaces_update:
asserts.assert_true(
self.check_node_iface_mtu(remote, iface['name'], 9000),
"MTU on {0} is not 9000. "
"Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, iface['name'])))
asserts.assert_true(
self.check_node_iface_mtu(
remote, self.iface_update['name'], 9000),
"MTU on {0} is not 9000. Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, self.iface_update['name'])
))
self.show_step(9)
self.check_mtu_size_between_instances(mtu_offset=0, diff_net=True)
@ -541,10 +542,10 @@ class TestJumboFrames(base_test_case.TestBasic):
self.show_step(5)
slave_nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
for node in slave_nodes:
self.fuel_web.update_node_networks(
node['id'],
interfaces_dict=deepcopy(self.interfaces),
override_ifaces_params=self.interfaces_update)
self.fuel_web.set_mtu(node['id'],
self.iface_update['name'], mtu=9000)
self.fuel_web.disable_offloading(node['id'],
self.iface_update['name'])
self.show_step(6)
self.fuel_web.deploy_cluster_wait(cluster_id)
@ -557,13 +558,13 @@ class TestJumboFrames(base_test_case.TestBasic):
'slave-04', 'slave-05']:
node = self.fuel_web.get_nailgun_node_by_name(node_name)
with self.env.d_env.get_ssh_to_remote(node['ip']) as remote:
for iface in self.interfaces_update:
asserts.assert_true(
self.check_node_iface_mtu(remote, iface['name'], 9000),
"MTU on {0} is not 9000. "
"Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, iface['name'])))
asserts.assert_true(
self.check_node_iface_mtu(
remote, self.iface_update['name'], 9000),
"MTU on {0} is not 9000. Actual value: {1}".format(
remote.host,
self.get_node_iface(remote, self.iface_update['name'])
))
self.show_step(9)
self.check_mtu_size_between_instances(mtu_offset=50, diff_net=True)

View File

@ -36,20 +36,14 @@ class TestOffloading(TestBasic):
settings.iface_alias('eth4'): ['storage'],
}
offloadings_1 = ['generic-receive-offload',
'generic-segmentation-offload',
'tcp-segmentation-offload',
'large-receive-offload']
offloadings_1 = {'generic-receive-offload': False,
'generic-segmentation-offload': False,
'tcp-segmentation-offload': False,
'large-receive-offload': False}
offloadings_2 = ['rx-all',
'rx-vlan-offload',
'tx-vlan-offload']
@staticmethod
def prepare_offloading_modes(interface, types, state):
return [{'name': interface,
'offloading_modes': [{'name': name, 'state': state,
'sub': []} for name in types]}]
offloadings_2 = {'rx-all': True,
'rx-vlan-offload': True,
'tx-vlan-offload': True}
@staticmethod
def check_offloading_modes(nodes, offloadings, iface, state):
@ -109,31 +103,32 @@ class TestOffloading(TestBasic):
nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
self.show_step(4)
offloadings_1 = []
offloadings_2 = []
offloadings_1 = {}
offloadings_2 = {}
for node in nodes:
modes = self.fuel_web.get_offloading_modes(node['id'], [iface1])
for name in self.offloadings_1:
if name in modes and name not in offloadings_1:
offloadings_1.append(name)
offloadings_1[name] = self.offloadings_1[name]
modes = self.fuel_web.get_offloading_modes(node['id'], [iface2])
for name in self.offloadings_2:
if name in modes and name not in offloadings_2:
offloadings_2.append(name)
offloadings_2[name] = self.offloadings_2[name]
assert_true(len(offloadings_1) > 0, "No types for disable offloading")
assert_true(len(offloadings_2) > 0, "No types for enable offloading")
modes = self.prepare_offloading_modes(iface1, offloadings_1, False)
modes += self.prepare_offloading_modes(iface2, offloadings_2, True)
offloadings = {
iface1: offloadings_1,
iface2: offloadings_2
}
for node in nodes:
self.fuel_web.update_node_networks(
node['id'],
interfaces_dict=deepcopy(self.interfaces))
for offloading in modes:
for offloading in offloadings:
self.fuel_web.update_offloads(
node['id'], deepcopy(offloading), offloading['name'])
node['id'], offloadings[offloading], offloading)
self.show_step(5)
self.fuel_web.verify_network(cluster_id)
@ -202,31 +197,32 @@ class TestOffloading(TestBasic):
nodes = self.fuel_web.client.list_cluster_nodes(cluster_id)
self.show_step(4)
offloadings_1 = []
offloadings_2 = []
offloadings_1 = {}
offloadings_2 = {}
for node in nodes:
modes = self.fuel_web.get_offloading_modes(node['id'], [iface1])
for name in self.offloadings_1:
if name in modes and name not in offloadings_1:
offloadings_1.append(name)
offloadings_1[name] = self.offloadings_1[name]
modes = self.fuel_web.get_offloading_modes(node['id'], [iface2])
for name in self.offloadings_2:
if name in modes and name not in offloadings_2:
offloadings_2.append(name)
offloadings_2[name] = self.offloadings_2[name]
assert_true(len(offloadings_1) > 0, "No types for disable offloading")
assert_true(len(offloadings_2) > 0, "No types for enable offloading")
modes = self.prepare_offloading_modes(iface1, offloadings_1, False)
modes += self.prepare_offloading_modes(iface2, offloadings_2, True)
offloadings = {
iface1: offloadings_1,
iface2: offloadings_2
}
for node in nodes:
self.fuel_web.update_node_networks(
node['id'],
interfaces_dict=deepcopy(self.interfaces))
for offloading in modes:
for offloading in offloadings:
self.fuel_web.update_offloads(
node['id'], deepcopy(offloading), offloading['name'])
node['id'], offloadings[offloading], offloading)
self.show_step(5)
self.fuel_web.verify_network(cluster_id)