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:
parent
02d7097b8e
commit
3c7d662d95
@ -1733,22 +1733,55 @@ 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']:
|
||||
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
|
||||
@ -1757,8 +1790,63 @@ class FuelWebClient29(object):
|
||||
" 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):
|
||||
|
@ -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(
|
||||
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, iface['name'])))
|
||||
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(
|
||||
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, iface['name'])))
|
||||
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(
|
||||
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, iface['name'])))
|
||||
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(
|
||||
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, iface['name'])))
|
||||
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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user