Normalize extra computes tests and add OL basic verification test

- Do not use RH_* variables for images
- Make some methods paramerized to be used in different tests
- Add basic deployment test with OL compute

Change-Id: I86e616640ff4a162b74ee0da74917f06105b7a39
Related-Bug: #1569374
This commit is contained in:
Victor Ryzhenkin 2016-04-13 02:52:14 +03:00
parent d237e06ec0
commit cc244774fb
6 changed files with 235 additions and 43 deletions

View File

@ -357,6 +357,7 @@ Test extra computes
.. automodule:: fuelweb_test.tests.tests_extra_computes.base_extra_computes
.. automodule:: fuelweb_test.tests.tests_extra_computes.test_rh_basic_actions
.. automodule:: fuelweb_test.tests.tests_extra_computes.test_rh_migration
.. automodule:: fuelweb_test.tests.tests_extra_computes.test_ol_basic_actions
:members:
Test Daemon Resource Allocation Control

View File

@ -656,12 +656,13 @@ RESTART_COUNT = int(os.environ.get("RESTART_COUNT", 10))
# RH-related variables
# Need to update these variables, when image with RH for
# MOS will be available.
RH_IMAGE = os.environ.get("RH_IMAGE")
RH_IMAGE_PATH = os.environ.get("RH_IMAGE_PATH")
RH_IMAGE_MD5 = os.environ.get("RH_IMAGE_MD5")
EXTRA_COMP_IMAGE = os.environ.get("EXTRA_COMP_IMAGE")
EXTRA_COMP_IMAGE_PATH = os.environ.get("EXTRA_COMP_IMAGE_PATH")
EXTRA_COMP_IMAGE_MD5 = os.environ.get("EXTRA_COMP_IMAGE_MD5")
COMPUTE_BOOT_STRATEGY = os.environ.get("COMPUTE_BOOT_STRATEGY", "system")
RH_IMAGE_USER = os.environ.get("RH_IMAGE_USER", "root")
RH_IMAGE_PASSWORD = os.environ.get("RH_IMAGE_PASSWORD", "r00tme")
EXTRA_COMP_IMAGE_USER = os.environ.get("EXTRA_COMP_IMAGE_USER", "root")
EXTRA_COMP_IMAGE_PASSWORD = os.environ.get("EXTRA_COMP_IMAGE_PASSWORD",
"r00tme")
RH_LICENSE_USERNAME = os.environ.get("RH_LICENSE_USERNAME")
RH_LICENSE_PASSWORD = os.environ.get("RH_LICENSE_PASSWORD")
RH_SERVER_URL = os.environ.get("RH_SERVER_URL")
@ -669,6 +670,7 @@ RH_REGISTERED_ORG_NAME = os.environ.get("RH_REGISTERED_ORG_NAME")
RH_ACTIVATION_KEY = os.environ.get("RH_ACTIVATION_KEY")
RH_RELEASE = os.environ.get("RH_RELEASE")
RH_MAJOR_RELEASE = os.environ.get("RH_MAJOR_RELEASE", "7")
OL_MAJOR_RELEASE = os.environ.get("OL_MAJOR_RELEASE", "7")
CENTOS_DUMMY_DEPLOY = get_var_as_bool("CENTOS_DUMMY_DEPLOY", False)
PERESTROIKA_REPO = os.environ.get("PERESTROIKA_REPO")
RH_POOL_HASH = os.environ.get("RH_POOL_HASH")

View File

