Scenario tests wait on helper user creation

Post-prepare actions take long.
About 1 min or more on some datastores.
We need to wait for the helper user/database
to appear on the instance before proceeding with
other tests that require them.

Change-Id: If06fc9eede0d1f11c2a7ca723e540e0068871cf6
This commit is contained in:
Petr Malik 2016-09-27 13:25:16 -04:00
parent 731ca1bdfd
commit 434a72bf94
4 changed files with 51 additions and 34 deletions

View File

@ -28,7 +28,7 @@ class InstanceCreateRunner(TestRunner):
def __init__(self):
super(InstanceCreateRunner, self).__init__()
self.init_inst_id = None
self.init_inst_info = None
self.init_inst_dbs = None
self.init_inst_users = None
self.init_inst_host = None
@ -60,6 +60,8 @@ class InstanceCreateRunner(TestRunner):
self.instance_info.volume = instance_info.volume
self.instance_info.srv_grp_id = self.assert_server_group_exists(
self.instance_info.id)
self.instance_info.helper_user = instance_info.helper_user
self.instance_info.helper_database = instance_info.helper_database
def run_initial_configuration_create(self, expected_http_code=200):
dynamic_config = self.test_helper.get_dynamic_group()
@ -108,7 +110,7 @@ class InstanceCreateRunner(TestRunner):
expected_states, expected_http_code,
create_helper_user=create_helper_user)
self.init_inst_id = info.id
self.init_inst_info = info
else:
# There is no need to run this test as it's effectively the same as
# the empty instance test.
@ -131,6 +133,8 @@ class InstanceCreateRunner(TestRunner):
users = [{'name': item['name'], 'password': item['password']}
for item in user_definitions]
instance_info = InstanceTestInfo()
# Here we add helper user/database if any.
if create_helper_user:
helper_db_def, helper_user_def, root_def = self.build_helper_defs()
@ -139,14 +143,15 @@ class InstanceCreateRunner(TestRunner):
"Appending a helper database '%s' to the instance "
"definition." % helper_db_def['name'])
databases.append(helper_db_def)
instance_info.helper_database = helper_db_def
if helper_user_def:
self.report.log(
"Appending a helper user '%s:%s' to the instance "
"definition."
% (helper_user_def['name'], helper_user_def['password']))
users.append(helper_user_def)
instance_info.helper_user = helper_user_def
instance_info = InstanceTestInfo()
instance_info.name = name
instance_info.databases = databases
instance_info.users = users
@ -230,20 +235,39 @@ class InstanceCreateRunner(TestRunner):
def run_wait_for_created_instances(
self, expected_states=['BUILD', 'ACTIVE']):
instances = [self.instance_info.id]
if self.init_inst_id:
instances.append(self.init_inst_id)
if self.init_inst_info:
instances.append(self.init_inst_info.id)
self.assert_all_instance_states(instances, expected_states)
# It may take some time before the initial users/databases
# appear on the instance after it went ACTIVE.
# We need to wait for that before we can proceed with data operations.
self.wait_for_test_helpers(self.instance_info)
if self.init_inst_info:
self.wait_for_test_helpers(self.init_inst_info)
def wait_for_test_helpers(self, inst_info):
self.report.log("Waiting for helper users and databases to be "
"created on instance: %s" % inst_info.id)
if inst_info.helper_user:
self.wait_for_user_create(inst_info.id,
[inst_info.helper_user])
if inst_info.helper_database:
self.wait_for_database_create(inst_info.id,
[inst_info.helper_database])
self.report.log("Test helpers are ready.")
def run_add_initialized_instance_data(self):
self.init_inst_data = DataType.small
self.init_inst_host = self.get_instance_host(self.init_inst_id)
self.init_inst_host = self.get_instance_host(self.init_inst_info.id)
self.test_helper.add_data(self.init_inst_data, self.init_inst_host)
def run_validate_initialized_instance(self):
if self.init_inst_id:
if self.init_inst_info:
self.assert_instance_properties(
self.init_inst_id, self.init_inst_dbs, self.init_inst_users,
self.init_inst_config_group_id, self.init_inst_data)
self.init_inst_info.id, self.init_inst_dbs,
self.init_inst_users, self.init_inst_config_group_id,
self.init_inst_data)
def assert_instance_properties(
self, instance_id, expected_dbs_definitions,
@ -278,38 +302,26 @@ class InstanceCreateRunner(TestRunner):
"No configuration group expected")
def assert_database_list(self, instance_id, expected_databases):
expected_names = self._get_names(expected_databases)
full_list = self.auth_client.databases.list(instance_id)
self.assert_is_none(full_list.next,
"Unexpected pagination in the database list.")
listed_names = [database.name for database in full_list]
self.assert_is_sublist(expected_names, listed_names,
"Mismatch in instance databases.")
self.wait_for_database_create(instance_id, expected_databases)
def _get_names(self, definitions):
return [item['name'] for item in definitions]
def assert_user_list(self, instance_id, expected_users):
expected_names = self._get_names(expected_users)
full_list = self.auth_client.users.list(instance_id)
self.assert_is_none(full_list.next,
"Unexpected pagination in the user list.")
listed_names = [user.name for user in full_list]
self.assert_is_sublist(expected_names, listed_names,
"Mismatch in instance users.")
self.wait_for_user_create(instance_id, expected_users)
# Verify that user definitions include only created databases.
all_databases = self._get_names(
self.test_helper.get_valid_database_definitions())
for user in expected_users:
self.assert_is_sublist(
self._get_names(user['databases']), all_databases,
"Definition of user '%s' specifies databases not included in "
"the list of initial databases." % user['name'])
if 'databases' in user:
self.assert_is_sublist(
self._get_names(user['databases']), all_databases,
"Definition of user '%s' specifies databases not included "
"in the list of initial databases." % user['name'])
def run_initialized_instance_delete(self, expected_http_code=202):
if self.init_inst_id:
self.auth_client.instances.delete(self.init_inst_id)
if self.init_inst_info:
self.auth_client.instances.delete(self.init_inst_info.id)
self.assert_client_code(expected_http_code,
client=self.auth_client)
else:
@ -317,13 +329,13 @@ class InstanceCreateRunner(TestRunner):
def run_wait_for_init_delete(self, expected_states=['SHUTDOWN']):
delete_ids = []
if self.init_inst_id:
delete_ids.append(self.init_inst_id)
if self.init_inst_info:
delete_ids.append(self.init_inst_info.id)
if delete_ids:
self.assert_all_gone(delete_ids, expected_states[-1])
else:
raise SkipTest("Cleanup is not required.")
self.init_inst_id = None
self.init_inst_info = None
self.init_inst_dbs = None
self.init_inst_users = None
self.init_inst_host = None

View File

@ -223,3 +223,6 @@ class CouchbaseRootActionsRunner(RootActionsRunner):
def run_enable_root_with_password(self):
raise SkipTest("Operation is currently not supported.")
def run_delete_root(self):
raise SkipKnownBug(runners.BUG_WRONG_API_VALIDATION)

View File

@ -174,6 +174,8 @@ class InstanceTestInfo(object):
self.user = None # The user instance who owns the instance.
self.users = None # The users created on the instance.
self.databases = None # The databases created on the instance.
self.helper_user = None # Test helper user if exists.
self.helper_database = None # Test helper database if exists.
class TestRunner(object):

View File

@ -43,7 +43,7 @@ class UserActionsRunner(TestRunner):
if self.user_defs:
# Try to use the first user with databases if any.
for user_def in self.user_defs:
if user_def['databases']:
if 'databases' in user_def and user_def['databases']:
return user_def
return self.user_defs[0]
raise SkipTest("No valid user definitions provided.")