8e27510791
SSHManager.update_connection: add possibility to open new connection with parameters, if no connection presents. This testgroup should be run with this parameters: export MULTIPATH=True export SLAVE_MULTIPATH_DISKS_COUNT=2 export MULTIPATH_TEMPLATE=system_test/tests_templates/tests_configs/multipath_3_nodes.yaml Closes-Bug: 1582260 Change-Id: I73ffc4338b59c8b44eabe27b2d759b7fbbba19a4
204 lines
7.1 KiB
Python
204 lines
7.1 KiB
Python
# Copyright 2016 Mirantis, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import re
|
|
|
|
from proboscis.asserts import assert_equal
|
|
from proboscis import test
|
|
|
|
from fuelweb_test.helpers.checkers import ssh_manager
|
|
from fuelweb_test.helpers.utils import TimeStat
|
|
from fuelweb_test.settings import DEPLOYMENT_MODE
|
|
from fuelweb_test.settings import MULTIPATH
|
|
from fuelweb_test.settings import MULTIPATH_TEMPLATE
|
|
from fuelweb_test.settings import NEUTRON_SEGMENT
|
|
from fuelweb_test.settings import SLAVE_MULTIPATH_DISKS_COUNT
|
|
from fuelweb_test.tests import base_test_case
|
|
from gates_tests.helpers import exceptions
|
|
from system_test.core.discover import load_yaml
|
|
|
|
|
|
@test
|
|
class TestMultipath(base_test_case.TestBasic):
|
|
"""TestMultipath.
|
|
|
|
Required environment variables:
|
|
* MULTIPATH=true
|
|
* SLAVE_MULTIPATH_DISKS_COUNT>=2
|
|
* MULTIPATH_TEMPLATE=
|
|
system_test/tests_templates/tests_configs/multipath_3_nodes.yaml
|
|
"""
|
|
|
|
@staticmethod
|
|
def check_multipath_devices(ip, slave_multipath_disks_count):
|
|
"""Check if multipath devices contain SLAVE_MULTIPATH_DISKS_COUNT of
|
|
disks. If yes return True, if no - False.
|
|
|
|
:rtype: bool
|
|
"""
|
|
cmd = "multipath -l -v2"
|
|
|
|
ssh_manager.update_connection(ip, login='root',
|
|
keys=ssh_manager._get_keys())
|
|
ssh_manager._get_remote(ip)
|
|
result = ssh_manager.execute_on_remote(
|
|
ip=ip,
|
|
cmd=cmd,
|
|
err_msg="Failed to check multipath on node {}".format(ip)
|
|
)
|
|
multipath_info = [res.rstrip() for res in result['stdout']]
|
|
disk = re.compile('(?P<id>^[\d|\w]+)\s+(?P<dm>dm-\d+)')
|
|
status = re.compile(
|
|
'\d+:\d+:\d+:\d+\s+(?P<devnode>\w+)'
|
|
'\s+\d+:\d+\s+(?P<dm_status>\w+)'
|
|
'\s+(?P<path_status>\w+)'
|
|
'\s+(?P<online_status>\w+)'
|
|
)
|
|
dm = None
|
|
disks = dict()
|
|
for line in multipath_info:
|
|
m = re.match(disk, line)
|
|
if m:
|
|
dm = m.group('dm')
|
|
disks[dm] = []
|
|
continue
|
|
|
|
m = re.search(status, line)
|
|
if m:
|
|
disks[dm].append(m.group('devnode'))
|
|
assert_equal(
|
|
m.group('dm_status'),
|
|
'active',
|
|
"Device {0} is in '{1}' status on {2}".format(
|
|
m.group('devnode'), m.group('dm_status'), dm))
|
|
assert_equal(
|
|
m.group('online_status'),
|
|
'running',
|
|
"Device {0} is in '{1}' status on {2}".format(
|
|
m.group('devnode'), m.group('online_status'), dm))
|
|
for disk in disks:
|
|
assert_equal(len(disks[disk]),
|
|
slave_multipath_disks_count,
|
|
"{0}: wrong path count: {1}. Must be {2}".format(
|
|
disk, len(disk), slave_multipath_disks_count))
|
|
|
|
@staticmethod
|
|
def get_os_root_multipath_count(ip):
|
|
"""Returns count of root partitions on multipath devices.
|
|
|
|
:rtype: int
|
|
"""
|
|
cmd = "lsblk -lo NAME,TYPE,MOUNTPOINT | grep '/$' | grep lvm | wc -l"
|
|
|
|
ssh_manager.update_connection(ip, login='root',
|
|
keys=ssh_manager._get_keys())
|
|
ssh_manager._get_remote(ip)
|
|
result = ssh_manager.execute_on_remote(
|
|
ip=ip,
|
|
cmd=cmd,
|
|
err_msg="Failed to check lsblk on node {}".format(ip))
|
|
return int(result['stdout_str'])
|
|
|
|
@test(groups=["bootstrap_multipath"])
|
|
def bootstrap_multipath(self):
|
|
"""Bootstrap node with multipath devices
|
|
|
|
Scenario:
|
|
1. Setup environment
|
|
2. Bootstrap slave nodes
|
|
3. Verify multipath devices on the nodes
|
|
|
|
Duration 30m
|
|
|
|
"""
|
|
if not MULTIPATH:
|
|
raise exceptions.FuelQAVariableNotSet(
|
|
'MULTIPATH', 'true')
|
|
if not MULTIPATH_TEMPLATE:
|
|
raise exceptions.FuelQAVariableNotSet(
|
|
'MULTIPATH_TEMPLATE',
|
|
'system_test/tests_templates/tests_configs/'
|
|
'multipath_3_nodes.yaml')
|
|
if int(SLAVE_MULTIPATH_DISKS_COUNT) < 1:
|
|
raise exceptions.FuelQAVariableNotSet(
|
|
'SLAVE_MULTIPATH_DISKS_COUNT', '2')
|
|
|
|
self.show_step(1)
|
|
self._devops_config = load_yaml(MULTIPATH_TEMPLATE)
|
|
with TimeStat("setup_environment", is_uniq=True):
|
|
self.env.setup_environment()
|
|
self.fuel_post_install_actions()
|
|
self.fuel_web.get_nailgun_version()
|
|
self.fuel_web.change_default_network_settings()
|
|
|
|
self.show_step(2)
|
|
self.env.bootstrap_nodes(self.env.d_env.nodes().slaves[:3],
|
|
skip_timesync=True)
|
|
|
|
self.show_step(3)
|
|
for ip in [node['ip'] for node in self.fuel_web.client.list_nodes()]:
|
|
self.check_multipath_devices(ip, SLAVE_MULTIPATH_DISKS_COUNT)
|
|
|
|
@test(depends_on_groups=["bootstrap_multipath"],
|
|
groups=["deploy_multipath"])
|
|
def deploy_multipath(self):
|
|
"""Deploy cluster with multipath devices
|
|
|
|
Scenario:
|
|
1. Create cluster with 1 controller, 1 compute and 1 cinder roles
|
|
2. Run network verification
|
|
3. Provision the cluster
|
|
4. Verify multipath devices on nodes
|
|
5. Deploy the cluster
|
|
6. Run OSTF
|
|
|
|
Duration 50m
|
|
|
|
"""
|
|
self.show_step(1)
|
|
cluster_id = self.fuel_web.create_cluster(
|
|
name=self.__class__.__name__,
|
|
mode=DEPLOYMENT_MODE,
|
|
settings={
|
|
"net_segment_type": NEUTRON_SEGMENT['vlan'],
|
|
}
|
|
)
|
|
self.fuel_web.update_nodes(
|
|
cluster_id, {
|
|
'slave-01': ['controller'],
|
|
'slave-02': ['compute'],
|
|
'slave-03': ['cinder']
|
|
}
|
|
)
|
|
|
|
self.show_step(2)
|
|
self.fuel_web.verify_network(cluster_id)
|
|
|
|
self.show_step(3)
|
|
self.fuel_web.provisioning_cluster_wait(cluster_id)
|
|
|
|
self.show_step(4)
|
|
for ip in [node['ip'] for node in self.fuel_web.client.list_nodes()]:
|
|
self.check_multipath_devices(ip, SLAVE_MULTIPATH_DISKS_COUNT)
|
|
assert_equal(
|
|
self.get_os_root_multipath_count(ip),
|
|
SLAVE_MULTIPATH_DISKS_COUNT,
|
|
"Wrong lvm structure of multipath device on {}".format(ip))
|
|
|
|
self.show_step(5)
|
|
self.fuel_web.deploy_task_wait(cluster_id)
|
|
|
|
self.show_step(6)
|
|
self.fuel_web.run_ostf(cluster_id=cluster_id)
|