blob: 55bea44e7278e29ed197309a0c3700bd3ea5b310 [file] [log] [blame]
##############################################################################
# Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
##############################################################################
"""
Class to parse .yaml file to generate a report.db
"""
import sys
import yaml
import adaptors.sql.sqlite as sqlite
class YAMLParser:
"""
Class to represent a YAML Parser and creates database
Methods:
create_table: Creates sqlite db table with necessary fields.
parse_file: Parses the yaml file to obtain necessary data for the test result table and updates it.
update_test_config_table: Parses the yaml file to obtain necessary data fot the test config table and updates it
"""
root_string = ""
test_suite_list = []
# contents of the test_config table
test_config_table = [
"build_id",
"target",
"bitbake_version",
"yocto_version"
]
# contents of test_result table
test_result_table = [
"build_id",
"date",
"test_suite",
"test_case",
"result"
]
def __init__(self, file_name=""):
"""Creates an instance for sqlite_obj and loads the contents of the yamlfile to be parsed """
try:
self.sqlite_obj = sqlite.Database("report.db")
with open(file_name) as file:
self.contents = yaml.load(file)
self.root_string = [i for i in self.contents.keys()][0]
except Exception as err:
print(err)
def create_table(self):
"""Creates empty tables in the sqlite database from the contents of test_config_table and test_result_table"""
test_config_query = """
CREATE TABLE `test_configuration` (
{0} TEXT,
{1} TEXT,
{2} TEXT,
{3} TEXT,
PRIMARY KEY ({0})
);
""".format(self.test_config_table[0], self.test_config_table[1], self.test_config_table[2],
self.test_config_table[3])
test_results_query = """
CREATE TABLE `test_results` (
{0} TEXT,
{1} TEXT,
{2} TEXT,
{3} TEXT,
{4} TEXT,
FOREIGN KEY ({0}) REFERENCES `test_configuration`({0})
);
""".format(self.test_result_table[0], self.test_result_table[1], self.test_result_table[2],
self.test_result_table[3], self.test_result_table[4])
self.sqlite_obj.execute_query(test_config_query)
self.sqlite_obj.execute_query(test_results_query)
def parse_file(self):
"""Parses the yaml file"""
build_id = self.contents[self.root_string]['metadata']['CI_PIPELINE_ID']
for test_suite in self.contents[self.root_string]['test-suites'].keys():
date = self.contents[self.root_string]['test-suites'][test_suite]['metadata']['DATE']
for test_case in self.contents[self.root_string]['test-suites'][test_suite]['test-results'].keys():
result = self.contents[self.root_string]['test-suites'][test_suite]['test-results'][test_case]["status"]
update_result_table_query = "INSERT INTO test_results VALUES ('{0}', '{1}', '{2}', '{3}', '{4}')". \
format(build_id, date, test_suite, test_case, result)
self.sqlite_obj.execute_query(update_result_table_query)
def update_test_config_table(self):
"""Updates tables in the report.db with the values from the yaml file"""
build_id = self.contents[self.root_string]['metadata']['CI_PIPELINE_ID']
target = self.contents[self.root_string]['target']['platform'] + \
"_" + self.contents[self.root_string]['target']['version']
bitbake_version = "UNAVAILABLE"
yocto_version = "UNAVAILABLE"
update_table_query = "INSERT INTO test_configuration VALUES ('{0}', '{1}', '{2}', '{3}')".\
format(build_id, target, bitbake_version, yocto_version)
self.sqlite_obj.execute_query(update_table_query)
if __name__ == "__main__":
yaml_obj = YAMLParser()
yaml_obj.create_table()
yaml_obj.parse_file()
yaml_obj.update_test_config_table()