Tempest testcases to support new bug fixes

Kingbird has two bug fixes 1652747,1654569 cause tempest failures,
This commit provides fix for the same.

Depends-on: I6fd74f63cde69c8a21d3e347cea206fc629e7c36

Change-Id: I7ea8a4f14b68f4f9d0a81379d9207063811e3ce6
This commit is contained in:
Goutham Pratapa 2017-02-09 21:04:57 +05:30
parent 5fec5dd49d
commit acf83a3df8
5 changed files with 201 additions and 117 deletions

View File

@ -31,7 +31,7 @@ KBGroup = [
default='publicURL',
help="Endpoint type of Kingbird service."),
cfg.IntOpt(name='TIME_TO_SYNC',
default=30,
default=60,
help="Maximum time to wait for a sync call to complete."),
cfg.StrOpt(name='endpoint_url',
default='http://127.0.0.1:8118/',

View File

@ -68,14 +68,14 @@ class BaseKingbirdTest(api_version_utils.BaseMicroversionTest,
project_name = data_utils.rand_name('kb-project')
user_name = data_utils.rand_name('kb-user')
password = data_utils.rand_name('kb-password')
target_project_name = data_utils.rand_name('kb-target-project')
target_user_name = data_utils.rand_name('kb-target-user')
cls.openstack_details = sync_client.get_openstack_drivers(
cls.key_client,
cls.regions[0],
project_name,
user_name,
password)
cls.key_client, cls.regions[0], project_name, user_name,
password, target_project_name, target_user_name)
cls.openstack_drivers = cls.openstack_details['os_drivers']
cls.session = cls.openstack_details['session']
cls.token = cls.openstack_details['token']
cls.resource_ids = sync_client.create_resources(cls.openstack_drivers)
cls.resource_ids.update(cls.openstack_details)
cls.resource_ids["server_ids"] = []
@ -90,45 +90,49 @@ class BaseKingbirdTest(api_version_utils.BaseMicroversionTest,
sync_client.resource_cleanup(cls.openstack_drivers, cls.resource_ids)
@classmethod
def create_custom_kingbird_quota(cls, project_id, new_quota_values):
def create_custom_kingbird_quota(cls, project_id, target_project_id,
new_quota_values):
new_values = sync_client.create_custom_kingbird_quota(
cls.auth_token, project_id, new_quota_values)
cls.token, project_id, target_project_id, new_quota_values)
return new_values
@classmethod
def get_custom_kingbird_quota(cls, project_id):
def get_custom_kingbird_quota(cls, project_id, target_project_id):
return_quotas = sync_client.get_custom_kingbird_quota(
cls.auth_token, project_id)
cls.token, project_id, target_project_id)
return return_quotas
@classmethod
def delete_custom_kingbird_quota(cls, project_id, quota_to_delete=None):
def delete_custom_kingbird_quota(cls, project_id, target_project_id,
quota_to_delete=None):
deleted_quotas = sync_client.delete_custom_kingbird_quota(
cls.auth_token, project_id, quota_to_delete)
cls.token, project_id, target_project_id, quota_to_delete)
return deleted_quotas
@classmethod
def get_default_kingbird_quota(cls):
return_quotas = sync_client.get_default_kingbird_quota(cls.auth_token)
def get_default_kingbird_quota(cls, project_id):
return_quotas = sync_client.get_default_kingbird_quota(cls.token,
project_id)
return return_quotas
@classmethod
def quota_sync_for_project(cls, project_id):
def quota_sync_for_project(cls, project_id, target_project_id):
sync_status = sync_client.quota_sync_for_project(
cls.auth_token, project_id)
cls.token, project_id, target_project_id)
return sync_status
@classmethod
def get_quota_usage_for_project(cls, project_id):
def get_quota_usage_for_project(cls, project_id, target_project_id):
quota_usage = sync_client.get_quota_usage_for_project(
cls.auth_token, project_id)
cls.token, project_id, target_project_id)
return quota_usage
@classmethod
def create_custom_kingbird_quota_wrong_token(cls, project_id,
target_project_id,
new_quota_values):
new_values = sync_client.create_custom_kingbird_quota_wrong_token(
cls.auth_token, project_id, new_quota_values)
new_values = sync_client.create_custom_kingbird_quota(
'fake_token', project_id, target_project_id, new_quota_values)
return new_values
@classmethod
@ -207,19 +211,20 @@ class BaseKingbirdTest(api_version_utils.BaseMicroversionTest,
cls.session, cls.regions, project_id, **quota_to_set)
@classmethod
def update_quota_for_class(cls, class_name, new_quota_values):
def update_quota_for_class(cls, class_name, project_id,
new_quota_values):
new_values = sync_client.update_quota_for_class(
cls.auth_token, class_name, new_quota_values)
cls.token, class_name, project_id, new_quota_values)
return new_values
@classmethod
def get_quota_for_class(cls, class_name):
def get_quota_for_class(cls, class_name, project_id):
return_quotas = sync_client.get_quota_for_class(
cls.auth_token, class_name)
cls.token, class_name, project_id)
return return_quotas
@classmethod
def delete_quota_for_class(cls, class_name):
def delete_quota_for_class(cls, class_name, project_id):
deleted_quotas = sync_client.delete_quota_for_class(
cls.auth_token, class_name)
cls.token, class_name, project_id)
return deleted_quotas

