fuel-qa/fuelweb_test/tests/tests_upgrade/upgrader_tool.py

122 lines
4.5 KiB
Python

import os
import signal
from devops.helpers.templates import yaml_template_load
from proboscis import test
from proboscis.asserts import assert_true
from fuelweb_test import settings, logger
from fuelweb_test.helpers.decorators import log_snapshot_after_test
from fuelweb_test.helpers.utils import run_on_remote_get_results
from fuelweb_test.tests.tests_upgrade.test_data_driven_upgrade_base import \
DataDrivenUpgradeBase
@test
class UpgradeCustom(DataDrivenUpgradeBase):
def __init__(self):
super(UpgradeCustom, self).__init__()
data = yaml_template_load(
settings.UPGRADE_TEST_TEMPLATE)['upgrade_data']
self.upgrade_data = data
logger.debug("Got following data from upgrade template:")
logger.debug(''.join(
["{}:{}".format(key, value) for key, value in data.items()]))
self.source_snapshot_name = data["source_snapshot_name"]
self.backup_snapshot_name = data["backup_snapshot_name"]
self.restore_snapshot_name = data["restore_snapshot_name"]
self.tarball_remote_dir = data["tarball_remote_dir"]
self.backup_name = data["backup_name"]
self.repos_backup_name = data["repos_backup_name"]
@test(groups=['upgrade_custom_backup'])
@log_snapshot_after_test
def upgrade_custom_backup(self):
"""Create the backup for given env
Scenario:
1. Install fuel-octane package
2. Create backup file using 'octane fuel-backup'
3. Download the backup to the host
"""
self.check_run(self.backup_snapshot_name)
assert_true(self.source_snapshot_name)
self.env.revert_snapshot(self.source_snapshot_name)
self.do_backup(self.backup_path, self.local_path,
self.repos_backup_path, self.repos_local_path)
self.env.make_snapshot(self.backup_snapshot_name, is_make=True)
@test(groups=['upgrade_custom_restore'])
@log_snapshot_after_test
def upgrade_custom_restore(self):
"""Reinstall Fuel and restore the data.
Scenario:
1. Revert the snapshot
2. Reinstall Fuel master using iso given in ISO_PATH
3. Install fuel-octane package
4. Upload the backup back to reinstalled Fuel maser node
5. Restore master node using 'octane fuel-restore'
"""
self.check_run(self.restore_snapshot_name)
assert_true(os.path.exists(self.repos_local_path))
assert_true(os.path.exists(self.local_path))
self.show_step(1)
assert_true(self.env.revert_snapshot(self.backup_snapshot_name))
self.show_step(2)
post_reinstall_snapshot = "post_reinstall_" + self.backup_snapshot_name
if not self.env.d_env.has_snapshot(post_reinstall_snapshot):
self.reinstall_master_node()
self.env.make_snapshot(post_reinstall_snapshot)
self.env.d_env.resume()
else:
self.env.d_env.revert(post_reinstall_snapshot)
self.env.d_env.resume()
self.show_step(3)
self.show_step(4)
self.show_step(5)
self.do_restore(self.backup_path, self.local_path,
self.repos_backup_path, self.repos_local_path)
self.env.sync_time()
self.env.make_snapshot(self.restore_snapshot_name, is_make=True)
self.cleanup()
@test(groups=['upgrade_custom_tarball'])
def upgrade_custom_tarball(self):
"""Upgrade master node via tarball"""
self.check_run(self.backup_snapshot_name)
assert_true(self.source_snapshot_name)
self.env.revert_snapshot(self.source_snapshot_name)
tarball_name = os.path.basename(settings.TARBALL_PATH)
self.upload_file(settings.TARBALL_PATH, self.tarball_remote_dir)
_, ext = os.path.splitext(tarball_name)
cmd = "cd {} && ".format(self.tarball_remote_dir)
cmd += "tar -xpvf" if ext.endswith("tar") else "lrzuntar"
run_on_remote_get_results(self.admin_remote, cmd)
cmd = "sh {} --no-rollback --password {}".format(
os.path.join(self.tarball_remote_dir, "upgrade.sh"),
settings.KEYSTONE_CREDS['password'])
class UpgradeTimeoutError(Exception):
pass
def handler():
raise UpgradeTimeoutError("Upgrade via tarball timed out!")
signal.signal(signal.SIGALRM, handler)
signal.alarm(60 * 60)
run_on_remote_get_results(self.admin_remote, cmd)
signal.alarm(0)
self.env.make_snapshot(self.restore_snapshot_name, is_make=True)