Add test for master patching

- Add tests to patch master node with existing environment,
reset and delete cluster and then deploy new cluster

Change-Id: I972848ede2a8cc6f5c33044b111dcd90e30d2e1b
Implements: blueprint mos-patching-tests
This commit is contained in:
asledzinskiy 2015-04-02 17:47:14 +03:00
parent 6ba592d7da
commit 359519dd29
5 changed files with 187 additions and 9 deletions

View File

@ -22,6 +22,7 @@ from urlparse import urlparse
from xml.dom.minidom import parseString
from proboscis import register
from proboscis import SkipTest
from proboscis import TestProgram
from proboscis.asserts import assert_equal
from proboscis.asserts import assert_is_not_none
@ -69,12 +70,14 @@ patching_validation_schema = {
}
def map_test():
def map_test(target):
assert_is_not_none(settings.PATCHING_BUG_ID,
"Bug ID wasn't specified, can't start patching tests!")
errata = get_errata(path=settings.PATCHING_APPLY_TESTS,
bug_id=settings.PATCHING_BUG_ID)
verify_errata(errata)
if not target == errata['target']:
raise SkipTest()
if 'fixed-pkgs' in errata.keys():
distro = settings.OPENSTACK_RELEASE.lower()
settings.PATCHING_PKGS = set([re.split('=|<|>', package)[0] for package
@ -103,8 +106,12 @@ def map_test():
if deployment_test:
settings.PATCHING_SNAPSHOT = 'patching_after_{0}'.format(
deployment_test.entry.method.im_func.func_name)
register(groups=['prepare_patching_environment'],
depends_on=[deployment_test.entry.home])
if target == 'master':
register(groups=['prepare_master_environment'],
depends_on=[deployment_test.entry.home])
else:
register(groups=['prepare_patching_environment'],
depends_on=[deployment_test.entry.home])
else:
raise Exception("Test with groups {0} not found.".format(tests_groups))
@ -267,6 +274,25 @@ def connect_slaves_to_repo(environment, nodes, repo_name):
environment.execute_remote_cmd(remote, cmd, exit_code=0)
def connect_admin_to_repo(environment, repo_name):
repo_ip = environment.get_admin_node_ip()
repo_port = '8080'
repourl = 'http://{master_ip}:{repo_port}/{repo_name}/'.format(
master_ip=repo_ip, repo_name=repo_name, repo_port=repo_port)
cmds = [
"yum-config-manager --add-repo {url}".format(url=repourl),
"echo -e 'gpgcheck=0\npriority=20' >>/etc/yum.repos.d/{ip}_{port}_"
"{repo}_.repo".format(ip=repo_ip, repo=repo_name, port=repo_port),
"yum -y clean all",
"yum check-update; [[ $? -eq 100 ]]"
]
remote = environment.d_env.get_admin_remote()
for cmd in cmds:
environment.execute_remote_cmd(remote, cmd, exit_code=0)
def update_packages(environment, remote, packages, exclude_packages=None):
if settings.OPENSTACK_RELEASE == settings.OPENSTACK_RELEASE_UBUNTU:
cmds = [
@ -459,9 +485,9 @@ def run_actions(environment, slaves, action_type='patch-scenario'):
environment.fuel_web.warm_restart_nodes(devops_nodes)
def apply_patches(environment, slaves):
def apply_patches(environment, slaves=None):
run_actions(environment, slaves, action_type='patch-scenario')
def verify_fix(environment, slaves):
def verify_fix(environment, slaves=None):
run_actions(environment, slaves, action_type='verify-scenario')

View File

@ -59,7 +59,10 @@ def run_tests():
if __name__ == '__main__':
import_tests()
if any(re.search(r'--group=patching.*', arg) for arg in sys.argv):
from fuelweb_test.helpers.patching import map_test
map_test()
from fuelweb_test.helpers.patching import map_test
if any(re.search(r'--group=patching_master_tests', arg)
for arg in sys.argv):
map_test('master')
elif any(re.search(r'--group=patching.*', arg) for arg in sys.argv):
map_test('environment')
run_tests()

View File

@ -34,7 +34,7 @@ from fuelweb_test import logger
@test(groups=["thread_2"])
class OneNodeDeploy(TestBasic):
@test(depends_on=[SetupEnvironment.prepare_release],
groups=["deploy_one_node"])
groups=["deploy_one_node", 'master'])
@log_snapshot_on_error
def deploy_one_node(self):
"""Deploy cluster with controller node only

View File

@ -16,11 +16,15 @@ import time
from proboscis import test
from proboscis.asserts import assert_is_not_none
from proboscis.asserts import assert_true
from devops.error import TimeoutError
from devops.helpers.helpers import wait
from fuelweb_test import logger
from fuelweb_test import settings
from fuelweb_test.helpers import patching
from fuelweb_test.helpers.decorators import log_snapshot_on_error
from fuelweb_test.helpers.utils import install_pkg
from fuelweb_test.tests.base_test_case import TestBasic
@ -103,5 +107,147 @@ class PatchingTests(TestBasic):
# coming soon...
@test(groups=["patching_master_tests"])
class PatchingMasterTests(TestBasic):
def __init__(self):
self.snapshot_name = settings.PATCHING_SNAPSHOT
self.pkgs = settings.PATCHING_PKGS
super(PatchingMasterTests, self).__init__()
@test(groups=['prepare_master_environment'])
def prepare_patching_environment(self):
logger.debug('Creating snapshot of environment deployed for patching.')
self.env.make_snapshot(snapshot_name=self.snapshot_name,
is_make=True)
@test(groups=["patching_test"],
depends_on_groups=['prepare_master_environment'])
@log_snapshot_on_error
def patching_test(self):
"""Apply patches on deployed master
Scenario:
1. Download patched packages on master node and make local repositories
2. Perform actions required to apply patches
3. Verify that fix works
4. Run OSTF
5. Run network verification
6. Reset and delete cluster
7. Bootstrap 3 slaves
Duration 30m
"""
if not self.env.revert_snapshot(self.snapshot_name):
raise PatchingTestException('Environment revert from snapshot "{0}'
'" failed.'.format(self.snapshot_name))
# Step #1
remote = self.env.d_env.get_admin_remote()
install_pkg(remote, 'yum-utils')
patching_repos = patching.add_remote_repositories(self.env)
for repo in patching_repos:
patching.connect_admin_to_repo(self.env, repo)
# Step #2
logger.info('Applying fix...')
patching.apply_patches(self.env)
# Step #3
logger.info('Verifying fix...')
patching.verify_fix(self.env)
# Step #4
active_nodes = []
for node in self.env.d_env.nodes().slaves:
if node.driver.node_active(node):
active_nodes.append(node)
logger.debug('active nodes are {}'.format(active_nodes))
cluster_id = self.fuel_web.get_last_created_cluster()
if self.fuel_web.get_last_created_cluster():
number_of_nodes = len(self.fuel_web.client.list_cluster_nodes(
cluster_id))
self.fuel_web.run_ostf(cluster_id=cluster_id)
if number_of_nodes > 1:
self.fuel_web.verify_network(cluster_id)
self.env.bootstrap_nodes(
self.env.d_env.nodes().
slaves[number_of_nodes:number_of_nodes + 1])
self.fuel_web.update_nodes(
cluster_id,
{'slave-0{}'.format(number_of_nodes + 1): ['compute']},
True, False)
self.fuel_web.deploy_cluster_wait(cluster_id)
nailgun_nodes = self.fuel_web.update_nodes(
cluster_id,
{'slave-0{}'.format(number_of_nodes + 1): ['compute']},
False, True)
nodes = filter(
lambda x: x["pending_deletion"] is True, nailgun_nodes)
self.fuel_web.deploy_cluster(cluster_id)
wait(
lambda: self.fuel_web.is_node_discovered(nodes[0]),
timeout=6 * 60)
self.fuel_web.stop_reset_env_wait(cluster_id)
self.fuel_web.wait_nodes_get_online_state(
active_nodes, timeout=10 * 60)
self.fuel_web.client.delete_cluster(cluster_id)
try:
wait((lambda: len(
self.fuel_web.client.list_nodes()) == number_of_nodes),
timeout=5 * 60)
except TimeoutError:
assert_true(len(
self.fuel_web.client.list_nodes()) == number_of_nodes,
'Nodes are not discovered in timeout 5 *60')
self.env.bootstrap_nodes(self.env.d_env.nodes().slaves[:3])
@test(groups=["patching_master"],
depends_on_groups=['patching_test'])
@log_snapshot_on_error
def patching_master(self):
"""
Deploy cluster after master node patching
Scenario:
1. Create cluster
2. Add 1 node with controller role
3. Add 2 nodes with compute role
4. Deploy the cluster
5. Run network verification
6. Run OSTF
Duration 50m
"""
cluster_id = self.fuel_web.create_cluster(
name=self.__class__.__name__,
mode=settings.DEPLOYMENT_MODE,
settings={
"net_provider": 'neutron',
"net_segment_type": settings.NEUTRON_SEGMENT_TYPE,
'tenant': 'patchingMaster',
'user': 'patchingMaster',
'password': 'patchingMaster'
}
)
self.fuel_web.update_nodes(
cluster_id,
{
'slave-01': ['controller'],
'slave-02': ['compute'],
'slave-03': ['compute']
}
)
self.fuel_web.deploy_cluster_wait(cluster_id)
self.fuel_web.verify_network(cluster_id)
self.fuel_web.run_ostf(
cluster_id=cluster_id)
class PatchingTestException(Exception):
pass

View File

@ -0,0 +1,3 @@
system_tests:
tags:
- master