View File

@ -21,52 +21,77 @@ DEFAULT_CLASS = "default"
class KingbirdQuotaClassTestJSON(base.BaseKingbirdTest):
@classmethod
def setup_clients(self):
super(KingbirdQuotaClassTestJSON, self).setup_clients()
def tearDown(self):
super(KingbirdQuotaClassTestJSON, self).tearDown()
@classmethod
def resource_cleanup(self):
super(KingbirdQuotaClassTestJSON, self).resource_cleanup()
self.delete_resources()
@classmethod
def resource_setup(self):
super(KingbirdQuotaClassTestJSON, self).resource_setup()
self.create_resources()
def test_kb_quota_class_put_method(self):
new_quota = {"quota_class_set": {"instances": 15, "cores": 10}}
actual_value = self.update_quota_for_class(self.class_name,
new_quota)
actual_value = self.update_quota_for_class(
self.class_name, self.resource_ids["project_id"],
new_quota)
new_quota["quota_class_set"].update({"id": self.class_name})
self.assertEqual(new_quota, eval(actual_value))
self.delete_quota_for_class(self.class_name)
self.delete_quota_for_class(self.class_name,
self.resource_ids["project_id"])
def test_kb_quota_class_get_method(self):
new_quota = {"quota_class_set": {"instances": 15, "cores": 10}}
self.update_quota_for_class(self.class_name,
new_quota)
actual_value = self.get_quota_for_class(self.class_name)
self.update_quota_for_class(
self.class_name, self.resource_ids["project_id"], new_quota)
actual_value = self.get_quota_for_class(
self.class_name, self.resource_ids["project_id"])
new_quota["quota_class_set"].update({'id': self.class_name})
self.assertEqual(new_quota, eval(actual_value))
self.delete_quota_for_class(self.class_name)
self.delete_quota_for_class(self.class_name,
self.resource_ids["project_id"])
def test_kb_quota_class_delete_method(self):
new_quota = {"quota_class_set": {"instances": 15, "cores": 10}}
self.update_quota_for_class(self.class_name,
new_quota)
self.delete_quota_for_class(self.class_name)
self.update_quota_for_class(
self.class_name, self.resource_ids["project_id"], new_quota)
self.delete_quota_for_class(self.class_name,
self.resource_ids["project_id"])
quota_after_delete = eval(self.get_quota_for_class(
self.class_name))
self.class_name, self.resource_ids["project_id"]))
self.assertNotIn("cores", quota_after_delete["quota_class_set"])
self.assertNotIn("instances", quota_after_delete["quota_class_set"])
def test_kb_quota_class_wrong_input(self):
new_quota = {"quota_class_unset": {"instances": 15, "cores": 10}}
actual_value = self.update_quota_for_class(self.class_name,
new_quota)
actual_value = self.update_quota_for_class(
self.class_name, self.resource_ids["project_id"], new_quota)
self.assertIn("Missing quota_class_set in the body", actual_value)
def test_kb_quota_class_wrong_quotas(self):
new_quota = {"quota_class_set": {"instan": 15, "cor": 10}}
actual_value = self.update_quota_for_class(self.class_name,
new_quota)
actual_value = self.update_quota_for_class(
self.class_name, self.resource_ids["project_id"],
new_quota)
self.assertEmpty(actual_value)
def test_kb_quota_default_class_get_method(self):
actual_value = self.get_quota_for_class(DEFAULT_CLASS)
actual_value = self.get_quota_for_class(
DEFAULT_CLASS, self.resource_ids["project_id"])
expected_value = {"quota_class_set": base.DEFAULT_QUOTAS["quota_set"]}
expected_value["quota_class_set"].update({"id": DEFAULT_CLASS})
self.assertEqual(eval(actual_value), expected_value)
def test_kb_quota_class_get_method_wrong_class_name(self):
actual_value = self.get_quota_for_class("no_class")
actual_value = self.get_quota_for_class(
"no_class", self.resource_ids["project_id"])
expected_value = {"quota_class_set": {"id": "no_class"}}
self.assertEqual(eval(actual_value), expected_value)

