Spdk/python/spdk/sma/qos.py
Michal Berger 588dfe314b Add SPDX header to various files
They were missed by the initial set of patches which introduced this
header as a mandatory one across different types of files.

Signed-off-by: Michal Berger <michal.berger@intel.com>
Change-Id: I3f9b37d41298c843e1648e72fe8593768ccd37e0
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15423
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
2022-11-29 08:27:51 +00:00

64 lines
2.1 KiB
Python

# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2022 Intel Corporation.
# All rights reserved.
import grpc
from spdk.rpc.client import JSONRPCException
from .common import format_volume_id
from .proto import sma_pb2
LIMIT_UNDEFINED = (1 << 64) - 1
class QosException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
def set_volume_bdev_qos(client, params):
class BdevLimit:
def __init__(self, name, transform=lambda v: v):
self.name = name
self._transform = transform
def get_value(self, value):
return self._transform(value)
supported_limits = {
'rw_iops': BdevLimit('rw_ios_per_sec', lambda v: v * 1000),
'rd_bandwidth': BdevLimit('r_mbytes_per_sec'),
'wr_bandwidth': BdevLimit('w_mbytes_per_sec'),
'rw_bandwidth': BdevLimit('rw_mbytes_per_sec')
}
# Check that none of the unsupported fields aren't set either
if params.HasField('maximum'):
for field, value in params.maximum.ListFields():
if field.name in supported_limits.keys():
continue
if value != 0 and value != LIMIT_UNDEFINED:
raise QosException(grpc.StatusCode.INVALID_ARGUMENT,
f'Unsupported QoS limit: maximum.{field.name}')
try:
rpc_params = {'name': format_volume_id(params.volume_id)}
for name, limit in supported_limits.items():
value = getattr(params.maximum, name)
if value != LIMIT_UNDEFINED:
rpc_params[limit.name] = limit.get_value(value)
client.call('bdev_set_qos_limit', rpc_params)
except JSONRPCException:
raise QosException(grpc.StatusCode.INTERNAL, 'Failed to set QoS')
def get_bdev_qos_capabilities():
return sma_pb2.GetQosCapabilitiesResponse(
max_volume_caps=sma_pb2.GetQosCapabilitiesResponse.QosCapabilities(
rw_iops=True,
rw_bandwidth=True,
rd_bandwidth=True,
wr_bandwidth=True
),
)