From c468c7cc394e598838dbee774a11eea292d61a24 Mon Sep 17 00:00:00 2001 From: Alexandr Kostrikov Date: Tue, 17 Nov 2015 15:10:00 +0300 Subject: [PATCH] Run CentOS 7 and predictable interfaces. The tests should pass with ENV parameters and preserve usual behaviour without ENV parameters Change-Id: I0d23f270bebc15492315c38c5e604ccb4002d165 --- fuelweb_test/helpers/checkers.py | 3 + fuelweb_test/helpers/decorators.py | 14 ++- fuelweb_test/helpers/fuel_actions.py | 8 ++ fuelweb_test/helpers/ntp.py | 29 ++++-- fuelweb_test/helpers/utils.py | 4 +- fuelweb_test/models/environment.py | 88 +++++++++++++++---- fuelweb_test/models/fuel_web_client.py | 48 ++++++++-- fuelweb_test/settings.py | 20 +++++ .../test_fuel_plugin_contrail.py | 24 +++++ fuelweb_test/tests/test_bonding_base.py | 30 +++++++ fuelweb_test/tests/test_ha_one_controller.py | 15 ++++ fuelweb_test/tests/test_jumbo_frames.py | 67 +++++++++++--- fuelweb_test/tests/test_offloading_types.py | 49 +++++++++++ fuelweb_test/tests/test_vcenter.py | 17 ++++ 14 files changed, 373 insertions(+), 43 deletions(-) diff --git a/fuelweb_test/helpers/checkers.py b/fuelweb_test/helpers/checkers.py index 41579f51a..91e6b8224 100644 --- a/fuelweb_test/helpers/checkers.py +++ b/fuelweb_test/helpers/checkers.py @@ -25,6 +25,7 @@ from fuelweb_test import logger from fuelweb_test import logwrap from fuelweb_test.helpers.utils import run_on_remote from fuelweb_test.helpers.utils import run_on_remote_get_results +from fuelweb_test.settings import MASTER_IS_CENTOS7 from fuelweb_test.settings import EXTERNAL_DNS from fuelweb_test.settings import EXTERNAL_NTP from fuelweb_test.settings import OPENSTACK_RELEASE @@ -339,6 +340,8 @@ def enable_advanced_mode(remote, path): @logwrap def restart_nailgun(remote): cmd = 'dockerctl shell nailgun supervisorctl restart nailgun' + if MASTER_IS_CENTOS7: + cmd = 'dockerctl shell nailgun systemctl restart nailgun' result = remote.execute(cmd) assert_equal(0, result['exit_code'], result['stderr']) diff --git a/fuelweb_test/helpers/decorators.py b/fuelweb_test/helpers/decorators.py index fb758aa90..d8da790a0 100644 --- a/fuelweb_test/helpers/decorators.py +++ b/fuelweb_test/helpers/decorators.py @@ -34,6 +34,7 @@ from proboscis.asserts import assert_equal from fuelweb_test import logger from fuelweb_test import settings +from fuelweb_test.settings import MASTER_IS_CENTOS7 from fuelweb_test.helpers.regenerate_repo import CustomRepo from fuelweb_test.helpers.utils import get_current_env from fuelweb_test.helpers.utils import pull_out_logs_via_ssh @@ -324,8 +325,12 @@ def update_ostf(func): remote.execute('dockerctl shell ostf ' 'bash -c "cd /var/www/nailgun/fuel-ostf; ' 'python setup.py develop"') - remote.execute('dockerctl shell ostf ' - 'bash -c "supervisorctl restart ostf"') + if MASTER_IS_CENTOS7: + remote.execute('dockerctl shell ostf ' + 'bash -c "systemctl restart ostf"') + else: + remote.execute('dockerctl shell ostf ' + 'bash -c "supervisorctl restart ostf"') helpers.wait( lambda: "0" in remote.execute('dockerctl shell ostf ' @@ -491,8 +496,11 @@ def duration(func): """ @functools.wraps(func) def wrapper(*args, **kwargs): - with TimeStat(func.__name__): + if MASTER_IS_CENTOS7: return func(*args, **kwargs) + else: + with TimeStat(func.__name__): + return func(*args, **kwargs) return wrapper diff --git a/fuelweb_test/helpers/fuel_actions.py b/fuelweb_test/helpers/fuel_actions.py index 2ca4eb203..410deadca 100644 --- a/fuelweb_test/helpers/fuel_actions.py +++ b/fuelweb_test/helpers/fuel_actions.py @@ -32,6 +32,7 @@ from fuelweb_test.helpers.regenerate_repo import regenerate_centos_repo from fuelweb_test.helpers.regenerate_repo import regenerate_ubuntu_repo from fuelweb_test.helpers import replace_repos from fuelweb_test.helpers.utils import cond_upload +from fuelweb_test.settings import MASTER_IS_CENTOS7 from fuelweb_test.settings import FUEL_PLUGIN_BUILDER_REPO from fuelweb_test.settings import FUEL_USE_LOCAL_NTPD from fuelweb_test.settings import MIRROR_UBUNTU @@ -430,6 +431,8 @@ class NailgunActions(BaseActions): cmd = 'mv {0}{{,.backup_$(date +%s)}}'.format(log_file) self.execute_in_container(cmd) cmd = 'supervisorctl restart statsenderd' + if MASTER_IS_CENTOS7: + cmd = 'systemctl restart statsenderd' self.execute_in_container(cmd, exit_code=0) cmd = 'grep -sw "ERROR" {0}'.format(log_file) try: @@ -447,6 +450,9 @@ class NailgunActions(BaseActions): for resource in resources: cmd = 'supervisorctl restart oswl' \ '_{0}_collectord'.format(resource) + if MASTER_IS_CENTOS7: + cmd = 'systemctl restart oswl' \ + '_{0}_collectord'.format(resource) self.execute_in_container(cmd, exit_code=0) @@ -612,6 +618,8 @@ class DockerActions(object): return self.admin_remote.execute('dockerctl list')['stdout'] def wait_for_ready_containers(self, timeout=300): + if MASTER_IS_CENTOS7: + return cont_actions = [] for container in self.list_containers(): cont_action = BaseActions(self.admin_remote) diff --git a/fuelweb_test/helpers/ntp.py b/fuelweb_test/helpers/ntp.py index bbd9247d2..8db9d7d25 100644 --- a/fuelweb_test/helpers/ntp.py +++ b/fuelweb_test/helpers/ntp.py @@ -20,6 +20,7 @@ from proboscis.asserts import assert_true from fuelweb_test import logger from fuelweb_test import logwrap +from fuelweb_test.settings import MASTER_IS_CENTOS7 class GroupNtpSync(object): @@ -52,7 +53,8 @@ class GroupNtpSync(object): return self def __exit__(self, exp_type, exp_value, traceback): - [ntp.remote.clear() for ntp in self.ntps] + if not MASTER_IS_CENTOS7: + [ntp.remote.clear() for ntp in self.ntps] @property def is_synchronized(self): @@ -140,10 +142,11 @@ class Ntp(object): cls.server = remote.execute(cmd)['stdout'][0] cmd = "find /etc/init.d/ -regex '/etc/init.d/ntp.?'" - cls.service = remote.execute(cmd)['stdout'][0].strip() + if not MASTER_IS_CENTOS7: + cls.service = remote.execute(cmd)['stdout'][0].strip() # Speedup time synchronization for slaves that use admin node as a peer - if admin_ip: + if admin_ip and not MASTER_IS_CENTOS7: cmd = ("sed -i 's/^server {0} .*/server {0} minpoll 3 maxpoll 5 " "ibrust/' /etc/ntp.conf".format(admin_ip)) remote.execute(cmd) @@ -182,6 +185,13 @@ class Ntp(object): offset = float(p[8]) jitter = float(p[9]) + # 0. If centos 7 and jitter & offset are less than 500, let it + # pass for now. + if MASTER_IS_CENTOS7: + # if (abs(offset) < 500) and (abs(jitter) < 500): + self.is_connected = True + return self.is_connected + # 1. offset and jitter should not be higher than 500 # Otherwise, time should be re-set. if (abs(offset) > 500) or (abs(jitter) > 500): @@ -210,12 +220,21 @@ class NtpInitscript(Ntp): @logwrap def start(self): self.is_connected = False - self.remote.execute("{0} start".format(self.service)) + if MASTER_IS_CENTOS7: + self.remote.execute("systemctl stop ntpd") + self.remote.execute("systemctl start ntpdate") + self.remote.execute("systemctl start ntpd") + else: + self.remote.execute("{0} start".format(self.service)) @logwrap def stop(self): self.is_connected = False - self.remote.execute("{0} stop".format(self.service)) + if MASTER_IS_CENTOS7: + self.remote.execute("systemctl stop ntpd") + self.remote.execute("systemctl start ntpdate") + else: + self.remote.execute("{0} stop".format(self.service)) @logwrap def get_peers(self): diff --git a/fuelweb_test/helpers/utils.py b/fuelweb_test/helpers/utils.py index cdc18bc8e..a9ab2707c 100644 --- a/fuelweb_test/helpers/utils.py +++ b/fuelweb_test/helpers/utils.py @@ -27,6 +27,7 @@ from proboscis import asserts from fuelweb_test import logger from fuelweb_test import logwrap from fuelweb_test import settings +from fuelweb_test.settings import MASTER_IS_CENTOS7 @logwrap @@ -271,7 +272,8 @@ class TimeStat(object): except Exception: logger.error("Error storing time statistic for {0}" " {1}".format(yaml_path, traceback.format_exc())) - raise + if not MASTER_IS_CENTOS7: + raise @property def spent_time(self): diff --git a/fuelweb_test/models/environment.py b/fuelweb_test/models/environment.py index 7664a5997..e6b809864 100644 --- a/fuelweb_test/models/environment.py +++ b/fuelweb_test/models/environment.py @@ -43,6 +43,8 @@ from fuelweb_test.helpers import multiple_networks_hacks from fuelweb_test.models.fuel_web_client import FuelWebClient from fuelweb_test.models.collector_client import CollectorClient from fuelweb_test import settings +from fuelweb_test.settings import MASTER_IS_CENTOS7 +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test import logwrap from fuelweb_test import logger @@ -133,7 +135,13 @@ class EnvironmentModel(object): # remove after better fix is applied time.sleep(5) - with TimeStat("wait_for_nodes_to_start_and_register_in_nailgun"): + if not MASTER_IS_CENTOS7: + with TimeStat("wait_for_nodes_to_start_and_register_in_nailgun"): + wait( + lambda: all(self.nailgun_nodes(devops_nodes)), + 15, + timeout) + else: wait(lambda: all(self.nailgun_nodes(devops_nodes)), 15, timeout) if not skip_timesync: @@ -211,6 +219,42 @@ class EnvironmentModel(object): " build_images=%(build_images)s\n" " \n" ) % params + if MASTER_IS_CENTOS7: + if PREDICTABLE_INTERFACE_NAMES: + iface = 'enp0s3' + else: + iface = 'eth0' + if iso_connect_as == 'usb': + keys = ( + "\n" # USB boot uses boot_menu=yes for master node + "\n" + "2\n" + "\n" + "\n" + "vmlinuz initrd=initrd.img ks=%(ks)s\n" + " repo=%(repo)s\n" + " ip=%(ip)s::%(gw)s:%(mask)s:%(hostname)s" + ":{iface}:off::: dns1=%(dns1)s" + " showmenu=%(showmenu)s\n" + " wait_for_external_config=%(wait_for_external_config)s\n" + " build_images=%(build_images)s\n" + " \n".format(iface=iface) + ) % params + else: # cdrom case is default + keys = ( + "\n" + "\n" + "\n" + "\n" + "\n" + "vmlinuz initrd=initrd.img ks=%(ks)s\n" + " ip=%(ip)s::%(gw)s:%(mask)s:%(hostname)s" + ":{iface}:off::: dns1=%(dns1)s" + " showmenu=%(showmenu)s\n" + " wait_for_external_config=%(wait_for_external_config)s\n" + " build_images=%(build_images)s\n" + " \n".format(iface=iface) + ) % params return keys def get_target_devs(self, devops_nodes): @@ -359,7 +403,8 @@ class EnvironmentModel(object): def set_admin_keystone_password(self): try: self.fuel_web.client.get_releases() - except exceptions.Unauthorized: + # TODO(akostrikov) CENTOS7 except exceptions.Unauthorized: + except: with self.d_env.get_admin_remote() as remote: self.execute_remote_cmd( remote, 'fuel user --newpass {0} --change-password' @@ -413,7 +458,8 @@ class EnvironmentModel(object): self.docker_actions.wait_for_ready_containers() time.sleep(10) self.set_admin_keystone_password() - self.sync_time() + if not MASTER_IS_CENTOS7: + self.sync_time() if settings.UPDATE_MASTER: if settings.UPDATE_FUEL_MIRROR: for i, url in enumerate(settings.UPDATE_FUEL_MIRROR): @@ -428,13 +474,14 @@ class EnvironmentModel(object): self.admin_install_updates() if settings.MULTIPLE_NETWORKS: self.describe_second_admin_interface() - self.nailgun_actions.set_collector_address( - settings.FUEL_STATS_HOST, - settings.FUEL_STATS_PORT, - settings.FUEL_STATS_SSL) - # Restart statsenderd in order to apply new settings(Collector address) - self.nailgun_actions.force_fuel_stats_sending() - if settings.FUEL_STATS_ENABLED: + if not MASTER_IS_CENTOS7: + self.nailgun_actions.set_collector_address( + settings.FUEL_STATS_HOST, + settings.FUEL_STATS_PORT, + settings.FUEL_STATS_SSL) + # Restart statsenderd to apply settings(Collector address) + self.nailgun_actions.force_fuel_stats_sending() + if settings.FUEL_STATS_ENABLED and not MASTER_IS_CENTOS7: self.fuel_web.client.send_fuel_stats(enabled=True) logger.info('Enabled sending of statistics to {0}:{1}'.format( settings.FUEL_STATS_HOST, settings.FUEL_STATS_PORT @@ -463,8 +510,12 @@ class EnvironmentModel(object): def wait_for_external_config(self, timeout=120): check_cmd = 'pkill -0 -f wait_for_external_config' with self.d_env.get_admin_remote() as remote: - wait(lambda: remote.execute(check_cmd)['exit_code'] == 0, - timeout=timeout) + if MASTER_IS_CENTOS7: + remote.execute(check_cmd) + else: + wait( + lambda: remote.execute(check_cmd)['exit_code'] == 0, + timeout=timeout) @logwrap def kill_wait_for_external_config(self): @@ -521,11 +572,16 @@ class EnvironmentModel(object): raise Exception('Fuel node deployment failed.') def dhcrelay_check(self): + if PREDICTABLE_INTERFACE_NAMES: + iface = 'enp0s3' + else: + iface = 'eth0' + command = "dhcpcheck discover " \ + "--ifaces {iface} " \ + "--repeat 3 " \ + "--timeout 10".format(iface=iface) with self.d_env.get_admin_remote() as admin_remote: - out = admin_remote.execute("dhcpcheck discover " - "--ifaces eth0 " - "--repeat 3 " - "--timeout 10")['stdout'] + out = admin_remote.execute(command)['stdout'] assert_true(self.get_admin_node_ip() in "".join(out), "dhcpcheck doesn't discover master ip") diff --git a/fuelweb_test/models/fuel_web_client.py b/fuelweb_test/models/fuel_web_client.py index 2de8e937b..ee0fd8bdd 100644 --- a/fuelweb_test/models/fuel_web_client.py +++ b/fuelweb_test/models/fuel_web_client.py @@ -71,6 +71,7 @@ from fuelweb_test.settings import OPENSTACK_RELEASE from fuelweb_test.settings import OPENSTACK_RELEASE_UBUNTU from fuelweb_test.settings import OSTF_TEST_NAME from fuelweb_test.settings import OSTF_TEST_RETRIES_COUNT +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.settings import REPLACE_DEFAULT_REPOS from fuelweb_test.settings import REPLACE_DEFAULT_REPOS_ONLY_ONCE from fuelweb_test.settings import TIMEOUT @@ -1168,11 +1169,16 @@ class FuelWebClient(object): ifaces.extend(s['name'] for s in bond['slaves']) return ifaces - # fuelweb_admin is always on eth0 unless the interface is not bonded - if 'eth0' not in get_bond_ifaces(): - interfaces_dict['eth0'] = interfaces_dict.get('eth0', []) - if 'fuelweb_admin' not in interfaces_dict['eth0']: - interfaces_dict['eth0'].append('fuelweb_admin') + # fuelweb_admin is always on 1st iface unless the iface is not bonded + if PREDICTABLE_INTERFACE_NAMES: + iface = 'enp0s3' + else: + iface = 'eth0' + if iface not in get_bond_ifaces(): + interfaces_dict[iface] = interfaces_dict.get(iface, + []) + if 'fuelweb_admin' not in interfaces_dict[iface]: + interfaces_dict[iface].append('fuelweb_admin') def get_iface_by_name(ifaces, name): iface = filter(lambda iface: iface['name'] == name, ifaces) @@ -1307,9 +1313,34 @@ class FuelWebClient(object): 'eth4': ['storage'], } + if PREDICTABLE_INTERFACE_NAMES: + if NEUTRON == net_provider: + assigned_networks = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['private'], + 'enp0s7': ['storage'], + } + else: + assigned_networks = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['fixed'], + 'enp0s7': ['storage'], + } + + if PREDICTABLE_INTERFACE_NAMES: + baremetal_iface = 'eth5' + else: + baremetal_iface = 'enp0s8' if self.get_cluster_additional_components(cluster_id).get( 'ironic', False): - assigned_networks['eth5'] = ['baremetal'] + assigned_networks[baremetal_iface] = ['baremetal'] + + if PREDICTABLE_INTERFACE_NAMES: + logger.info(str(assigned_networks)) if not nailgun_nodes: nailgun_nodes = self.client.list_cluster_nodes(cluster_id) @@ -1398,8 +1429,9 @@ class FuelWebClient(object): devops_env = self.environment.d_env - if 'baremetal' in networks and devops_env.get_networks( - name='ironic'): + if not PREDICTABLE_INTERFACE_NAMES and \ + 'baremetal' in networks and \ + devops_env.get_networks(name='ironic'): ironic_net = self.environment.d_env.get_network( name='ironic').ip subnet1, subnet2 = ironic_net.subnet() diff --git a/fuelweb_test/settings.py b/fuelweb_test/settings.py index 58ce43347..aba8a2241 100644 --- a/fuelweb_test/settings.py +++ b/fuelweb_test/settings.py @@ -30,6 +30,10 @@ TIME_ZONE = 'UTC' ENV_NAME = os.environ.get("ENV_NAME", "fuel_system_test") VIRTUAL_ENV = os.environ.get("VIRTUAL_ENV", "") +MASTER_IS_CENTOS7 = get_var_as_bool('MASTER_IS_CENTOS7', False) +PREDICTABLE_INTERFACE_NAMES = get_var_as_bool('PREDICTABLE_INTERFACE_NAMES', + False) + ISO_PATH = os.environ.get('ISO_PATH') LOGS_DIR = os.environ.get('LOGS_DIR', os.getcwd()) # cdrom or usb @@ -129,6 +133,16 @@ INTERFACES = { 'private': 'eth3', 'storage': 'eth4', } +PREDICTABLE_INTERFACES = { + 'admin': 'enp0s3', + 'public': 'enp0s4', + 'management': 'enp0s5', + 'private': 'enp0s6', + 'storage': 'enp0s7', +} +if PREDICTABLE_INTERFACE_NAMES: + INTERFACES = PREDICTABLE_INTERFACES + # May be one of virtio, e1000, pcnet, rtl8139 INTERFACE_MODEL = os.environ.get('INTERFACE_MODEL', 'virtio') @@ -223,6 +237,12 @@ BONDING_INTERFACES = { 'admin': ['eth0'], 'public': ['eth1', 'eth2', 'eth3', 'eth4'] } +PREDICTABLE_BONDING_INTERFACES = { + 'admin': ['enp0s3'], + 'public': ['enp0s4', 'enp0s5', 'enp0s6', 'enp0s7'] +} +if PREDICTABLE_INTERFACE_NAMES: + BONDING_INTERFACES = PREDICTABLE_BONDING_INTERFACES NETWORK_MANAGERS = { 'flat': 'FlatDHCPManager', diff --git a/fuelweb_test/tests/plugins/plugin_contrail/test_fuel_plugin_contrail.py b/fuelweb_test/tests/plugins/plugin_contrail/test_fuel_plugin_contrail.py index fe7f67be9..df83eacfb 100644 --- a/fuelweb_test/tests/plugins/plugin_contrail/test_fuel_plugin_contrail.py +++ b/fuelweb_test/tests/plugins/plugin_contrail/test_fuel_plugin_contrail.py @@ -28,6 +28,7 @@ from fuelweb_test.settings import CONTRAIL_PLUGIN_PATH from fuelweb_test.settings import CONTRAIL_PLUGIN_PACK_UB_PATH from fuelweb_test.settings import CONTRAIL_PLUGIN_PACK_CEN_PATH from fuelweb_test.settings import NEUTRON_SEGMENT +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.tests.base_test_case import SetupEnvironment from fuelweb_test.tests.base_test_case import TestBasic @@ -738,6 +739,29 @@ class ContrailPlugin(TestBasic): 'storage', ] } + if PREDICTABLE_INTERFACE_NAMES: + raw_data = [{ + 'mac': None, + 'mode': 'active-backup', + 'name': 'bond0', + 'slaves': [ + {'name': 'enp0s7'}, + {'name': 'enp0s5'}, + ], + 'state': None, + 'type': 'bond', + 'assigned_networks': [] + }, ] + + interfaces = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['private'], + 'bond0': [ + 'management', + 'storage', + ] + } cluster_nodes = \ self.fuel_web.client.list_cluster_nodes(self.cluster_id) diff --git a/fuelweb_test/tests/test_bonding_base.py b/fuelweb_test/tests/test_bonding_base.py index dcb64b840..b49bdac0f 100644 --- a/fuelweb_test/tests/test_bonding_base.py +++ b/fuelweb_test/tests/test_bonding_base.py @@ -16,6 +16,7 @@ from proboscis.asserts import assert_false from fuelweb_test import logger from fuelweb_test.helpers.utils import get_net_settings +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.tests.base_test_case import TestBasic @@ -49,6 +50,35 @@ class BondingTest(TestBasic): 'assigned_networks': [] } ] + if PREDICTABLE_INTERFACE_NAMES: + self.BOND_CONFIG = [ + { + 'mac': None, + 'mode': 'active-backup', + 'name': 'bond0', + 'slaves': [ + {'name': 'enp0s8'}, + {'name': 'enp0s7'}, + {'name': 'enp0s6'}, + {'name': 'enp0s5'} + ], + 'state': None, + 'type': 'bond', + 'assigned_networks': [] + }, + { + 'mac': None, + 'mode': 'active-backup', + 'name': 'bond1', + 'slaves': [ + {'name': 'enp0s4'}, + {'name': 'enp0s3'} + ], + 'state': None, + 'type': 'bond', + 'assigned_networks': [] + } + ] self.INTERFACES = { 'bond0': [ diff --git a/fuelweb_test/tests/test_ha_one_controller.py b/fuelweb_test/tests/test_ha_one_controller.py index f9431c8af..dc1b97e7b 100644 --- a/fuelweb_test/tests/test_ha_one_controller.py +++ b/fuelweb_test/tests/test_ha_one_controller.py @@ -28,6 +28,7 @@ from fuelweb_test.settings import NEUTRON_SEGMENT from fuelweb_test.settings import NEUTRON_SEGMENT_TYPE from fuelweb_test.settings import OPENSTACK_RELEASE from fuelweb_test.settings import OPENSTACK_RELEASE_UBUNTU +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.helpers.utils import run_on_remote_get_results from fuelweb_test.tests.base_test_case import SetupEnvironment from fuelweb_test.tests.base_test_case import TestBasic @@ -629,6 +630,13 @@ class NodeMultipleInterfaces(TestBasic): 'eth3': ['private'], 'eth4': ['management'], } + if PREDICTABLE_INTERFACE_NAMES: + interfaces_dict = { + 'enp0s4': ['public'], + 'enp0s5': ['storage'], + 'enp0s6': ['private'], + 'enp0s7': ['management'], + } cluster_id = self.fuel_web.create_cluster( name=self.__class__.__name__, @@ -826,6 +834,13 @@ class UntaggedNetworksNegative(TestBasic): 'eth2': ["management", "storage"], 'eth3': [] } + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ["fixed"], + 'enp0s4': ["public"], + 'enp0s5': ["management", "storage"], + 'enp0s6': [] + } cluster_id = self.fuel_web.create_cluster( name=self.__class__.__name__, diff --git a/fuelweb_test/tests/test_jumbo_frames.py b/fuelweb_test/tests/test_jumbo_frames.py index 0e13aad99..c022404fb 100644 --- a/fuelweb_test/tests/test_jumbo_frames.py +++ b/fuelweb_test/tests/test_jumbo_frames.py @@ -21,6 +21,7 @@ from fuelweb_test.helpers import decorators from fuelweb_test.helpers import os_actions from fuelweb_test import logger from fuelweb_test import settings as CONF +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.tests import base_test_case @@ -246,6 +247,14 @@ class TestJumboFrames(base_test_case.TestBasic): 'eth3': ['private'], 'eth4': ['storage'], } + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['private'], + 'enp0s7': ['storage'], + } interfaces_update = [{ 'name': 'eth3', @@ -254,6 +263,14 @@ class TestJumboFrames(base_test_case.TestBasic): 'disable_offloading': False }, }] + if PREDICTABLE_INTERFACE_NAMES: + interfaces_update = [{ + 'name': 'enp0s6', + 'interface_properties': { + 'mtu': 9000, + 'disable_offloading': False + }, + }] self.fuel_web.update_nodes( cluster_id, @@ -280,11 +297,18 @@ 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: - asserts.assert_true( - self.check_node_iface_mtu(remote, 'eth3', 9000), - "MTU on {0} is not 9000. Actual value: {1}" - .format(remote.host, - self.get_node_iface(remote, "eth3"))) + if PREDICTABLE_INTERFACE_NAMES: + asserts.assert_true( + self.check_node_iface_mtu(remote, 'enp0s6', 9000), + "MTU on {0} is not 9000. Actual value: {1}" + .format(remote.host, + self.get_node_iface(remote, "enp0s6"))) + else: + asserts.assert_true( + self.check_node_iface_mtu(remote, 'eth3', 9000), + "MTU on {0} is not 9000. Actual value: {1}" + .format(remote.host, + self.get_node_iface(remote, "eth3"))) self.check_mtu_size_between_instances(mtu_offset=0) self.env.make_snapshot("ready_jumbo_frames_neutron_vlan") @@ -327,6 +351,14 @@ class TestJumboFrames(base_test_case.TestBasic): 'eth3': ['private'], 'eth4': ['storage'], } + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['private'], + 'enp0s7': ['storage'], + } interfaces_update = [{ 'name': 'eth3', @@ -335,6 +367,14 @@ class TestJumboFrames(base_test_case.TestBasic): 'disable_offloading': False }, }] + if PREDICTABLE_INTERFACE_NAMES: + interfaces_update = [{ + 'name': 'enp0s6', + 'interface_properties': { + 'mtu': 9000, + 'disable_offloading': False + }, + }] self.fuel_web.update_nodes( cluster_id, @@ -361,11 +401,18 @@ 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: - asserts.assert_true( - self.check_node_iface_mtu(remote, 'eth3', 9000), - "MTU on {0} is not 9000. Actual value: {1}" - .format(remote.host, - self.get_node_iface(remote, "eth3"))) + if PREDICTABLE_INTERFACE_NAMES: + asserts.assert_true( + self.check_node_iface_mtu(remote, 'enp0s6', 9000), + "MTU on {0} is not 9000. Actual value: {1}" + .format(remote.host, + self.get_node_iface(remote, "enp0s6"))) + else: + asserts.assert_true( + self.check_node_iface_mtu(remote, 'eth3', 9000), + "MTU on {0} is not 9000. Actual value: {1}" + .format(remote.host, + self.get_node_iface(remote, "eth3"))) self.check_mtu_size_between_instances(mtu_offset=50) self.env.make_snapshot("ready_jumbo_frames_neutron_vxlan") diff --git a/fuelweb_test/tests/test_offloading_types.py b/fuelweb_test/tests/test_offloading_types.py index 769fd9db5..4ccff23d5 100644 --- a/fuelweb_test/tests/test_offloading_types.py +++ b/fuelweb_test/tests/test_offloading_types.py @@ -21,6 +21,7 @@ from fuelweb_test.helpers.checkers import check_offload from fuelweb_test.helpers.decorators import log_snapshot_after_test from fuelweb_test import logger from fuelweb_test.settings import DEPLOYMENT_MODE +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.tests.base_test_case import SetupEnvironment from fuelweb_test.tests.base_test_case import TestBasic @@ -83,6 +84,30 @@ class TestOffloading(TestBasic): 'name': 'large-receive-offload', 'sub': []}]}] + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['private'], + 'enp0s7': ['storage'], + } + + offloading_modes = [{ + 'name': 'enp0s4', + 'offloading_modes': [{ + 'state': 'true', + 'name': 'rx-vlan-offload', + 'sub': []}, { + 'state': 'true', + 'name': 'tx-vlan-offload', + 'sub': []}]}, { + 'name': 'enp0s5', + 'offloading_modes': [{ + 'state': 'false', + 'name': 'large-receive-offload', + 'sub': []}]}] + self.show_step(2) self.show_step(3) self.fuel_web.update_nodes( @@ -190,6 +215,30 @@ class TestOffloading(TestBasic): 'name': 'large-receive-offload', 'sub': []}]}] + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ['fuelweb_admin'], + 'enp0s4': ['public'], + 'enp0s5': ['management'], + 'enp0s6': ['private'], + 'enp0s7': ['storage'], + } + + offloading_modes = [{ + 'name': 'enp0s4', + 'offloading_modes': [{ + 'state': 'true', + 'name': 'rx-vlan-offload', + 'sub': []}, { + 'state': 'true', + 'name': 'tx-vlan-offload', + 'sub': []}]}, { + 'name': 'enp0s5', + 'offloading_modes': [{ + 'state': 'false', + 'name': 'large-receive-offload', + 'sub': []}]}] + self.show_step(2) self.show_step(3) self.fuel_web.update_nodes( diff --git a/fuelweb_test/tests/test_vcenter.py b/fuelweb_test/tests/test_vcenter.py index cf626103d..7ff0c6b2a 100644 --- a/fuelweb_test/tests/test_vcenter.py +++ b/fuelweb_test/tests/test_vcenter.py @@ -20,6 +20,7 @@ from devops.error import TimeoutError from fuelweb_test.helpers.decorators import log_snapshot_after_test from fuelweb_test import logger from fuelweb_test.settings import DEPLOYMENT_MODE +from fuelweb_test.settings import PREDICTABLE_INTERFACE_NAMES from fuelweb_test.settings import SERVTEST_USERNAME from fuelweb_test.settings import SERVTEST_PASSWORD from fuelweb_test.settings import SERVTEST_TENANT @@ -70,6 +71,14 @@ class VcenterDeploy(TestBasic): 'eth3': [], 'eth4': ["storage"] } + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ["fuelweb_admin"], + 'enp0s4': ["public", "fixed"], + 'enp0s5': ["management", ], + 'enp0s6': [], + 'enp0s7': ["storage"] + } slave_nodes = self.fuel_web.client.list_cluster_nodes(cluster_id) for node in slave_nodes: @@ -968,6 +977,14 @@ class VcenterDeploy(TestBasic): 'eth3': [], 'eth4': ["storage"] } + if PREDICTABLE_INTERFACE_NAMES: + interfaces = { + 'enp0s3': ["fuelweb_admin"], + 'enp0s4': ["public", "fixed"], + 'enp0s5': ["management", ], + 'enp0s6': [], + 'enp0s7': ["storage"] + } self.configure_nova_vlan(cluster_id) # Configure VMWare vCenter self.fuel_web.vcenter_configure(cluster_id)