View File

@ -46,18 +46,34 @@ class KingbirdQMTestJSON(base.BaseKingbirdTest):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
actual_value = self.create_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
new_quota)
expected_value = {
self.resource_ids["project_id"]: new_quota["quota_set"]
self.resource_ids["target_project_id"]: new_quota["quota_set"]
}
self.assertEqual(expected_value, eval(actual_value))
def test_kingbird_get_method(self):
def test_kingbird_get_another_tenant_quota(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
new_quota)
self.create_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
new_quota)
actual_value = self.get_custom_kingbird_quota(
self.resource_ids["project_id"])
self.resource_ids["project_id"],
self.resource_ids["target_project_id"])
new_quota["quota_set"].update(
{'project_id': self.resource_ids["target_project_id"]}
)
self.assertEqual(new_quota, eval(actual_value))
def test_kingbird_get_own_quota(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(
self.resource_ids["project_id"], self.resource_ids["project_id"],
new_quota)
actual_value = self.get_custom_kingbird_quota(
self.resource_ids["project_id"], self.resource_ids["project_id"])
new_quota["quota_set"].update(
{'project_id': self.resource_ids["project_id"]}
)
@ -66,24 +82,34 @@ class KingbirdQMTestJSON(base.BaseKingbirdTest):
def test_kingbird_delete_method(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
quota_to_delete = {"quota_set": ["cores"]}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
new_quota)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"],
quota_to_delete)
self.create_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
new_quota)
self.delete_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
quota_to_delete)
quota_after_delete = eval(self.get_custom_kingbird_quota(
self.resource_ids["project_id"]))
self.resource_ids["project_id"],
self.resource_ids["target_project_id"]))
self.assertNotIn("cores", quota_after_delete["quota_set"])
def test_kingbird_delete_all_method(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
new_quota)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"])
self.create_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
new_quota)
self.delete_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["target_project_id"])
actual_quota_after_delete = eval(self.get_custom_kingbird_quota(
self.resource_ids["project_id"]))
self.resource_ids["project_id"],
self.resource_ids["target_project_id"]))
expected_quota_after_delete = {
"quota_set": {
"project_id": self.resource_ids["project_id"]
"project_id": self.resource_ids["target_project_id"]
}
}
self.assertEqual(expected_quota_after_delete,
@ -91,18 +117,21 @@ class KingbirdQMTestJSON(base.BaseKingbirdTest):
def test_kingbird_get_default_method_after_update(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
new_quota)
actual_value = self.get_default_kingbird_quota()
self.create_custom_kingbird_quota(
self.resource_ids["project_id"], self.resource_ids["project_id"],
new_quota)
actual_value = self.get_default_kingbird_quota(
self.resource_ids["project_id"])
if 'id' in DEFAULT_QUOTAS['quota_set']:
del DEFAULT_QUOTAS['quota_set']['id']
self.assertEqual(eval(actual_value), DEFAULT_QUOTAS)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"])
self.delete_custom_kingbird_quota(self.resource_ids["project_id"],
self.resource_ids["project_id"])
def test_get_quota_usage_for_project(self):
self.create_instance(count=1)
actual_usage = self.get_quota_usage_for_project(
self.resource_ids["project_id"])
self.resource_ids["project_id"], self.resource_ids["project_id"])
expected_usage = self.get_usage_manually(
self.resource_ids["project_id"])
self.assertEqual(eval(actual_usage)["quota_set"]['usage']["ram"],
@ -122,25 +151,20 @@ class KingbirdQMTestJSON(base.BaseKingbirdTest):
def test_kingbird_put_method_wrong_token(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
response = self.create_custom_kingbird_quota_wrong_token(
self.resource_ids["project_id"], new_quota)
self.assertEqual(response.status_code, 401)
def test_kingbird_get_default_method_after_delete(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
new_quota)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"])
actual_value = self.get_default_kingbird_quota()
if 'id' in DEFAULT_QUOTAS['quota_set']:
del DEFAULT_QUOTAS['quota_set']['id']
self.assertEqual(eval(actual_value), DEFAULT_QUOTAS)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"])
self.resource_ids["project_id"],
self.resource_ids["target_project_id"],
new_quota)
result = eval(response).get('error').get('code')
self.assertEqual(result, 401)
def test_quota_sync_for_project(self):
# Delete custom quota if there are any for this project
self.delete_custom_kingbird_quota(self.resource_ids["project_id"])
self.delete_custom_kingbird_quota(
self.resource_ids["project_id"],
self.resource_ids["project_id"])
self.create_instance()
sync_status = self.quota_sync_for_project(
self.resource_ids["project_id"],
self.resource_ids["project_id"])
expected_status = u"triggered quota sync for " + \
self.resource_ids["project_id"]
@ -152,11 +176,28 @@ class KingbirdQMTestJSON(base.BaseKingbirdTest):
self.assertEqual(eval(sync_status), expected_status)
self.delete_instance()
def test_kingbird_get_default_method_after_delete(self):
new_quota = {"quota_set": {"instances": 15, "cores": 10}}
self.create_custom_kingbird_quota(
self.resource_ids["project_id"], self.resource_ids["project_id"],
new_quota)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"],
self.resource_ids["project_id"])
actual_value = self.get_default_kingbird_quota(
self.resource_ids["project_id"])
if 'id' in DEFAULT_QUOTAS['quota_set']:
del DEFAULT_QUOTAS['quota_set']['id']
self.assertEqual(eval(actual_value), DEFAULT_QUOTAS)
self.delete_custom_kingbird_quota(self.resource_ids["project_id"],
self.resource_ids["project_id"])
def test_quota_exceed_after_sync(self):
new_quota = {"quota_set": {"instances": 2}}
self.create_custom_kingbird_quota(self.resource_ids["project_id"],
self.resource_ids["project_id"],
new_quota)
self.quota_sync_for_project(self.resource_ids["project_id"])
self.quota_sync_for_project(self.resource_ids["project_id"],
self.resource_ids["project_id"])
self.wait_sometime_for_sync()
try:
self.create_instance(count=3)

