Skip to content

Commit c87c693

Browse files
authored
Added a new param for ros_ocp to support constant data generation (#522)
* Added a new param for ros_ocp to support constant data generation
1 parent 02bc748 commit c87c693

File tree

6 files changed

+70
-20
lines changed

6 files changed

+70
-20
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ The `make run-iqe` command by default will run the smoke tests. However, if you
140140
--insights-upload UPLOAD_URL optional, Use local directory path to populate a
141141
"local upload directory".
142142
--ros-ocp-info Optional, Generate ROS for Openshift data.
143+
--constant-values-ros-ocp Optional, Generate constant values for ROS for OpenShift data only
144+
when used with the ros-ocp-info parameter.
143145

144146
OCI Report Options:
145147
--oci-bucket-name BUCKET_NAME optional, OCI bucket name.

nise/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = "4.6.4"
1+
__version__ = "4.6.5"
22

33
VERSION = __version__.split(".")

nise/__main__.py

+7
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,13 @@ def add_ocp_parser_args(parser):
299299
action="store_true",
300300
help="Flag used to add the `daily_reports` marker to manifests.",
301301
)
302+
parser.add_argument(
303+
"--constant-values-ros-ocp",
304+
dest="constant_values_ros_ocp",
305+
required=False,
306+
action="store_true",
307+
help="Flag to generate constant values for ROS for Openshift",
308+
)
302309

303310

304311
def add_oci_parser_args(parser):

nise/generators/ocp/ocp_generator.py

+36-18
Original file line numberDiff line numberDiff line change
@@ -172,29 +172,40 @@ def get_owner_workload(pod, workload=None):
172172
return pod, ok, pod, wt
173173

174174

175-
def generate_randomized_ros_usage(usage_dict, limit_value):
176-
# if usage value is provided in yaml -> avg_value = +- 5% of that specified usage value
177-
if usage_value := usage_dict.get("full_period"):
178-
avg_value = min(round(uniform(usage_value * 0.95, usage_value * 1.05), 5), limit_value)
179-
# if usage value is not specified in yaml -> random avg_usage from 10% to 100% of the limit
180-
else:
181-
avg_value = round(uniform(limit_value * 0.1, limit_value), 5)
175+
def generate_randomized_ros_usage(usage_dict, limit_value, generate_constant_value=False):
176+
if generate_constant_value:
177+
# will generate constant values
178+
if usage_value := usage_dict.get("full_period"):
179+
avg_value = min(round(usage_value, 5), limit_value)
180+
else:
181+
avg_value = round(uniform(limit_value * 0.1, limit_value), 5)
182182

183-
# min value - random float derived from avg_value,
184-
min_value = round(uniform(avg_value * 0.8, avg_value), 5)
185-
# max_value - random float derived from avg_value, but max of limit_value
186-
max_value = min(round(uniform(avg_value, avg_value * 1.2), 5), limit_value)
183+
min_value = avg_value
184+
max_value = avg_value
185+
else:
186+
# This will generate randomised values
187+
# if usage value is provided in yaml -> avg_value = +- 5% of that specified usage value
188+
if usage_value := usage_dict.get("full_period"):
189+
avg_value = min(round(uniform(usage_value * 0.95, usage_value * 1.05), 5), limit_value)
190+
# if usage value is not specified in yaml -> random avg_usage from 10% to 100% of the limit
191+
else:
192+
avg_value = round(uniform(limit_value * 0.1, limit_value), 5)
187193

194+
# min value - random float derived from avg_value,
195+
min_value = round(uniform(avg_value * 0.8, avg_value), 5)
196+
# max_value - random float derived from avg_value, but max of limit_value
197+
max_value = min(round(uniform(avg_value, avg_value * 1.2), 5), limit_value)
188198
return avg_value, min_value, max_value
189199

190200

191201
class OCPGenerator(AbstractGenerator):
192202
"""Defines a abstract class for generators."""
193203

194-
def __init__(self, start_date, end_date, attributes, ros_ocp_info=False):
204+
def __init__(self, start_date, end_date, attributes, ros_ocp_info=False, constant_values_ros_ocp=False):
195205
"""Initialize the generator."""
196206
self._nodes = None
197207
self.ros_ocp_info = ros_ocp_info
208+
self.constant_values_ros_ocp = constant_values_ros_ocp
198209
if attributes:
199210
self._nodes = attributes.get("nodes")
200211

@@ -405,11 +416,16 @@ def _gen_pods(self, namespaces):
405416
pod, specified_pod.get("workload")
406417
)
407418

