GaneshaConfParser,
RGWFSAL,
format_block)
-from .qos_conf import QOS, QOSBandwidthControl, QOSOpsControl
-from .export_utils import export_qos_bw_checks, export_dict_qos_bw_ops_checks, export_qos_ops_checks
+from .qos_conf import QOS, QOSBandwidthControl, QOSOpsControl, QOSParams
+from .export_utils import (
+ export_qos_bw_checks,
+ export_dict_qos_bw_ops_checks,
+ export_qos_ops_checks,
+ get_cluster_qos_config)
from .exception import NFSException, NFSInvalidOperation, FSNotFound, NFSObjectNotFound
from .utils import (
EXPORT_PREFIX,
def get_export_qos(self, cluster_id: str, pseudo_path: str, ret_bw_in_bytes: bool = False) -> Dict[str, int]:
try:
+ clust_qos_obj = get_cluster_qos_config(cluster_id, self.mgr)
+ clust_qos_conf = {}
+ if clust_qos_obj:
+ clust_qos_conf[f'cluster_{QOSParams.enable_qos.value}'] = clust_qos_obj.enable_qos
+ if clust_qos_obj.bw_obj:
+ clust_qos_conf[f'cluster_{QOSParams.enable_bw_ctrl.value}'] = clust_qos_obj.bw_obj.enable_bw_ctrl
+ if clust_qos_obj.ops_obj:
+ clust_qos_conf[f'cluster_{QOSParams.enable_iops_ctrl.value}'] = clust_qos_obj.ops_obj.enable_iops_ctrl
+
export_obj = self.get_export_obj(cluster_id, pseudo_path)
- return export_obj.qos_block.to_dict(ret_bw_in_bytes) if export_obj.qos_block else {}
+ if export_obj.qos_block:
+ qos_block = export_obj.qos_block.to_dict(ret_bw_in_bytes)
+ qos_block.update(clust_qos_conf)
+ return qos_block
+ return {}
except Exception as e:
log.exception(f"Failed to get QOS configuration for {pseudo_path} of {cluster_id}")
raise ErrorResponse.wrap(e)
assert str(e) == 'To configure bandwidth control for export, you must first enable bandwidth control at the cluster level for foo.'
bw_obj = QOSBandwidthControl(True, clust_combined_bw_ctrl, **clust_params)
cluster.enable_cluster_qos_bw(self.cluster_id, qos_type, bw_obj)
-
+ clust_qos_conf = {'cluster_enable_qos': True, 'cluster_enable_bw_control': True, 'cluster_enable_iops_control': False}
# set export qos
try:
bw_obj = QOSBandwidthControl(True, export_combined_bw_ctrl, **export_params)
expected_out = {"enable_bw_control": True, "enable_qos": True, "combined_rw_bw_control": export_combined_bw_ctrl}
for key in export_params:
expected_out[QOSParams[key].value] = bytes_to_human(with_units_to_int(export_params[key]))
+ expected_out.update(clust_qos_conf)
assert out == expected_out
export_mgr.disable_export_qos_bw(self.cluster_id, '/cephfs_a/')
out = export_mgr.get_export_qos(self.cluster_id, '/cephfs_a/')
- assert out == {"enable_bw_control": False, "enable_qos": False, "combined_rw_bw_control": False}
+ clust_qos_conf.update({"enable_bw_control": False, "enable_qos": False, "combined_rw_bw_control": False})
+ assert out == clust_qos_conf
@pytest.mark.parametrize("qos_type, clust_combined_bw_ctrl, clust_params", [
assert str(e) == 'To configure IOPS control for export, you must first enable IOPS control at the cluster level foo.'
ops_obj = QOSOpsControl(True, **clust_params)
cluster.enable_cluster_qos_ops(self.cluster_id, qos_type, ops_obj)
-
+ clust_qos_conf = {'cluster_enable_qos': True, 'cluster_enable_bw_control': False, 'cluster_enable_iops_control': True}
# set export qos
try:
ops_obj = QOSOpsControl(True, **export_params)
expected_out = {"enable_iops_control": True, "enable_qos": True}
for key in export_params:
expected_out[QOSParams[key].value] = export_params[key]
+ expected_out.update(clust_qos_conf)
assert out == expected_out
export_mgr.disable_export_qos_ops(self.cluster_id, '/cephfs_a/')
out = export_mgr.get_export_qos(self.cluster_id, '/cephfs_a/')
- assert out == {"enable_iops_control": False, "enable_qos": False}
+ clust_qos_conf.update({"enable_iops_control": False, "enable_qos": False})
+ assert out == clust_qos_conf
@pytest.mark.parametrize("qos_type, clust_params", [
(QOSType['PerShare'], {'max_export_iops': 10000}),
export_mgr.enable_export_qos_bw(self.cluster_id, '/cephfs_a/', bw_obj)
ops_obj = QOSOpsControl(True, **export_ops_params)
export_mgr.enable_export_qos_ops(self.cluster_id, '/cephfs_a/', ops_obj)
+ clust_qos_conf = {'cluster_enable_qos': True, 'cluster_enable_bw_control': True, 'cluster_enable_iops_control': True}
except Exception:
req = QOS_REQ_BW_PARAMS['combined_bw_disabled'][qos_type.name]
if sorted(export_bw_params.keys()) != sorted(req):
ops_out[QOSParams[key].value] = export_ops_params[key]
expected_out.update(bw_out)
expected_out.update(ops_out)
+ expected_out.update(clust_qos_conf)
assert out == expected_out
# disable bandwidth control of export
export_mgr.disable_export_qos_bw(self.cluster_id, '/cephfs_a/')
out = export_mgr.get_export_qos(self.cluster_id, '/cephfs_a/')
ops_out.update({"enable_bw_control": False, "enable_qos": True, "combined_rw_bw_control": False, "enable_iops_control": True})
+ ops_out.update(clust_qos_conf)
assert out == ops_out
# disable ops control of export
export_mgr.disable_export_qos_ops(self.cluster_id, '/cephfs_a/')
out = export_mgr.get_export_qos(self.cluster_id, '/cephfs_a/')
- assert out == {"enable_bw_control": False, "enable_qos": False, "combined_rw_bw_control": False, "enable_iops_control": False}
+ clust_qos_conf.update({"enable_bw_control": False, "enable_qos": False, "combined_rw_bw_control": False, "enable_iops_control": False})
+ assert out == clust_qos_conf
@pytest.mark.parametrize("qos_type, clust_bw_params, clust_ops_params", [
# positive TCs