Lindley Werner d65811f2d5 Adding unit tests in pybox python scripts.
Enabling automatic tests with tox and zuul for each new patchset.

To see the unit test logs, go to:
  1- Zuul Summary
  2- tox-unittests
  3- Logs
  4- job-output.txt

Test Plan:
PASS: Run "tox -e unittests" in the terminal, this will:
  - Set the PYTHONPATH environment variable
  - Run the tests
  - Show the coverage report

Task: 47929
Story: 2005051

Change-Id: I7f527860f3498c53b28691c654035d017d70f68b
Signed-off-by: Lindley Werner <lindley.vieira@encora.com>
2023-07-03 15:37:12 -03:00

97 lines
2.6 KiB
Python

#!/usr/bin/python3
#
# SPDX-License-Identifier: Apache-2.0
#
"""
This module provides functions to track and report key performance indicators (KPIs) for a program.
"""
import time
from utils.install_log import LOG
STAGES = []
METRICS = {}
START = 0
def init_kpi_metrics():
"""
Initializes the global variable START with the current time to start tracking the
duration of a program.
"""
global START # pylint: disable=global-statement
START = time.time()
def get_formated_time(sec):
"""
Takes the duration in seconds and formats it in hours, minutes and seconds.
Returns the formatted string.
"""
hours = sec // 3600
sec %= 3600
minutes = sec // 60
sec %= 60
seconds = sec
if hours:
return f"{hours:.0f}h {minutes:.0f}m {seconds:.2f}s"
if minutes:
return f"{minutes:.0f}m {seconds:.2f}s"
return f"{seconds:.2f}s"
def set_kpi_metric(metric, duration):
"""Sets the duration of a metric and adds the metric to the global list of STAGES."""
global METRICS, STAGES # pylint: disable=global-statement, global-variable-not-assigned
METRICS[metric] = duration
STAGES.append(metric)
def print_kpi(metric):
"""Takes a metric as input and prints the duration of that metric using the LOG module."""
if metric in STAGES:
sec = METRICS[metric]
LOG.info(" Time in stage '%s': %s ", metric, get_formated_time(sec))
elif metric == 'total' and START:
duration = time.time() - START
LOG.info(" Total time: %s", get_formated_time(duration))
def get_kpi_str(metric):
"""Takes a metric as input and returns the duration of that metric as a formatted string."""
msg = ""
if metric in STAGES:
sec = METRICS[metric]
msg += f" Time in stage '{metric}': {get_formated_time(sec)} \n"
elif metric == 'total' and START:
duration = time.time() - START
msg += f" Total time: {get_formated_time(duration)}\n"
return msg
def get_kpi_metrics_str():
"""Returns a formatted string with all the metrics and their durations."""
msg = "===================== Metrics ====================\n"
for stage in STAGES:
msg += get_kpi_str(stage)
msg += get_kpi_str('total')
msg += "===============================================\n"
return msg
def print_kpi_metrics():
"""Prints all the metrics and their durations using the LOG module."""
LOG.info("===================== Metrics ====================")
for stage in STAGES:
print_kpi(stage)
print_kpi('total')
LOG.info("==================================================")