408-
cpu_usage_avg, cpu_usage_min, cpu_usage_max = generate_randomized_ros_usage(cpu_usage, cpu_limit)
419+
cpu_usage_avg, cpu_usage_min, cpu_usage_max = generate_randomized_ros_usage(
420+
cpu_usage, cpu_limit, generate_constant_value=self.constant_values_ros_ocp
421+
)
409422
memory_usage_gig_avg, memory_usage_gig_min, memory_usage_gig_max = generate_randomized_ros_usage(
410-
memory_usage_gig, mem_limit_gig
423+
memory_usage_gig, mem_limit_gig, generate_constant_value=self.constant_values_ros_ocp
411424
)
412-
memory_rss_ratio = 1 / round(uniform(1.01, 1.9), 2)
425+
if self.constant_values_ros_ocp:
426+
memory_rss_ratio = 1 / round(1, 2)
427+
else:
428+
memory_rss_ratio = 1 / round(uniform(1.01, 1.9), 2)
413429
cpu_throttle = choices([0, round(cpu_usage_avg / randint(10, 20), 5)], weights=(3, 1))[0]
414430

415431
ros_ocp_data_pods[pod] = {
@@ -479,9 +495,11 @@ def _gen_pods(self, namespaces):
479495
"pod_labels": self._gen_openshift_labels(),
480496
}
481497
owner_name, owner_kind, workload, workload_type = get_owner_workload(pod)
482-
cpu_usage_avg, cpu_usage_min, cpu_usage_max = generate_randomized_ros_usage({}, cpu_limit)
498+
cpu_usage_avg, cpu_usage_min, cpu_usage_max = generate_randomized_ros_usage(
499+
{}, cpu_limit, generate_constant_value=self.constant_values_ros_ocp
500+
)
483501
memory_usage_gig_avg, memory_usage_gig_min, memory_usage_gig_max = generate_randomized_ros_usage(
484-
{}, mem_limit_gig
502+
{}, mem_limit_gig, generate_constant_value=self.constant_values_ros_ocp
485503
)
486504
memory_rss_ratio = 1 / round(uniform(1.01, 1.9), 2)
487505
cpu_throttle = choices([0, round(cpu_usage_avg / randint(10, 20), 5)], weights=(3, 1))[0]
@@ -737,7 +755,7 @@ def _randomize_ros_ocp_line_values(self, pod_in):
737755
def _update_ros_ocp_pod_data(self, row, start, end, **kwargs):
738756
"""Update data with generator specific data."""
739757
pod = kwargs.get("pod")
740-
if pod:
758+
if pod and not self.constant_values_ros_ocp:
741759
pod = self._randomize_ros_ocp_line_values(pod)
742760
row.update(pod)
743761
return row

nise/report.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,7 @@ def ocp_create_report(options): # noqa: C901
849849
cluster_id = options.get("ocp_cluster_id")
850850
static_report_data = options.get("static_report_data")
851851
ros_ocp_info = options.get("ros_ocp_info")
852+
constant_values_ros_ocp = options.get("constant_values_ros_ocp")
852853

853854
if static_report_data:
854855
generators = _get_generators(static_report_data.get("generators"))
@@ -881,7 +882,7 @@ def ocp_create_report(options): # noqa: C901
881882

882883
gen_start_date, gen_end_date = _create_generator_dates_from_yaml(attributes, month)
883884

884-
gen = generator_cls(gen_start_date, gen_end_date, attributes, ros_ocp_info)
885+
gen = generator_cls(gen_start_date, gen_end_date, attributes, ros_ocp_info, constant_values_ros_ocp)
885886
for report_type in gen.ocp_report_generation.keys():
886887
LOG.info(f"Generating data for {report_type} for {month}")
887888
for hour in gen.generate_data(report_type):

tests/test_report.py

+22
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,28 @@ def test_ocp_create_report(self):
975975
self.assertTrue(os.path.isfile(expected_month_output_file))
976976
os.remove(expected_month_output_file)
977977

978+
def test_ocp_create_report_ros_ocp_constant_data_generation(self):
979+
"""Test the ocp report creation method with constant_values_ros_ocp enabled."""
980+
now = datetime.datetime.now().replace(microsecond=0, second=0, minute=0, hour=0)
981+
one_day = datetime.timedelta(days=1)
982+
yesterday = now - one_day
983+
cluster_id = "11112222"
984+
options = {
985+
"start_date": yesterday,
986+
"end_date": now,
987+
"ocp_cluster_id": cluster_id,
988+
"write_monthly": True,
989+
"ros_ocp_info": True,
990+
"constant_values_ros_ocp": True,
991+
}
992+
fix_dates(options, "ocp")
993+
ocp_create_report(options)
994+
for report_type in OCP_REPORT_TYPE_TO_COLS.keys():
995+
month_output_file_name = f"{calendar.month_name[now.month]}-{now.year}-{cluster_id}-{report_type}"
996+
expected_month_output_file = f"{os.getcwd()}/{month_output_file_name}.csv"
997+
self.assertTrue(os.path.isfile(expected_month_output_file))
998+
os.remove(expected_month_output_file)
999+
9781000
def test_ocp_create_report_minio_upload(self):
9791001
"""Test the ocp report creation method."""
9801002
now = datetime.datetime.now().replace(microsecond=0, second=0, minute=0, hour=0)

0 commit comments

Comments
 (0)