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:
Petr Malik 2016-07-14 13:34:35 -04:00
parent 79006ce163
commit 984817e9e8
3 changed files with 47 additions and 91 deletions

View File

@ -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],

View File

@ -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)

View File

@ -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)