Modify time tests so that data can be pushed to OVVP (#13636)
* Set db_api_handler for pushing to new database in timetests * Change function of pushing to db. Co-authored-by: Daria Ilina <daria.krupnova@intel.com>
This commit is contained in:
parent
0942c6617b
commit
8f97ee55fc
@ -75,6 +75,7 @@ def run_timetest(args: dict, log=None):
|
|||||||
|
|
||||||
# Run executable and collect statistics
|
# Run executable and collect statistics
|
||||||
stats = {}
|
stats = {}
|
||||||
|
logs = []
|
||||||
for run_iter in range(args["niter"]):
|
for run_iter in range(args["niter"]):
|
||||||
tmp_stats_path = tempfile.NamedTemporaryFile().name
|
tmp_stats_path = tempfile.NamedTemporaryFile().name
|
||||||
retcode, msg = cmd_exec(cmd_common + ["-s", str(tmp_stats_path)], log=log)
|
retcode, msg = cmd_exec(cmd_common + ["-s", str(tmp_stats_path)], log=log)
|
||||||
@ -87,6 +88,9 @@ def run_timetest(args: dict, log=None):
|
|||||||
with open(tmp_stats_path, "r") as file:
|
with open(tmp_stats_path, "r") as file:
|
||||||
raw_data = list(yaml.load_all(file, Loader=yaml.SafeLoader))
|
raw_data = list(yaml.load_all(file, Loader=yaml.SafeLoader))
|
||||||
|
|
||||||
|
with open(tmp_stats_path, "r") as file:
|
||||||
|
logs.append(file.read())
|
||||||
|
|
||||||
os.unlink(tmp_stats_path)
|
os.unlink(tmp_stats_path)
|
||||||
|
|
||||||
# Parse raw data
|
# Parse raw data
|
||||||
@ -106,7 +110,7 @@ def run_timetest(args: dict, log=None):
|
|||||||
aggregated_stats = aggregate_stats(filtered_stats)
|
aggregated_stats = aggregate_stats(filtered_stats)
|
||||||
log.debug(f"Aggregated statistics after full run: {aggregated_stats}")
|
log.debug(f"Aggregated statistics after full run: {aggregated_stats}")
|
||||||
|
|
||||||
return 0, "", aggregated_stats, stats
|
return 0, "", aggregated_stats, stats, logs
|
||||||
|
|
||||||
|
|
||||||
def cli_parser():
|
def cli_parser():
|
||||||
@ -150,7 +154,7 @@ if __name__ == "__main__":
|
|||||||
logging.basicConfig(format="[ %(levelname)s ] %(message)s",
|
logging.basicConfig(format="[ %(levelname)s ] %(message)s",
|
||||||
level=logging.DEBUG, stream=sys.stdout)
|
level=logging.DEBUG, stream=sys.stdout)
|
||||||
|
|
||||||
exit_code, _, aggr_stats, _ = run_timetest(
|
exit_code, _, aggr_stats, _, _ = run_timetest(
|
||||||
dict(args._get_kwargs()), log=logging) # pylint: disable=protected-access
|
dict(args._get_kwargs()), log=logging) # pylint: disable=protected-access
|
||||||
if args.stats_path:
|
if args.stats_path:
|
||||||
# Save aggregated results to a file
|
# Save aggregated results to a file
|
||||||
|
@ -32,7 +32,7 @@ sys.path.insert(0, str(UTILS_DIR))
|
|||||||
|
|
||||||
from path_utils import check_positive_int
|
from path_utils import check_positive_int
|
||||||
from platform_utils import get_os_name, get_os_version, get_cpu_info
|
from platform_utils import get_os_name, get_os_version, get_cpu_info
|
||||||
from utils import upload_data, metadata_from_manifest, DB_COLLECTIONS
|
from utils import upload_data, metadata_from_manifest, push_to_db_facade, modify_data_for_push_to_new_db, DB_COLLECTIONS
|
||||||
|
|
||||||
# -------------------- CLI options --------------------
|
# -------------------- CLI options --------------------
|
||||||
|
|
||||||
@ -99,6 +99,12 @@ def pytest_addoption(parser):
|
|||||||
required=is_db_used,
|
required=is_db_used,
|
||||||
help='Path to build manifest to extract commit information'
|
help='Path to build manifest to extract commit information'
|
||||||
)
|
)
|
||||||
|
db_args_parser.addoption(
|
||||||
|
'--db_api_handler',
|
||||||
|
type=str,
|
||||||
|
help='API handler url for push data to database',
|
||||||
|
default=''
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
@ -413,3 +419,9 @@ def pytest_runtest_makereport(item, call):
|
|||||||
logging.info(f"Upload data to {db_url}/{'timetests'}.{db_collection}. "
|
logging.info(f"Upload data to {db_url}/{'timetests'}.{db_collection}. "
|
||||||
f"Data: {data}")
|
f"Data: {data}")
|
||||||
upload_data(data, db_url, 'timetests', db_collection)
|
upload_data(data, db_url, 'timetests', db_collection)
|
||||||
|
|
||||||
|
db_api_handler = item.config.getoption("db_api_handler")
|
||||||
|
if db_api_handler and call.when == "call":
|
||||||
|
new_format_records = modify_data_for_push_to_new_db(data)
|
||||||
|
new_format_records["log"] = item._request.test_info["logs"]
|
||||||
|
push_to_db_facade(new_format_records, db_api_handler)
|
||||||
|
@ -70,14 +70,15 @@ def test_timetest(instance, executable, niter, cl_cache_dir, model_cache, model_
|
|||||||
"model_cache": model_cache,
|
"model_cache": model_cache,
|
||||||
}
|
}
|
||||||
logging.info("Run timetest once to generate any cache")
|
logging.info("Run timetest once to generate any cache")
|
||||||
retcode, msg, _, _ = run_timetest({**exe_args, "niter": 1}, log=logging)
|
retcode, msg, _, _, _ = run_timetest({**exe_args, "niter": 1}, log=logging)
|
||||||
assert retcode == 0, f"Run of executable for warm up failed: {msg}"
|
assert retcode == 0, f"Run of executable for warm up failed: {msg}"
|
||||||
if cl_cache_dir:
|
if cl_cache_dir:
|
||||||
assert os.listdir(cl_cache_dir), "cl_cache isn't generated"
|
assert os.listdir(cl_cache_dir), "cl_cache isn't generated"
|
||||||
if model_cache_dir:
|
if model_cache_dir:
|
||||||
assert os.listdir(model_cache_dir), "model_cache isn't generated"
|
assert os.listdir(model_cache_dir), "model_cache isn't generated"
|
||||||
|
|
||||||
retcode, msg, aggr_stats, raw_stats = run_timetest(exe_args, log=logging)
|
retcode, msg, aggr_stats, raw_stats, logs = run_timetest(exe_args, log=logging)
|
||||||
|
test_info["logs"] = "\n".join(logs)
|
||||||
assert retcode == 0, f"Run of executable failed: {msg}"
|
assert retcode == 0, f"Run of executable failed: {msg}"
|
||||||
|
|
||||||
# Add timetest results to submit to database and save in new test conf as references
|
# Add timetest results to submit to database and save in new test conf as references
|
||||||
|
@ -7,6 +7,10 @@ from pathlib import Path
|
|||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
|
from copy import deepcopy
|
||||||
|
import requests
|
||||||
|
import logging
|
||||||
|
import re
|
||||||
|
|
||||||
# constants
|
# constants
|
||||||
DATABASES = ['timetests', 'memorytests']
|
DATABASES = ['timetests', 'memorytests']
|
||||||
@ -21,6 +25,49 @@ def upload_data(data, db_url, db_name, db_collection):
|
|||||||
collection.replace_one({'_id': data['_id']}, data, upsert=True)
|
collection.replace_one({'_id': data['_id']}, data, upsert=True)
|
||||||
|
|
||||||
|
|
||||||
|
def push_to_db_facade(data, db_api_handler):
|
||||||
|
headers = {"Content-Type": "application/json", "accept": "application/json"}
|
||||||
|
response = requests.post(db_api_handler, json=data, headers=headers)
|
||||||
|
if response.ok:
|
||||||
|
logging.info("Uploaded records by API url {}".format(db_api_handler))
|
||||||
|
else:
|
||||||
|
raise ConnectionError("Failed to upload records by API url {}".format(db_api_handler))
|
||||||
|
|
||||||
|
|
||||||
|
def modify_data_for_push_to_new_db(data):
|
||||||
|
new_data = deepcopy(data)
|
||||||
|
|
||||||
|
if 'run_id' in new_data:
|
||||||
|
del new_data['run_id']
|
||||||
|
new_data['build_url'] = data['run_id']
|
||||||
|
if 'os' in new_data:
|
||||||
|
platform, os_version_major, os_version_minor = data['os'].split("_")
|
||||||
|
new_data['os'] = "{} {}.{}".format(platform, os_version_major, os_version_minor)
|
||||||
|
if 'model' in new_data:
|
||||||
|
new_data['model_name'] = data['model']['name']
|
||||||
|
new_data['model'] = data['model']['path']
|
||||||
|
new_data['precision'] = data['model']['precision']
|
||||||
|
new_data['framework'] = data['model']['framework']
|
||||||
|
if 'device' in new_data:
|
||||||
|
new_data['device'] = data['device']['name']
|
||||||
|
if 'test_name' in new_data:
|
||||||
|
del new_data['test_name']
|
||||||
|
if 'commit_sha' in new_data:
|
||||||
|
del new_data['commit_sha']
|
||||||
|
if 'repo_url' in new_data:
|
||||||
|
del new_data['repo_url']
|
||||||
|
if 'product_type' in new_data:
|
||||||
|
del new_data['product_type']
|
||||||
|
if 'version' in new_data:
|
||||||
|
del new_data['version']
|
||||||
|
new_data['dldt_version'] = re.findall(r"\d{4}\.\d+.\d-\d+-\w+", data['version'])[0]
|
||||||
|
if 'raw_results' in new_data:
|
||||||
|
del new_data['raw_results']
|
||||||
|
for raw_result_name, raw_result in data['raw_results'].items():
|
||||||
|
new_data['results'][raw_result_name]['raw_results'] = raw_result
|
||||||
|
return new_data
|
||||||
|
|
||||||
|
|
||||||
def metadata_from_manifest(manifest: Path):
|
def metadata_from_manifest(manifest: Path):
|
||||||
""" Extract commit metadata from manifest."""
|
""" Extract commit metadata from manifest."""
|
||||||
with open(manifest, 'r') as manifest_file:
|
with open(manifest, 'r') as manifest_file:
|
||||||
|
Loading…
Reference in New Issue
Block a user