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:
parent
6ba592d7da
commit
359519dd29
|
@ -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')
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
system_tests:
|
||||
tags:
|
||||
- master
|
Loading…
Reference in New Issue