Refactor the code of osccore-qa-testing-tools to comply with PEP8.
Related-prod: PRODX-42195
Change-Id: Id05e7584e0d024127ce1bd5042cfe681a1b52e2d
diff --git a/tempest_tests_resources/config.py b/tempest_tests_resources/config.py
index 9a3a450..eda02ac 100644
--- a/tempest_tests_resources/config.py
+++ b/tempest_tests_resources/config.py
@@ -1,10 +1,16 @@
import os
-REPORT_NAME = os.environ.get('REPORT_NAME', 'artifacts/tempest.log')
-TEMPEST_REPORT_XML = os.environ.get('TEMPEST_REPORT_XML', 'artifacts/tempest_report.xml')
+REPORT_NAME = os.environ.get("REPORT_NAME", "artifacts/tempest.log")
+TEMPEST_REPORT_XML = os.environ.get(
+ "TEMPEST_REPORT_XML", "artifacts/tempest_report.xml"
+)
# Results machine readable file
-RESOURCES_FILE_NAME = os.environ.get('RESULT_FILE_NAME', 'artifacts/tempest_resources.yaml')
+RESOURCES_FILE_NAME = os.environ.get(
+ "RESULT_FILE_NAME", "artifacts/tempest_resources.yaml"
+)
# Temporary file
-TEMPORARY_FILE_NAME = os.environ.get('TEMPORARY_FILE_NAME', 'artifacts/tempest_temporary')
+TEMPORARY_FILE_NAME = os.environ.get(
+ "TEMPORARY_FILE_NAME", "artifacts/tempest_temporary"
+)
diff --git a/tempest_tests_resources/report_parser.py b/tempest_tests_resources/report_parser.py
index 0e09f39..b4f842d 100644
--- a/tempest_tests_resources/report_parser.py
+++ b/tempest_tests_resources/report_parser.py
@@ -1,14 +1,12 @@
+import json
+import os
import re
import subprocess
import sys
-import json
-import yaml
-import os
-
import xml.etree.ElementTree as ET
import config
-
+import yaml
# config.py
REPORT_NAME = config.REPORT_NAME
@@ -17,7 +15,7 @@
def simplify_logfile(report_name, temporary_filename):
- """ Simplify full tempest log file and write it to temp file
+ """Simplify full tempest log file and write it to temp file
After simplifying temp file looks like:
...
Request...
@@ -30,56 +28,64 @@
:param report_name: full tempest logs file
:param temporary_filename: simplified file
"""
- run_cmd = f"grep -vEa '(auth/token|keystoneauth|connectionpool)' " \
- f"{report_name} | grep -a -A4 -E '( POST| DELETE| PUT)' " \
- f"> {temporary_filename}"
+ run_cmd = (
+ f"grep -vEa '(auth/token|keystoneauth|connectionpool)' "
+ f"{report_name} | grep -a -A4 -E '( POST| DELETE| PUT)' "
+ f"> {temporary_filename}"
+ )
subprocess.check_output(run_cmd, shell=True)
- run_cmd = f"grep -vEa '(auth/token|keystoneauth|connectionpool)' " \
- f"{report_name} | grep -a -A4 -E '(GET)' " \
- f">> {temporary_filename}"
+ run_cmd = (
+ f"grep -vEa '(auth/token|keystoneauth|connectionpool)' "
+ f"{report_name} | grep -a -A4 -E '(GET)' "
+ f">> {temporary_filename}"
+ )
subprocess.check_output(run_cmd, shell=True)
def get_request_response(temporary_filename):
- """ Get request+testname+response
+ """Get request+testname+response
:param temporary_filename: simplified report filename
:return: list with lines that contains request and response
"""
- with open(temporary_filename, 'r') as temp_file:
+ with open(temporary_filename, "r") as temp_file:
request = []
lines = temp_file.readlines()
for line in lines:
- if line.startswith('--'):
+ if line.startswith("--"):
yield request
request = []
else:
request.append(line)
-def _get_test_name(request,
- methods_skip_list=[
- 'tearDownClass',
- 'tearDown',
- '_run_cleanups',
- 'setUp',
- 'setUpClass',
- 'tearDownClass',]):
+def _get_test_name(
+ request,
+ methods_skip_list=[
+ "tearDownClass",
+ "tearDown",
+ "_run_cleanups",
+ "setUp",
+ "setUpClass",
+ "tearDownClass",
+ ],
+):
"""
:param request: request body
:param methods_skip_list: what methods to skip
:return:
"""
# Skip list to process requests from tests only
- # Process requests from Setup/Tear Down Classes if the argument 'class' exist
+ # Process requests from Setup/Tear Down Classes
+ # if the argument 'class' exist
try:
# regex for: (ClassName:test_name)
- test_name = re.search(r'\((\w+:.+\))', request)[0][1:-1]
+ test_name = re.search(r"\((\w+:.+\))", request)[0][1:-1]
# Skip if method name in skip list
- if test_name.split(':')[1] in methods_skip_list:
+ if test_name.split(":")[1] in methods_skip_list:
return
- return test_name.replace(':', '.')
+ return test_name.replace(":", ".")
except TypeError:
pass
# TODO(imenkov): add logging
@@ -87,38 +93,35 @@
def _get_response_body(response):
- """ Method to get response body as dict
+ """Method to get response body as dict
:param response: line with response
:return: dict with body or empty dict if
body is not readable
"""
try:
# regex to search dict in response
- body = re.search(
- r'(\{.[a-zA-Z]+).+(}|])',
- response)[0]
+ body = re.search(r"(\{.[a-zA-Z]+).+(}|])", response)[0]
if body:
- if 'badRequest' not in body:
+ if "badRequest" not in body:
res = json.loads(body)
return res
except Exception:
- return response.split(
- '_log_request_full')[0].strip(' ').replace(
- "Body: b", "").strip("\'")
+ return (
+ response.split("_log_request_full")[0]
+ .strip(" ")
+ .replace("Body: b", "")
+ .strip("'")
+ )
def _get_openstack_service_name(request):
- #TODO IMENKOV FIX ME
- service_name = re.search(
- r'(?<=\:\/\/).+?(?=(\.))',
- request)[0]
+ # TODO IMENKOV FIX ME
+ service_name = re.search(r"(?<=\:\/\/).+?(?=(\.))", request)[0]
return service_name
def _get_status_code_and_method(request):
- status_code = re.search(
- r'(?<=\): ).+?(?=( http))',
- request)[0]
+ status_code = re.search(r"(?<=\): ).+?(?=( http))", request)[0]
return status_code.split()
@@ -128,15 +131,13 @@
:return: request-id like: req-93636f78-031b-41bc-abb5-9533ab7a3df4
"""
try:
- req_id = re.search(
- r"(?<=\[)req-.+?(?= \])",
- request)
+ req_id = re.search(r"(?<=\[)req-.+?(?= \])", request)
if req_id:
return req_id[0]
except TypeError:
# TODO(imenkov) add logging to track not covered requests
# print(f"Request ID not found for request: {request}")
- return 'req_id_not_found'
+ return "req_id_not_found"
def _get_resource_name_from_request_body(request, os_resource_name=None):
@@ -147,11 +148,12 @@
"""
body = _get_response_body(request)
try:
- name = body.get(os_resource_name, {}).get('name',
- 'resource_name_not_defined')
+ name = body.get(os_resource_name, {}).get(
+ "name", "resource_name_not_defined"
+ )
return name
except AttributeError:
- return 'resource_name_not_defined'
+ return "resource_name_not_defined"
def generate_tests_resources():
@@ -174,9 +176,12 @@
for request in get_request_response(TEMPORARY_FILENAME):
# Get test name from request
- # Process requests from Setup/Tear Down Classes if the argument 'class' exist
- if len(sys.argv) == 2 and sys.argv[1] == 'class':
- methods_skip_list = ['_run_cleanups', ]
+ # Process requests from Setup/Tear Down Classes
+ # if the argument 'class' exist
+ if len(sys.argv) == 2 and sys.argv[1] == "class":
+ methods_skip_list = [
+ "_run_cleanups",
+ ]
test_name = _get_test_name(request[0], methods_skip_list)
else:
test_name = _get_test_name(request[0])
@@ -184,66 +189,83 @@
if not test_name:
continue
- # Generate test recourses only for specific test case if the argument 'test case name' exist
- if len(sys.argv) == 2 and sys.argv[1] != 'class' and sys.argv[1] != 'failed' and sys.argv[1] not in test_name:
+ # Generate test recourses only for specific test case
+ # if the argument 'test case name' exist
+ if (
+ len(sys.argv) == 2
+ and sys.argv[1] != "class"
+ and sys.argv[1] != "failed"
+ and sys.argv[1] not in test_name
+ ):
continue
if not result.get(test_name):
- result[test_name] = {"status": None,
- "resources": {}}
+ result[test_name] = {"status": None, "resources": {}}
status_and_method = _get_status_code_and_method(request[0])
status_code = status_and_method[0]
http_method = status_and_method[1]
openstack_service = _get_openstack_service_name(request[0])
- if not result[test_name]['resources'].get(openstack_service):
- result[test_name]['resources'][openstack_service] = {}
-
+ if not result[test_name]["resources"].get(openstack_service):
+ result[test_name]["resources"][openstack_service] = {}
response_body = _get_response_body(request[-1])
if not isinstance(response_body, dict):
request_id = _get_request_id(request[0])
# Check request body
- os_resource_name = _get_resource_name_from_request_body(
- request[2])
+ os_resource_name = _get_resource_name_from_request_body(request[2])
- if not result[test_name]['resources'][
- openstack_service].get(os_resource_name):
- result[test_name]['resources'][openstack_service][os_resource_name] = {}
+ if not result[test_name]["resources"][openstack_service].get(
+ os_resource_name
+ ):
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ] = {}
- result[test_name]['resources'][
- openstack_service][os_resource_name][request_id] = {
- 'http': {'response_body': response_body,
- 'status_code': status_code,
- 'http_method': http_method}}
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id] = {
+ "http": {
+ "response_body": response_body,
+ "status_code": status_code,
+ "http_method": http_method,
+ }
+ }
continue
for os_resource_name in response_body.keys():
- if not result[test_name]['resources'][openstack_service].get(
- os_resource_name):
- result[test_name]['resources'][openstack_service][
- os_resource_name] = {}
+ if not result[test_name]["resources"][openstack_service].get(
+ os_resource_name
+ ):
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ] = {}
request_id = _get_request_id(request[0])
- if not result[test_name]['resources'][openstack_service][
- os_resource_name].get(request_id):
+ if not result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ].get(request_id):
- result[test_name]['resources'][openstack_service][
- os_resource_name][request_id] = {
- 'http': {'status_code': status_code,
- 'http_method': http_method}}
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id] = {
+ "http": {
+ "status_code": status_code,
+ "http_method": http_method,
+ }
+ }
- #TODO (IMENKOV) ADD 400/500
+ # TODO (IMENKOV) ADD 400/500
# Check that response is dict
# In some cases response can contain strings as
# instance logs, hash or lists
if isinstance(response_body[os_resource_name], dict):
- resource_id = response_body[os_resource_name].get('id')
- resource_name = response_body[os_resource_name].get('name')
+ resource_id = response_body[os_resource_name].get("id")
+ resource_name = response_body[os_resource_name].get("name")
else:
resource_id = None
resource_name = None
@@ -257,22 +279,28 @@
# ...
if resource_id:
- result[test_name]['resources'][openstack_service][
- os_resource_name][request_id]['id'] = resource_id
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id]["id"] = resource_id
if not resource_name:
resource_name = _get_resource_name_from_request_body(
- request[2], os_resource_name)
- result[test_name]['resources'][openstack_service][
- os_resource_name][request_id]['name'] = resource_name
+ request[2], os_resource_name
+ )
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id]["name"] = resource_name
else:
- result[test_name]['resources'][openstack_service][
- os_resource_name][request_id]['name'] = resource_name
+ result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id]["name"] = resource_name
# Check if resource doesn't contain IDs - cleanup it
- if not result[test_name]['resources'][openstack_service][
- os_resource_name][request_id]:
- del result[test_name]['resources'][openstack_service][
- os_resource_name][request_id]
+ if not result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id]:
+ del result[test_name]["resources"][openstack_service][
+ os_resource_name
+ ][request_id]
return result
@@ -281,15 +309,15 @@
tree = ET.parse(report_name)
root = tree.getroot()
- if root[0].tag == 'testsuite':
+ if root[0].tag == "testsuite":
root = root[0]
for child in root:
- classname = child.attrib['classname']
- name = child.attrib['name']
+ classname = child.attrib["classname"]
+ name = child.attrib["name"]
if classname or name:
- short_classname = classname.split('.')[-1]
- short_name = name.split('[')[0]
+ short_classname = classname.split(".")[-1]
+ short_name = name.split("[")[0]
short_test_name = f"{short_classname}.{short_name}"
# (imenkov) mb use it as key
@@ -298,12 +326,14 @@
try:
test_status = child[0].tag
except IndexError:
- test_status = 'passed'
+ test_status = "passed"
- # Generate test recourses only for failed test cases if the argument 'failed' exist
- if len(sys.argv) == 2 and sys.argv[1] == 'failed':
- if test_status != 'failure':
- # we try to remove not 'failed' cases from report with 'partial' name of short_test_name
+ # Generate test recourses only for failed test cases
+ # if the argument 'failed' exist
+ if len(sys.argv) == 2 and sys.argv[1] == "failed":
+ if test_status != "failure":
+ # we try to remove not 'failed' cases from report with
+ # 'partial' name of short_test_name
rz = result.pop(short_test_name, None)
if not rz:
for item in list(result.keys()):
@@ -322,20 +352,26 @@
# rbubyr: it happens because in tempest.log these both tests are
# logged as RecordsetValidationTest:test_cannot_create_MX_with
# should be fixed in tempest tests
- if not result[short_test_name].get('full_test_name'):
- result[short_test_name]['full_test_name'] = []
- result[short_test_name]['full_test_name'].append(full_test_name)
- result[short_test_name]['status'] = test_status
+ if not result[short_test_name].get("full_test_name"):
+ result[short_test_name]["full_test_name"] = []
+ result[short_test_name]["full_test_name"].append(full_test_name)
+ result[short_test_name]["status"] = test_status
- # TODO(rbubyr): some test cases are absent in result dic, these tests won't have resources mapping
+ # TODO(rbubyr): some test cases are absent in result dic,
+ # these tests won't have resources mapping
# because they are skipped in TEMPORARY_FILE_NAME
- # for now we just add to final report only 'failure' test cases which are absent in result dic
+ # for now we just add to final report only 'failure'
+ # test cases which are absent in result dic
# it might be possible to add resources from tempest xml
- elif test_status == 'failure' and len(sys.argv) == 2 and sys.argv[1] == 'failed':
+ elif (
+ test_status == "failure"
+ and len(sys.argv) == 2
+ and sys.argv[1] == "failed"
+ ):
result[short_test_name] = {}
- result[short_test_name]['full_test_name'] = []
- result[short_test_name]['full_test_name'].append(full_test_name)
- result[short_test_name]['status'] = test_status
+ result[short_test_name]["full_test_name"] = []
+ result[short_test_name]["full_test_name"].append(full_test_name)
+ result[short_test_name]["status"] = test_status
def delete_temporary_file(path_to_temp_file):
@@ -350,5 +386,5 @@
# delete_temporary_file(TEMPORARY_FILENAME)
# Write results to yaml file
-with open(TEMPEST_TESTS_RESOURCES, 'w') as res_file:
+with open(TEMPEST_TESTS_RESOURCES, "w") as res_file:
yaml.dump(result, res_file)