View File

@ -65,17 +65,27 @@ def get_current_session(username, password, tenant_name):
def get_openstack_drivers(key_client, region, project_name, user_name,
password):
password, target_project_name, target_user_name):
# Create Project, User and assign role to new user
project = key_client.projects.create(project_name,
CONF.auth.admin_domain_name)
user = key_client.users.create(user_name, CONF.auth.admin_domain_name,
project.id, password)
target_project = key_client.projects.create(target_project_name,
CONF.auth.admin_domain_name)
target_user = key_client.users.create(target_user_name,
CONF.auth.admin_domain_name,
target_project.id, password)
admin_role = [current_role.id for current_role in
key_client.roles.list() if current_role.name == 'admin'][0]
mem_role = [current_role.id for current_role in
key_client.roles.list()
if current_role.name == 'Member'][0]
key_client.roles.grant(admin_role, user=user, project=project)
key_client.roles.grant(mem_role, user=target_user, project=target_project)
session = get_current_session(user_name, password, project_name)
new_key_client = ks_client.Client(session=session)
token = new_key_client.session.get_token()
nova_client = nv_client.Client(NOVA_API_VERSION,
session=session,
region_name=region)
@ -84,6 +94,8 @@ def get_openstack_drivers(key_client, region, project_name, user_name,
cinder_client = ci_client.Client(CINDER_API_VERSION, session=session,
region_name=region)
return {"user_id": user.id, "project_id": project.id, "session": session,
"token": token, "target_project_id": target_project.id,
"target_user_id": target_user.id,
"os_drivers": [key_client, nova_client, neutron_client,
cinder_client]}
@ -109,37 +121,40 @@ def create_instance(openstack_drivers, resource_ids, count=1):
raise e
def get_urlstring_and_headers(token, api_url):
admin_tenant_id = CONF.auth.admin_project_name
def get_urlstring_and_headers(token, project_id, api_url):
headers = {
'Content-Type': 'application/json',
'X-Auth-Token': token,
'X-ROLE': 'admin',
}
url_string = CONF.kingbird.endpoint_url + CONF.kingbird.api_version + \
"/" + admin_tenant_id + api_url
"/" + project_id + api_url
return headers, url_string
def create_custom_kingbird_quota(token, project_id, new_quota_values):
def create_custom_kingbird_quota(token, project_id, target_project_id,
new_quota_values):
body = json.dumps(new_quota_values)
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
url_string = url_string + project_id
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + target_project_id
response = requests.put(url_string, headers=headers, data=body)
return response.text
def get_custom_kingbird_quota(token, project_id):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
url_string = url_string + project_id
def get_custom_kingbird_quota(token, project_id, target_project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + target_project_id
response = requests.get(url_string, headers=headers)
return response.text
def delete_custom_kingbird_quota(token, project_id, quota_to_delete=None):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
url_string = url_string + project_id
def delete_custom_kingbird_quota(token, project_id, target_project_id,
quota_to_delete=None):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + target_project_id
if quota_to_delete:
body = json.dumps(quota_to_delete)
response = requests.delete(url_string, headers=headers, data=body)
@ -148,37 +163,30 @@ def delete_custom_kingbird_quota(token, project_id, quota_to_delete=None):
return response.text
def get_default_kingbird_quota(token):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
def get_default_kingbird_quota(token, project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + "defaults"
response = requests.get(url_string, headers=headers)
return response.text
def quota_sync_for_project(token, project_id):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
url_string = url_string + project_id + "/sync"
def quota_sync_for_project(token, project_id, target_project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + target_project_id + "/sync"
response = requests.put(url_string, headers=headers)
return response.text
def get_quota_usage_for_project(token, project_id):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
url_string = url_string + project_id + "/detail"
def get_quota_usage_for_project(token, project_id, target_project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_api_url)
url_string = url_string + target_project_id + "/detail"
response = requests.get(url_string, headers=headers)
return response.text
def create_custom_kingbird_quota_wrong_token(token,
project_id, new_quota_values):
headers, url_string = get_urlstring_and_headers(token, quota_api_url)
headers['X-Auth-Token'] = 'fake_token'
url_string = url_string + project_id
body = json.dumps(new_quota_values)
response = requests.put(url_string, headers=headers, data=body)
return response
def get_regions(key_client):
return [current_region.id for current_region in
key_client.regions.list()]
@ -242,7 +250,9 @@ def resource_cleanup(openstack_drivers, resource_ids):
neutron_client.delete_subnet(resource_ids['subnet_id'])
neutron_client.delete_network(resource_ids['network_id'])
key_client.projects.delete(resource_ids['project_id'])
key_client.projects.delete(resource_ids['target_project_id'])
key_client.users.delete(resource_ids['user_id'])
key_client.users.delete(resource_ids['target_user_id'])
def get_usage_from_os_client(session, regions, project_id):
@ -337,23 +347,26 @@ def set_default_quota(session, regions, project_id, **quota_to_set):
nova_client.quotas.update(project_id, **quota_to_set)
def update_quota_for_class(token, class_name, new_quota_values):
def update_quota_for_class(token, class_name, project_id, new_quota_values):
body = json.dumps(new_quota_values)
headers, url_string = get_urlstring_and_headers(token, quota_class_api_url)
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_class_api_url)
url_string = url_string + class_name
response = requests.put(url_string, headers=headers, data=body)
return response.text
def get_quota_for_class(token, class_name):
headers, url_string = get_urlstring_and_headers(token, quota_class_api_url)
def get_quota_for_class(token, class_name, project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_class_api_url)
url_string = url_string + class_name
response = requests.get(url_string, headers=headers)
return response.text
def delete_quota_for_class(token, class_name):
headers, url_string = get_urlstring_and_headers(token, quota_class_api_url)
def delete_quota_for_class(token, class_name, project_id):
headers, url_string = get_urlstring_and_headers(token, project_id,
quota_class_api_url)
url_string = url_string + class_name
response = requests.delete(url_string, headers=headers)
return response.text