Backup tests verify restored databases
The backup scenario tests currently only verify data in the helper database. We should also make sure no other databases are created or deleted in the process. Also removed a leftover mixin class. That code was not used anywhere. Also change the base instance name pattern to allow selecting the name by double-clicking it. (Linux bash stops at ':', and Mac equvalent stops at ':' and '-'. Windows shell always selects the whole thing.) Change-Id: I01ad0472bde59a95c619fb881cef976937b79fa6
This commit is contained in:
parent
79006ce163
commit
984817e9e8
|
@ -264,6 +264,11 @@ class BackupInstCreateWaitGroup(TestGroup):
|
|||
"""Verify data in restored instance."""
|
||||
self.test_runner.run_verify_data_in_restored_instance()
|
||||
|
||||
@test(depends_on=[restore_from_backup_completed])
|
||||
def verify_databases_in_restored_instance(self):
|
||||
"""Verify databases in restored instance."""
|
||||
self.test_runner.run_verify_databases_in_restored_instance()
|
||||
|
||||
|
||||
@test(depends_on_groups=[groups.BACKUP_INC_INST_CREATE],
|
||||
groups=[GROUP, groups.BACKUP_INC_INST,
|
||||
|
@ -286,6 +291,11 @@ class BackupIncInstCreateWaitGroup(TestGroup):
|
|||
"""Verify data in restored inc 1 instance."""
|
||||
self.test_runner.run_verify_data_in_restored_inc_1_instance()
|
||||
|
||||
@test(depends_on=[restore_from_inc_1_backup_completed])
|
||||
def verify_databases_in_restored_inc_1_instance(self):
|
||||
"""Verify databases in restored inc 1 instance."""
|
||||
self.test_runner.run_verify_databases_in_restored_inc_1_instance()
|
||||
|
||||
|
||||
@test(depends_on_groups=[groups.BACKUP_INST_CREATE_WAIT],
|
||||
groups=[GROUP, groups.BACKUP_INST, groups.BACKUP_INST_DELETE],
|
||||
|
|
|
@ -23,90 +23,7 @@ from trove.tests.scenario.helpers.test_helper import DataType
|
|||
from trove.tests.scenario.runners.test_runners import TestRunner
|
||||
|
||||
|
||||
class BackupRunnerMixin(TestRunner):
|
||||
def _verify_backup(self, backup_id):
|
||||
def _result_is_active():
|
||||
backup = self.auth_client.backups.get(backup_id)
|
||||
if backup.status == 'COMPLETED':
|
||||
return True
|
||||
else:
|
||||
self.assert_not_equal('FAILED', backup.status,
|
||||
'Backup status should not be')
|
||||
return False
|
||||
|
||||
poll_until(_result_is_active, time_out=self.TIMEOUT_BACKUP_CREATE)
|
||||
|
||||
def _wait_until_backup_is_gone(self, backup_id):
|
||||
def _backup_is_gone():
|
||||
try:
|
||||
self.auth_client.backups.get(backup_id)
|
||||
return False
|
||||
except exceptions.NotFound:
|
||||
return True
|
||||
|
||||
poll_until(_backup_is_gone,
|
||||
time_out=self.TIMEOUT_BACKUP_DELETE)
|
||||
|
||||
def assert_restore_from_backup(self, backup_ref):
|
||||
result = self._restore_from_backup(backup_ref)
|
||||
# TODO(peterstac) - This should probably return code 202
|
||||
self.assert_client_code(200)
|
||||
self.assert_equal('BUILD', result.status,
|
||||
'Unexpected instance status')
|
||||
self.restore_instance_id = result.id
|
||||
|
||||
def _restore_from_backup(self, backup_ref):
|
||||
restore_point = {'backupRef': backup_ref}
|
||||
result = self.auth_client.instances.create(
|
||||
self.instance_info.name + '_restore',
|
||||
self.instance_info.dbaas_flavor_href,
|
||||
self.instance_info.volume,
|
||||
nics=self.instance_info.nics,
|
||||
restorePoint=restore_point,
|
||||
datastore=self.instance_info.dbaas_datastore,
|
||||
datastore_version=self.instance_info.dbaas_datastore_version)
|
||||
return result
|
||||
|
||||
def run_restore_from_backup_completed(
|
||||
self, expected_states=['BUILD', 'ACTIVE'],
|
||||
# TODO(peterstac) - This should probably return code 202
|
||||
expected_http_code=200):
|
||||
self.assert_restore_from_backup_completed(
|
||||
self.restore_instance_id, expected_states, expected_http_code)
|
||||
self.restore_host = self.get_instance_host(self.restore_instance_id)
|
||||
|
||||
def assert_restore_from_backup_completed(
|
||||
self, instance_id, expected_states, expected_http_code):
|
||||
self.assert_instance_action(instance_id, expected_states,
|
||||
expected_http_code)
|
||||
|
||||
def run_verify_data_in_restored_instance(self):
|
||||
self.assert_verify_backup_data(self.restore_host)
|
||||
|
||||
def run_verify_data_for_backup(self):
|
||||
self.assert_verify_backup_data(self.backup_host)
|
||||
|
||||
def assert_verify_backup_data(self, host):
|
||||
"""In order for this to work, the corresponding datastore
|
||||
'helper' class should implement the 'verify_large_data' method.
|
||||
"""
|
||||
self.test_helper.verify_data(DataType.large, host)
|
||||
|
||||
def run_delete_restored_instance(
|
||||
self, expected_states=['SHUTDOWN'],
|
||||
expected_http_code=202):
|
||||
self.assert_delete_restored_instance(
|
||||
self.restore_instance_id, expected_states, expected_http_code)
|
||||
|
||||
def assert_delete_restored_instance(
|
||||
self, instance_id, expected_states, expected_http_code):
|
||||
self.auth_client.instances.delete(instance_id)
|
||||
self.assert_instance_action(instance_id, expected_states,
|
||||
expected_http_code)
|
||||
self.assert_all_gone(instance_id, expected_states[-1])
|
||||
|
||||
|
||||
class BackupRunner(BackupRunnerMixin):
|
||||
class BackupRunner(TestRunner):
|
||||
|
||||
def __init__(self):
|
||||
self.TIMEOUT_BACKUP_CREATE = 60 * 30
|
||||
|
@ -122,6 +39,7 @@ class BackupRunner(BackupRunnerMixin):
|
|||
self.backup_count_prior_to_create = 0
|
||||
self.backup_count_for_ds_prior_to_create = 0
|
||||
self.backup_count_for_instance_prior_to_create = 0
|
||||
self.databases_before_backup = None
|
||||
|
||||
self.backup_inc_1_info = None
|
||||
self.backup_inc_2_info = None
|
||||
|
@ -179,9 +97,16 @@ class BackupRunner(BackupRunnerMixin):
|
|||
self.auth_client.instances.backups(self.instance_info.id))
|
||||
|
||||
def run_backup_create(self):
|
||||
if self.test_helper.get_valid_database_definitions():
|
||||
self.databases_before_backup = self._get_databases(
|
||||
self.instance_info.id)
|
||||
self.backup_info = self.assert_backup_create(
|
||||
self.BACKUP_NAME, self.BACKUP_DESC, self.instance_info.id)
|
||||
|
||||
def _get_databases(self, instance_id):
|
||||
return [database.name for database in
|
||||
self.auth_client.databases.list(instance_id)]
|
||||
|
||||
def assert_backup_create(self, name, desc, instance_id, parent_id=None):
|
||||
result = self.auth_client.backups.create(
|
||||
name, instance_id, desc, parent_id=parent_id)
|
||||
|
@ -415,10 +340,27 @@ class BackupRunner(BackupRunnerMixin):
|
|||
def run_verify_data_in_restored_instance(self):
|
||||
self.assert_verify_backup_data(self.restore_host, DataType.large)
|
||||
|
||||
def run_verify_databases_in_restored_instance(self):
|
||||
self.assert_verify_backup_databases(self.restore_instance_id,
|
||||
self.databases_before_backup)
|
||||
|
||||
def run_verify_data_in_restored_inc_1_instance(self):
|
||||
self.assert_verify_backup_data(self.restore_inc_1_host, DataType.large)
|
||||
self.assert_verify_backup_data(self.restore_inc_1_host, DataType.tiny)
|
||||
|
||||
def run_verify_databases_in_restored_inc_1_instance(self):
|
||||
self.assert_verify_backup_databases(self.restore_instance_id,
|
||||
self.databases_before_backup)
|
||||
|
||||
def assert_verify_backup_databases(self, instance_id, expected_databases):
|
||||
if expected_databases is not None:
|
||||
actual = self._get_databases(instance_id)
|
||||
self.assert_list_elements_equal(
|
||||
expected_databases, actual,
|
||||
"Unexpected databases on the restored instance.")
|
||||
else:
|
||||
raise SkipTest("Datastore does not support databases.")
|
||||
|
||||
def run_delete_restored_instance(self, expected_http_code=202):
|
||||
self.assert_delete_restored_instance(
|
||||
self.restore_instance_id, expected_http_code)
|
||||
|
|
|
@ -203,7 +203,7 @@ class TestRunner(object):
|
|||
self.def_timeout = timeout
|
||||
|
||||
self.instance_info.name = "TEST_" + datetime.datetime.strftime(
|
||||
datetime.datetime.now(), '%Y-%m-%d_%H:%M:%S')
|
||||
datetime.datetime.now(), '%Y_%m_%d__%H_%M_%S')
|
||||
self.instance_info.dbaas_datastore = CONFIG.dbaas_datastore
|
||||
self.instance_info.dbaas_datastore_version = (
|
||||
CONFIG.dbaas_datastore_version)
|
||||
|
@ -434,9 +434,11 @@ class TestRunner(object):
|
|||
fast_fail_status=fast_fail_status,
|
||||
require_all_states=require_all_states)
|
||||
|
||||
tasks = [build_polling_task(_make_fn(instance_id),
|
||||
sleep_time=self.def_sleep_time, time_out=self.def_timeout)
|
||||
for instance_id in instance_ids]
|
||||
tasks = [
|
||||
build_polling_task(
|
||||
_make_fn(instance_id),
|
||||
sleep_time=self.def_sleep_time,
|
||||
time_out=self.def_timeout) for instance_id in instance_ids]
|
||||
poll_until(lambda: all(poll_task.ready() for poll_task in tasks),
|
||||
sleep_time=self.def_sleep_time, time_out=self.def_timeout)
|
||||
|
||||
|
@ -514,9 +516,11 @@ class TestRunner(object):
|
|||
def _make_fn(inst_id):
|
||||
return lambda: self._wait_for_delete(inst_id, expected_last_status)
|
||||
|
||||
tasks = [build_polling_task(_make_fn(instance_id),
|
||||
sleep_time=self.def_sleep_time, time_out=self.def_timeout)
|
||||
for instance_id in instance_ids]
|
||||
tasks = [
|
||||
build_polling_task(
|
||||
_make_fn(instance_id),
|
||||
sleep_time=self.def_sleep_time,
|
||||
time_out=self.def_timeout) for instance_id in instance_ids]
|
||||
poll_until(lambda: all(poll_task.ready() for poll_task in tasks),
|
||||
sleep_time=self.def_sleep_time, time_out=self.def_timeout)
|
||||
|
||||
|
|
Loading…
Reference in New Issue