Merge "Backup tests verify restored databases"

This commit is contained in:
Jenkins 2016-07-29 20:05:13 +00:00 committed by Gerrit Code Review
commit b23c6c32c0
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)