Skip to content

Commit ef4e830

Browse files
authored
Merge pull request #89 from naved001/use-nerc-rates
2 parents 3cb070d + 9f8b909 commit ef4e830

File tree

5 files changed

+65
-18
lines changed

5 files changed

+65
-18
lines changed

bin/produce_report.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
python -m openshift_metrics.merge /data/*.json \
44
--invoice-file /tmp/invoice.csv \
55
--pod-report-file /tmp/pod-report.csv \
6-
--upload-to-s3
6+
--upload-to-s3 \
7+
--use-nerc-rates

openshift_metrics/merge.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
from datetime import datetime, UTC
77
import json
88
from typing import Tuple
9+
from decimal import Decimal
10+
import nerc_rates
911

10-
from openshift_metrics import utils
12+
from openshift_metrics import utils, invoice
1113
from openshift_metrics.metrics_processor import MetricsProcessor
1214

1315
def compare_dates(date_str1, date_str2):
@@ -53,6 +55,15 @@ def main():
5355
nargs="*",
5456
help="List of timestamp ranges in UTC to ignore in the format 'YYYY-MM-DDTHH:MM:SS,YYYY-MM-DDTHH:MM:SS'"
5557
)
58+
parser.add_argument(
59+
"--use-nerc-rates",
60+
action="store_true",
61+
help="Use rates from the nerc-rates repo",
62+
)
63+
parser.add_argument("--rate-cpu-su", type=Decimal)
64+
parser.add_argument("--rate-gpu-v100-su", type=Decimal)
65+
parser.add_argument("--rate-gpu-a100sxm4-su", type=Decimal)
66+
parser.add_argument("--rate-gpu-a100-su", type=Decimal)
5667

5768
args = parser.parse_args()
5869
files = args.files
@@ -91,6 +102,22 @@ def main():
91102

92103
report_month = datetime.strftime(report_start_date, "%Y-%m")
93104

105+
if args.use_nerc_rates:
106+
nerc_data = nerc_rates.load_from_url()
107+
rates = invoice.Rates(
108+
cpu=Decimal(nerc_data.get_value_at("CPU SU Rate", report_month)),
109+
gpu_a100=Decimal(nerc_data.get_value_at("GPUA100 SU Rate", report_month)),
110+
gpu_a100sxm4=Decimal(nerc_data.get_value_at("GPUA100SXM4 SU Rate", report_month)),
111+
gpu_v100=Decimal(nerc_data.get_value_at("GPUV100 SU Rate", report_month)),
112+
)
113+
else:
114+
rates = invoice.Rates(
115+
cpu=Decimal(args.rate_cpu_su),
116+
gpu_a100=Decimal(args.rate_gpu_a100_su),
117+
gpu_a100sxm4=Decimal(args.rate_gpu_a100sxm4_su),
118+
gpu_v100=Decimal(args.rate_gpu_v100_su)
119+
)
120+
94121
if args.invoice_file:
95122
invoice_file = args.invoice_file
96123
else:
@@ -109,10 +136,11 @@ def main():
109136
["cpu_request", "memory_request", "gpu_request", "gpu_type"]
110137
)
111138
utils.write_metrics_by_namespace(
112-
condensed_metrics_dict,
113-
invoice_file,
114-
report_month,
115-
ignore_hours,
139+
condensed_metrics_dict=condensed_metrics_dict,
140+
file_name=invoice_file,
141+
report_month=report_month,
142+
rates=rates,
143+
ignore_hours=ignore_hours,
116144
)
117145
utils.write_metrics_by_pod(condensed_metrics_dict, pod_report_file, ignore_hours)
118146

openshift_metrics/tests/test_utils.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,19 @@
1313
from requests.exceptions import ConnectionError
1414
import tempfile
1515
from unittest import TestCase, mock
16+
from decimal import Decimal
1617

1718
from openshift_metrics import utils, invoice
1819
import os
1920
from datetime import datetime, UTC
2021

22+
RATES = invoice.Rates(
23+
cpu = Decimal("0.013"),
24+
gpu_a100sxm4 = Decimal("2.078"),
25+
gpu_a100 = Decimal("1.803"),
26+
gpu_v100 = Decimal("1.214")
27+
)
28+
2129
class TestGetNamespaceAnnotations(TestCase):
2230

2331
@mock.patch('openshift_metrics.utils.requests.post')
@@ -241,7 +249,12 @@ def test_write_metrics_log(self, mock_gna):
241249
"2023-01,namespace2,namespace2,PI2,,,,,48,OpenShift GPUA100SXM4,2.078,99.74\n")
242250

243251
with tempfile.NamedTemporaryFile(mode="w+") as tmp:
244-
utils.write_metrics_by_namespace(test_metrics_dict, tmp.name, "2023-01")
252+
utils.write_metrics_by_namespace(
253+
condensed_metrics_dict=test_metrics_dict,
254+
file_name=tmp.name,
255+
report_month="2023-01",
256+
rates=RATES
257+
)
245258
self.assertEqual(tmp.read(), expected_output)
246259

247260

@@ -286,14 +299,22 @@ def test_write_metrics_by_namespace_decimal(self, mock_gna):
286299
"2023-01,namespace1,namespace1,PI1,,,,76,35,OpenShift CPU,0.013,0.46\n")
287300

288301
with tempfile.NamedTemporaryFile(mode="w+") as tmp:
289-
utils.write_metrics_by_namespace(test_metrics_dict, tmp.name, "2023-01")
302+
utils.write_metrics_by_namespace(
303+
condensed_metrics_dict=test_metrics_dict,
304+
file_name=tmp.name,
305+
report_month="2023-01",
306+
rates=RATES
307+
)
290308
self.assertEqual(tmp.read(), expected_output)
291309

292310

293311
class TestWriteMetricsWithIgnoreHours(TestCase):
294312
def setUp(self):
295313
"""Creates a test dictionary with condensed data that can be used to test WriteMetricsByPod and WriteMetricsByNamespace"""
296314
start_dt = int(datetime.fromisoformat("2024-04-10T11:00:00Z").timestamp())
315+
316+
317+
297318
self.ignore_times = [
298319
(
299320
datetime(2024, 4, 9, 11, 0, 0, tzinfo=UTC),
@@ -371,7 +392,11 @@ def test_write_metrics_by_namespace_with_ignore_hours(self, mock_gna):
371392

372393
with tempfile.NamedTemporaryFile(mode="w+") as tmp:
373394
utils.write_metrics_by_namespace(
374-
self.test_metrics_dict, tmp.name, "2023-01", self.ignore_times
395+
condensed_metrics_dict=self.test_metrics_dict,
396+
file_name=tmp.name,
397+
report_month="2023-01",
398+
rates=RATES,
399+
ignore_hours=self.ignore_times
375400
)
376401
self.assertEqual(tmp.read(), expected_output)
377402

openshift_metrics/utils.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def csv_writer(rows, file_name):
110110
csvwriter.writerows(rows)
111111

112112

113-
def write_metrics_by_namespace(condensed_metrics_dict, file_name, report_month, ignore_hours=None):
113+
def write_metrics_by_namespace(condensed_metrics_dict, file_name, report_month, rates, ignore_hours=None):
114114
"""
115115
Process metrics dictionary to aggregate usage by namespace and then write that to a file
116116
"""
@@ -134,14 +134,6 @@ def write_metrics_by_namespace(condensed_metrics_dict, file_name, report_month,
134134

135135
rows.append(headers)
136136

137-
# TODO: the caller will pass in the rates as an argument
138-
rates = invoice.Rates(
139-
cpu = Decimal("0.013"),
140-
gpu_a100 = Decimal("1.803"),
141-
gpu_a100sxm4 = Decimal("2.078"),
142-
gpu_v100 = Decimal("1.214")
143-
)
144-
145137
for namespace, pods in condensed_metrics_dict.items():
146138
namespace_annotation_dict = namespace_annotations.get(namespace, {})
147139
cf_pi = namespace_annotation_dict.get("cf_pi")

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
requests>=2.18.4
22
boto3>=1.34.40
3+
https://github.com/CCI-MOC/nerc-rates/archive/main.zip

0 commit comments

Comments
 (0)