@ -25,8 +25,8 @@ from fuelweb_test import logger
from fuelweb_test.tests.base_test_case import TestBasic
class RhBase(TestBasic):
"""RH-based compute tests base"""
class ExtraComputesBase(TestBasic):
"""Extra computes tests base"""
def check_slaves_are_ready(self):
devops_nodes = [node for node in self.env.d_env.nodes().slaves
@ -107,12 +107,12 @@ class RhBase(TestBasic):
logger.info('Node {0} became online.'.format(node.name))
@staticmethod
def connect_rh_image(slave):
"""Upload RH image into a target node.
def connect_extra_compute_image(slave):
"""Upload extra compute image into a target node.
:param slave: Target node name.
"""
path = settings.RH_IMAGE_PATH + settings.RH_IMAGE
path = settings.EXTRA_COMP_IMAGE_PATH + settings.EXTRA_COMP_IMAGE
def find_system_drive(node):
drives = node.disk_devices
@ -131,12 +131,16 @@ class RhBase(TestBasic):
logger.debug("Volume path: {0}".format(vol_path))
logger.debug("Image path: {0}".format(path))
def verify_image_connected(self, ip):
def verify_image_connected(self, ip, types='rh'):
"""Check that correct image connected to a target node system volume.
:param ip: Remote node ip to proceed.
:param types: rh or ol
"""
cmd = "cat /etc/redhat-release"
if types is 'rh':
cmd = "cat /etc/redhat-release"
else:
cmd = "cat /etc/oracle-release"
self.ssh_manager.execute_on_remote(
ip, cmd, err_msg="Image doesn't connected")
@ -181,26 +185,34 @@ class RhBase(TestBasic):
self.ssh_manager.execute_on_remote(
ip, cmd, err_msg='RH registration with auto-attaching failed')
def enable_rh_repos(self, ip):
"""Enable Red Hat mirrors on a target node.
def enable_extra_compute_repos(self, ip, types='rh'):
"""Enable requested family mirrors on a target node.
:param ip: Remote node ip for proceed.
:param types: rh or ol
"""
cmd = ("yum-config-manager --enable rhel-{0}-server-optional-rpms && "
"yum-config-manager --enable rhel-{0}-server-extras-rpms &&"
"yum-config-manager --enable rhel-{0}-server-rh-common-rpms"
.format(settings.RH_MAJOR_RELEASE))
if types is 'rh':
cmd = (
"yum-config-manager --enable rhel-{0}-server-optional-rpms &&"
" yum-config-manager --enable rhel-{0}-server-extras-rpms &&"
" yum-config-manager --enable rhel-{0}-server-rh-common-rpms"
.format(settings.RH_MAJOR_RELEASE))
else:
cmd = ("yum-config-manager --enable ol{0}_addons && "
"yum-config-manager --enable ol{0}_optional_latest"
.format(settings.OL_MAJOR_RELEASE))
self.ssh_manager.execute_on_remote(
ip, cmd, err_msg='Enabling RH repos failed')
ip, cmd, err_msg='Enabling requested family repos failed')
def set_hostname(self, ip, host_number=1):
def set_hostname(self, ip, types='rh', host_number=1):
"""Set hostname with domain for a target node.
:param host_number: Node index nubmer (1 by default).
:param types: rh or ol
:param ip: Remote node ip for proceed.
"""
hostname = "rh-{0}.test.domain.local".format(host_number)
hostname = "{0}-{1}.test.domain.local".format(types, host_number)
cmd = ("sysctl kernel.hostname={0} && "
"echo '{0}' > /etc/hostname".format(hostname))
@ -379,7 +391,7 @@ class RhBase(TestBasic):
ip, cmd, err_msg='Can not recover ssh key for node')
cmd = "cd ~/rh_backup-{2} && scp astute.yaml {0}@{1}:/etc/.".format(
settings.RH_IMAGE_USER, ip, node)
settings.EXTRA_COMP_IMAGE_USER, ip, node)
logger.debug("Restoring astute.yaml for node with ip {0}".format(ip))
self.ssh_manager.execute_on_remote(
remote_admin_ip, cmd, err_msg='Can not restore astute.yaml')
@ -391,7 +403,7 @@ class RhBase(TestBasic):
cmd = (
"cd ~/rh_backup-{2} && scp -r nova {0}@{1}:/var/lib/astute/.".
format(settings.RH_IMAGE_USER, ip, node)
format(settings.EXTRA_COMP_IMAGE_USER, ip, node)
)
logger.debug("Restoring nova ssh-keys")
self.ssh_manager.execute_on_remote(
@ -400,7 +412,7 @@ class RhBase(TestBasic):
if ceph:
cmd = (
"cd ~/rh_backup-{2} && scp -r ceph {0}@{1}:/var/lib/astute/."
.format(settings.RH_IMAGE_USER, ip, node)
.format(settings.EXTRA_COMP_IMAGE_USER, ip, node)
)
logger.debug("Restoring ceph ssh-keys")
self.ssh_manager.execute_on_remote(
@ -511,8 +523,8 @@ class RhBase(TestBasic):
:param ip: IP address of a target node where to sync.
"""
cmd = ("rsync -avz /etc/puppet/modules/* "
"{0}@{1}:/etc/puppet/modules/".format(settings.RH_IMAGE_USER,
ip))
"{0}@{1}:/etc/puppet/modules/".
format(settings.EXTRA_COMP_IMAGE_USER, ip))
self.ssh_manager.execute_on_remote(
master_node_ip, cmd, err_msg='Rsync puppet modules failed')
@ -552,3 +564,12 @@ class RhBase(TestBasic):
cmd = "cd ~/ && scp hosts {0}:/etc/".format(target_ip)
self.ssh_manager.execute_on_remote(
ip, cmd, err_msg='Can not restore hosts file.')
def clean_custom_repos(self, ip):
"""Remove custom repo files
:param ip: Node ip to clean
"""
cmd = "cd /etc/yum.repos.d && rm -f *mir* && yum clean all"
self.ssh_manager.execute_on_remote(
ip, cmd, err_msg='Can not clean custom repos.')

View File

@ -0,0 +1,166 @@
# 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.
from proboscis import asserts
from proboscis import test
from fuelweb_test.helpers import checkers
from fuelweb_test.helpers.decorators import log_snapshot_after_test
from fuelweb_test.helpers import os_actions
from fuelweb_test import settings
from fuelweb_test import logger
from fuelweb_test.tests.base_test_case import SetupEnvironment
from fuelweb_test.tests.tests_extra_computes.base_extra_computes \
import ExtraComputesBase
@test(groups=["ol", "ol.ha_one_controller", "ol.basic"])
class OlHaOneController(ExtraComputesBase):
"""OL-based compute HA One Controller basic test"""
@test(depends_on=[SetupEnvironment.prepare_slaves_3],
groups=["deploy_ol_compute_ha_one_controller_tun"])
@log_snapshot_after_test
def deploy_ol_compute_ha_one_controller_tun(self):
"""Deploy OL-based compute in HA One Controller mode
with Neutron VXLAN
Scenario:
1. Check required image.
2. Revert snapshot 'ready_with_3_slaves'.
3. Create a Fuel cluster.
4. Update cluster nodes with required roles.
5. Deploy the Fuel cluster.
6. Run OSTF.
7. Backup astute.yaml and ssh keys from compute.
8. Boot compute with OL image.
9. Prepare node for Puppet run.
10. Execute modular tasks for compute.
11. Run OSTF.
Duration: 150m
Snapshot: deploy_ol_compute_ha_one_controller_tun
"""
self.show_step(1, initialize=True)
logger.debug('Check MD5 sum of OL 7 image')
check_image = checkers.check_image(
settings.EXTRA_COMP_IMAGE,
settings.EXTRA_COMP_IMAGE_MD5,
settings.EXTRA_COMP_IMAGE_PATH)
asserts.assert_true(check_image,
'Provided image is incorrect. '
'Please, check image path and md5 sum of it.')
self.show_step(2)
self.env.revert_snapshot("ready_with_3_slaves")
self.show_step(3)
logger.debug('Create Fuel cluster OL-based compute tests')
data = {
'volumes_lvm': True,
'net_provider': 'neutron',
'net_segment_type': settings.NEUTRON_SEGMENT['tun'],
'tenant': 'admin',
'user': 'admin',
'password': 'admin'
}
cluster_id = self.fuel_web.create_cluster(
name=self.__class__.__name__,
mode=settings.DEPLOYMENT_MODE,
settings=data
)
self.show_step(4)
self.fuel_web.update_nodes(
cluster_id,
{
'slave-01': ['controller'],
'slave-02': ['compute'],
'slave-03': ['cinder']
}
)
self.show_step(5)
self.fuel_web.deploy_cluster_wait(cluster_id)
cluster_vip = self.fuel_web.get_public_vip(cluster_id)
os_conn = os_actions.OpenStackActions(
cluster_vip, data['user'], data['password'], data['tenant'])
self.show_step(6)
self.fuel_web.run_ostf(cluster_id=cluster_id,
test_sets=['smoke', 'sanity'])
self.show_step(7)
compute = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
cluster_id, ['compute'])[0]
controller = self.fuel_web.get_nailgun_cluster_nodes_by_roles(
cluster_id, ['controller'])[0]
logger.debug('Got node: {0}'.format(compute))
target_node = self.fuel_web.get_devops_node_by_nailgun_node(
compute)
logger.debug('DevOps Node: {0}'.format(target_node))
target_node_ip = compute['ip']
controller_ip = controller['ip']
logger.debug('Acquired ip: {0} for node: {1}'.format(
target_node_ip, target_node.name))
old_hostname = self.save_node_hostname(target_node_ip)
self.backup_required_information(self.ssh_manager.admin_ip,
target_node_ip)
self.show_step(8)
target_node.destroy()
asserts.assert_false(target_node.driver.node_active(node=target_node),
'Target node still active')
self.connect_extra_compute_image(target_node)
target_node.start()
asserts.assert_true(target_node.driver.node_active(node=target_node),
'Target node did not start')
self.wait_for_slave_provision(target_node_ip)
self.verify_image_connected(target_node_ip, types='ol')
self.show_step(9)
self.restore_information(target_node_ip, self.ssh_manager.admin_ip)
self.set_hostname(target_node_ip, types='ol')
self.clean_custom_repos(target_node_ip)
self.install_yum_components(target_node_ip)
self.enable_extra_compute_repos(target_node_ip, types='ol')
self.set_repo_for_perestroika(target_node_ip)
self.check_hiera_installation(target_node_ip)
self.install_ruby_puppet(target_node_ip)
self.check_rsync_installation(target_node_ip)
self.rsync_puppet_modules(self.ssh_manager.admin_ip, target_node_ip)
self.show_step(10)
self.apply_first_part_puppet(target_node_ip)
self.apply_networking_puppet(target_node_ip)
self.check_netconfig_success(target_node_ip)
self.apply_last_part_puppet(target_node_ip)
self.remove_old_compute_services(controller_ip, old_hostname)
self.fuel_web.assert_cluster_ready(os_conn, smiles_count=5)
self.show_step(11)
self.fuel_web.run_ostf(cluster_id=cluster_id,
test_sets=['smoke', 'sanity'])
self.env.make_snapshot("ready_ha_one_controller_with_ol_compute",
is_make=True)

View File

@ -24,11 +24,12 @@ from fuelweb_test.helpers import os_actions
from fuelweb_test import settings
from fuelweb_test import logger
from fuelweb_test.tests.base_test_case import SetupEnvironment
from fuelweb_test.tests.tests_extra_computes.base_extra_computes import RhBase
from fuelweb_test.tests.tests_extra_computes.base_extra_computes \
import ExtraComputesBase
@test(groups=["rh", "rh.ha_one_controller", "rh.basic"])
class RhHaOneController(RhBase):
class RhHaOneController(ExtraComputesBase):
"""RH-based compute HA One Controller basic test"""
@test(depends_on=[SetupEnvironment.prepare_slaves_3],
@ -58,9 +59,9 @@ class RhHaOneController(RhBase):
self.show_step(1, initialize=True)
logger.debug('Check MD5 sum of RH 7 image')
check_image = checkers.check_image(
settings.RH_IMAGE,
settings.RH_IMAGE_MD5,
settings.RH_IMAGE_PATH)
settings.EXTRA_COMP_IMAGE,
settings.EXTRA_COMP_IMAGE_MD5,
settings.EXTRA_COMP_IMAGE_PATH)
asserts.assert_true(check_image,
'Provided image is incorrect. '
'Please, check image path and md5 sum of it.')
@ -129,7 +130,7 @@ class RhHaOneController(RhBase):
target_node.destroy()
asserts.assert_false(target_node.driver.node_active(node=target_node),
'Target node still active')
self.connect_rh_image(target_node)
self.connect_extra_compute_image(target_node)
target_node.start()
asserts.assert_true(target_node.driver.node_active(node=target_node),
'Target node did not start')
@ -145,7 +146,7 @@ class RhHaOneController(RhBase):
self.register_rh_subscription(target_node_ip)
self.install_yum_components(target_node_ip)
if not settings.CENTOS_DUMMY_DEPLOY:
self.enable_rh_repos(target_node_ip)
self.enable_extra_compute_repos(target_node_ip)
self.set_repo_for_perestroika(target_node_ip)
self.check_hiera_installation(target_node_ip)
self.install_ruby_puppet(target_node_ip)
@ -171,7 +172,7 @@ class RhHaOneController(RhBase):
@test(groups=['rh', 'rh.failover_group'])
class RHFailoverGroup(RhBase):
class RhFailoverGroup(ExtraComputesBase):
"""Failover tests for RH-based computes"""
@test(depends_on_groups=['deploy_rh_compute_ha_one_controller_tun'],

View File

@ -21,11 +21,12 @@ from fuelweb_test.helpers import os_actions
from fuelweb_test import settings
from fuelweb_test import logger
from fuelweb_test.tests.base_test_case import SetupEnvironment
from fuelweb_test.tests.tests_extra_computes.base_extra_computes import RhBase
from fuelweb_test.tests.tests_extra_computes.base_extra_computes \
import ExtraComputesBase
@test(groups=['rh.migration'])
class RhHAOneControllerMigration(RhBase):
class RhHAOneControllerMigration(ExtraComputesBase):
"""RH-based compute HA migration test"""
@test(depends_on=[SetupEnvironment.prepare_slaves_5],
groups=["check_vm_migration_rh_ha_one_controller_tun"])
@ -55,9 +56,9 @@ class RhHAOneControllerMigration(RhBase):
self.show_step(1, initialize=True)
logger.debug('Check MD5 sum of RH 7 image')
check_image = checkers.check_image(
settings.RH_IMAGE,
settings.RH_IMAGE_MD5,
settings.RH_IMAGE_PATH)
settings.EXTRA_COMP_IMAGE,
settings.EXTRA_COMP_IMAGE_MD5,
settings.EXTRA_COMP_IMAGE_PATH)
asserts.assert_true(check_image,
'Provided image is incorrect. '
'Please, check image path and md5 sum of it.')
@ -151,8 +152,8 @@ class RhHAOneControllerMigration(RhBase):
asserts.assert_false(
target_node_two.driver.node_active(node=target_node_two),
'Target node still active')
self.connect_rh_image(target_node_one)
self.connect_rh_image(target_node_two)
self.connect_extra_compute_image(target_node_one)
self.connect_extra_compute_image(target_node_two)
target_node_one.start()
asserts.assert_true(
target_node_one.driver.node_active(node=target_node_one),
@ -178,7 +179,7 @@ class RhHAOneControllerMigration(RhBase):
self.register_rh_subscription(target_node_one_ip)
self.install_yum_components(target_node_one_ip)
if not settings.CENTOS_DUMMY_DEPLOY:
self.enable_rh_repos(target_node_one_ip)
self.enable_extra_compute_repos(target_node_one_ip)
self.set_repo_for_perestroika(target_node_one_ip)
self.check_hiera_installation(target_node_one_ip)
self.install_ruby_puppet(target_node_one_ip)
@ -189,7 +190,7 @@ class RhHAOneControllerMigration(RhBase):
self.register_rh_subscription(target_node_two_ip)
self.install_yum_components(target_node_two_ip)
if not settings.CENTOS_DUMMY_DEPLOY:
self.enable_rh_repos(target_node_two_ip)
self.enable_extra_compute_repos(target_node_two_ip)
self.set_repo_for_perestroika(target_node_two_ip)
self.check_hiera_installation(target_node_two_ip)
self.install_ruby_puppet(target_node_two_ip)