# -*- coding: utf-8 -*-
#
# This file is part of the ska-mid-cbf-mcs project
#
# Distributed under the terms of the BSD 3-Clause license.
# See LICENSE for more info.
from __future__ import annotations
import math
from pathlib import Path
from typing import Any, Dict, List, Tuple
import orjson
from ska_mid_cbf_mcs.commons.global_enum import const
from ska_mid_cbf_mcs.testing.param_gen.test_param_gen import ParameterGen
__all__ = ["ControllerParameterGen"]
[docs]
class ControllerParameterGen(ParameterGen):
"""A class for Mid.CBF subarray test parameter generation."""
def __init__(
self: ParameterGen,
*args: Any,
set_resource_admin_mode_path: Path,
**kwargs: Any,
):
"""
Initialize an instance of ControllerParameterGen
:param set_resource_admin_mode_path: path to template file for SetResourceAdminMode input
"""
super().__init__(*args, **kwargs)
self.set_resource_admin_mode_path = set_resource_admin_mode_path
# --- Parameter generation --- #
[docs]
def resource_admin_mode_gen(
self: ControllerParameterGen,
vcc_unit_ids: List[int],
fsp_unit_ids: List[int],
) -> Dict[str, Any]:
with self.set_resource_admin_mode_path.open("rb") as opened_file:
set_resource_admin_mode_dict = orjson.loads(opened_file.read())
set_resource_admin_mode_dict["vcc_unit_ids"] = vcc_unit_ids
set_resource_admin_mode_dict["fsp_unit_ids"] = fsp_unit_ids
return set_resource_admin_mode_dict
[docs]
def generate_parameter_dict(
self: ControllerParameterGen,
vcc_ids: List[int],
fsp_unit_ids: List[int],
k_range: Tuple[int],
tm_data: Dict[str, Any] | None = None,
) -> Dict[str, Any]:
"""
Generate one set of all controller test input parameters.
:param vcc_unit_ids: list of VCC unit IDs to use in parameter generation
:param fsp_unit_ids: list of FSP unit IDs to use in parameter generation
:param k_range: range of k values to use in parameter generation
:param tm_data: optional param to set alternate source for sys params
"""
params = {}
params["test_seed"] = self.seed
# Limit number of resources based on available devices.
vcc_ids = list(vcc_ids[: self.max_vcc_all_bands])
params["vcc_ids"] = vcc_ids
fsp_unit_ids = list(fsp_unit_ids[: self.max_fsp_units])
params["fsp_ids"] = fsp_unit_ids
# SetResourceAdminMode
num_vcc_unit = math.ceil(len(vcc_ids) / const.NUM_VCC_PER_VCC_UNIT)
vcc_unit_ids = list(range(1, num_vcc_unit + 1))
params["resource_admin_mode_dict"] = self.resource_admin_mode_gen(
vcc_unit_ids=vcc_unit_ids,
fsp_unit_ids=fsp_unit_ids,
)
# InitSysParam
sys_param_dict = self.generate_sys_parameters(
vcc_ids=vcc_ids,
k_range=k_range,
tm_data=tm_data,
)
params["sys_param_dict"] = sys_param_dict
return params
[docs]
def generate_parameters(
self: ControllerParameterGen,
pytest_params: Dict[str, Any],
) -> Dict[str, Any]:
"""
Generate all subarray test input parameters.
:param pytest_params: the dict of pytest params that defines the basic parameter generation values
contains: "vcc_ids", "fsp_unit_ids", "k_range" and optionally "tm_data"
"""
self.parameter_output = self.generate_parameter_dict(
vcc_ids=pytest_params["vcc_ids"],
fsp_unit_ids=pytest_params["fsp_unit_ids"],
k_range=pytest_params["k_range"],
tm_data=pytest_params["tm_data"],
)
return self.parameter_output