From e13c85e8b2e3c5e774f72f5fb923e2ffe73fb82e Mon Sep 17 00:00:00 2001 From: Naved Ansari Date: Mon, 27 Oct 2025 16:32:23 -0400 Subject: [PATCH] Get outage data from nerc-rates Also just reorder some date conversions. --- openshift_metrics/merge.py | 51 ++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/openshift_metrics/merge.py b/openshift_metrics/merge.py index bc472cb..412ebe3 100644 --- a/openshift_metrics/merge.py +++ b/openshift_metrics/merge.py @@ -8,7 +8,7 @@ import json from typing import Tuple from decimal import Decimal -import nerc_rates +from nerc_rates import rates, outages from openshift_metrics import utils, invoice from openshift_metrics.metrics_processor import MetricsProcessor @@ -44,14 +44,14 @@ def parse_timestamp_range(timestamp_range: str) -> Tuple[datetime, datetime]: def get_su_definitions(report_month) -> dict: su_definitions = {} - nerc_data = nerc_rates.load_from_url() + rates_data = rates.load_from_url() su_names = ["GPUV100", "GPUA100", "GPUA100SXM4", "GPUH100", "CPU"] resource_names = ["vCPUs", "RAM", "GPUs"] for su_name in su_names: su_definitions.setdefault(f"OpenShift {su_name}", {}) for resource_name in resource_names: su_definitions[f"OpenShift {su_name}"][resource_name] = ( - nerc_data.get_value_at( + rates_data.get_value_at( f"{resource_name} in {su_name} SU", report_month, Decimal ) ) @@ -102,7 +102,6 @@ def main(): args = parser.parse_args() files = args.files - ignore_hours = args.ignore_hours report_start_date = None report_end_date = None @@ -138,35 +137,40 @@ def main(): logger.info( f"Generating report from {report_start_date} to {report_end_date} for {cluster_name}" ) - if ignore_hours: - for start_time, end_time in ignore_hours: - logger.info(f"{start_time} to {end_time} will be excluded from the invoice") - report_start_date = datetime.strptime(report_start_date, "%Y-%m-%d") - report_end_date = datetime.strptime(report_end_date, "%Y-%m-%d") - - report_month = datetime.strftime(report_start_date, "%Y-%m") + report_month = datetime.strftime( + datetime.strptime(report_start_date, "%Y-%m-%d"), "%Y-%m" + ) if args.use_nerc_rates: - logger.info("Using nerc rates.") - nerc_data = nerc_rates.load_from_url() - rates = invoice.Rates( - cpu=nerc_data.get_value_at("CPU SU Rate", report_month, Decimal), - gpu_a100=nerc_data.get_value_at("GPUA100 SU Rate", report_month, Decimal), - gpu_a100sxm4=nerc_data.get_value_at( + logger.info("Using nerc rates for rates and outages") + rates_data = rates.load_from_url() + invoice_rates = invoice.Rates( + cpu=rates_data.get_value_at("CPU SU Rate", report_month, Decimal), + gpu_a100=rates_data.get_value_at("GPUA100 SU Rate", report_month, Decimal), + gpu_a100sxm4=rates_data.get_value_at( "GPUA100SXM4 SU Rate", report_month, Decimal ), - gpu_v100=nerc_data.get_value_at("GPUV100 SU Rate", report_month, Decimal), - gpu_h100=nerc_data.get_value_at("GPUH100 SU Rate", report_month, Decimal), + gpu_v100=rates_data.get_value_at("GPUV100 SU Rate", report_month, Decimal), + gpu_h100=rates_data.get_value_at("GPUH100 SU Rate", report_month, Decimal), + ) + outage_data = outages.load_from_url() + ignore_hours = outage_data.get_outages_during( + report_start_date, report_end_date, cluster_name ) else: - rates = invoice.Rates( + invoice_rates = invoice.Rates( cpu=Decimal(args.rate_cpu_su), gpu_a100=Decimal(args.rate_gpu_a100_su), gpu_a100sxm4=Decimal(args.rate_gpu_a100sxm4_su), gpu_v100=Decimal(args.rate_gpu_v100_su), gpu_h100=Decimal(args.rate_gpu_h100_su), ) + ignore_hours = args.ignore_hours + + if bool(ignore_hours): # could be None or [] + for start_time, end_time in ignore_hours: + logger.info(f"{start_time} to {end_time} will be excluded from the invoice") if args.invoice_file: invoice_file = args.invoice_file @@ -183,6 +187,9 @@ def main(): else: pod_report_file = f"Pod NERC OpenShift {report_month}.csv" + report_start_date = datetime.strptime(report_start_date, "%Y-%m-%d") + report_end_date = datetime.strptime(report_end_date, "%Y-%m-%d") + if report_start_date.month != report_end_date.month: logger.warning("The report spans multiple months") report_month += " to " + datetime.strftime(report_end_date, "%Y-%m") @@ -196,7 +203,7 @@ def main(): condensed_metrics_dict=condensed_metrics_dict, file_name=invoice_file, report_month=report_month, - rates=rates, + rates=invoice_rates, su_definitions=su_definitions, cluster_name=cluster_name, ignore_hours=ignore_hours, @@ -205,7 +212,7 @@ def main(): condensed_metrics_dict=condensed_metrics_dict, file_name=class_invoice_file, report_month=report_month, - rates=rates, + rates=invoice_rates, su_definitions=su_definitions, cluster_name=cluster_name, namespaces_with_classes=["rhods-notebooks"],