mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
test_driver: implement virDomainSetBlockIoTune
Signed-off-by: Ilias Stamatis <stamatis.iliass@gmail.com> Reviewed-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
824260cb5e
commit
8daefcf60e
@ -3613,6 +3613,255 @@ testDomainGetInterfaceParameters(virDomainPtr dom,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define TEST_BLOCK_IOTUNE_MAX 1000000000000000LL
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainSetBlockIoTune(virDomainPtr dom,
|
||||||
|
const char *path,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
virDomainObjPtr vm = NULL;
|
||||||
|
virDomainDefPtr def = NULL;
|
||||||
|
virDomainBlockIoTuneInfo info = {0};
|
||||||
|
virDomainDiskDefPtr conf_disk = NULL;
|
||||||
|
virTypedParameterPtr eventParams = NULL;
|
||||||
|
int eventNparams = 0;
|
||||||
|
int eventMaxparams = 0;
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
|
||||||
|
VIR_DOMAIN_AFFECT_CONFIG, -1);
|
||||||
|
|
||||||
|
if (virTypedParamsValidate(params, nparams,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME,
|
||||||
|
VIR_TYPED_PARAM_STRING,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_TYPED_PARAM_ULLONG,
|
||||||
|
NULL) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!(vm = testDomObjFromDomain(dom)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!(def = virDomainObjGetOneDef(vm, flags)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(conf_disk = virDomainDiskByName(def, path, true))) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG,
|
||||||
|
_("missing persistent configuration for disk '%s'"),
|
||||||
|
path);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
info = conf_disk->blkdeviotune;
|
||||||
|
if (VIR_STRDUP(info.group_name, conf_disk->blkdeviotune.group_name) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virTypedParamsAddString(&eventParams, &eventNparams, &eventMaxparams,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_DISK, path) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
#define SET_IOTUNE_FIELD(FIELD, STR, TUNABLE_STR) \
|
||||||
|
if (STREQ(param->field, STR)) { \
|
||||||
|
info.FIELD = param->value.ul; \
|
||||||
|
if (virTypedParamsAddULLong(&eventParams, &eventNparams, \
|
||||||
|
&eventMaxparams, \
|
||||||
|
TUNABLE_STR, \
|
||||||
|
param->value.ul) < 0) \
|
||||||
|
goto cleanup; \
|
||||||
|
continue; \
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nparams; i++) {
|
||||||
|
virTypedParameterPtr param = ¶ms[i];
|
||||||
|
|
||||||
|
if (param->value.ul > TEST_BLOCK_IOTUNE_MAX) {
|
||||||
|
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
|
||||||
|
_("block I/O throttle limit value must"
|
||||||
|
" be no more than %llu"), TEST_BLOCK_IOTUNE_MAX);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_IOTUNE_FIELD(total_bytes_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC);
|
||||||
|
SET_IOTUNE_FIELD(read_bytes_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC);
|
||||||
|
SET_IOTUNE_FIELD(write_bytes_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC);
|
||||||
|
SET_IOTUNE_FIELD(total_iops_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC);
|
||||||
|
SET_IOTUNE_FIELD(read_iops_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC);
|
||||||
|
SET_IOTUNE_FIELD(write_iops_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC);
|
||||||
|
|
||||||
|
SET_IOTUNE_FIELD(total_bytes_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(read_bytes_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(write_bytes_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(total_iops_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(read_iops_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(write_iops_sec_max,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX);
|
||||||
|
SET_IOTUNE_FIELD(size_iops_sec,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_SIZE_IOPS_SEC);
|
||||||
|
|
||||||
|
if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME)) {
|
||||||
|
VIR_FREE(info.group_name);
|
||||||
|
if (VIR_STRDUP(info.group_name, param->value.s) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (virTypedParamsAddString(&eventParams,
|
||||||
|
&eventNparams,
|
||||||
|
&eventMaxparams,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_GROUP_NAME,
|
||||||
|
param->value.s) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_IOTUNE_FIELD(total_bytes_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC_MAX_LENGTH);
|
||||||
|
SET_IOTUNE_FIELD(read_bytes_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC_MAX_LENGTH);
|
||||||
|
SET_IOTUNE_FIELD(write_bytes_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC_MAX_LENGTH);
|
||||||
|
SET_IOTUNE_FIELD(total_iops_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC_MAX_LENGTH);
|
||||||
|
SET_IOTUNE_FIELD(read_iops_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC_MAX_LENGTH);
|
||||||
|
SET_IOTUNE_FIELD(write_iops_sec_max_length,
|
||||||
|
VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH,
|
||||||
|
VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC_MAX_LENGTH);
|
||||||
|
}
|
||||||
|
#undef SET_IOTUNE_FIELD
|
||||||
|
|
||||||
|
if ((info.total_bytes_sec && info.read_bytes_sec) ||
|
||||||
|
(info.total_bytes_sec && info.write_bytes_sec)) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
_("total and read/write of bytes_sec "
|
||||||
|
"cannot be set at the same time"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((info.total_iops_sec && info.read_iops_sec) ||
|
||||||
|
(info.total_iops_sec && info.write_iops_sec)) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
_("total and read/write of iops_sec "
|
||||||
|
"cannot be set at the same time"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((info.total_bytes_sec_max && info.read_bytes_sec_max) ||
|
||||||
|
(info.total_bytes_sec_max && info.write_bytes_sec_max)) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
_("total and read/write of bytes_sec_max "
|
||||||
|
"cannot be set at the same time"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((info.total_iops_sec_max && info.read_iops_sec_max) ||
|
||||||
|
(info.total_iops_sec_max && info.write_iops_sec_max)) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
_("total and read/write of iops_sec_max "
|
||||||
|
"cannot be set at the same time"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define TEST_BLOCK_IOTUNE_MAX_CHECK(FIELD, FIELD_MAX) \
|
||||||
|
do { \
|
||||||
|
if (info.FIELD > info.FIELD_MAX) { \
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, \
|
||||||
|
_("%s cannot be set higher than %s "), \
|
||||||
|
#FIELD, #FIELD_MAX); \
|
||||||
|
goto cleanup; \
|
||||||
|
} \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(total_bytes_sec, total_bytes_sec_max);
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(read_bytes_sec, read_bytes_sec_max);
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(write_bytes_sec, write_bytes_sec_max);
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(total_iops_sec, total_iops_sec_max);
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(read_iops_sec, read_iops_sec_max);
|
||||||
|
TEST_BLOCK_IOTUNE_MAX_CHECK(write_iops_sec, write_iops_sec_max);
|
||||||
|
|
||||||
|
#undef TEST_BLOCK_IOTUNE_MAX_CHECK
|
||||||
|
|
||||||
|
if (virDomainDiskSetBlockIOTune(conf_disk, &info) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
info.group_name = NULL;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(info.group_name);
|
||||||
|
virDomainObjEndAPI(&vm);
|
||||||
|
if (eventNparams)
|
||||||
|
virTypedParamsFree(eventParams, eventNparams);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
testDomainGetBlockIoTune(virDomainPtr dom,
|
testDomainGetBlockIoTune(virDomainPtr dom,
|
||||||
const char *path,
|
const char *path,
|
||||||
@ -9120,6 +9369,7 @@ static virHypervisorDriver testHypervisorDriver = {
|
|||||||
.domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */
|
.domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */
|
||||||
.domainSetInterfaceParameters = testDomainSetInterfaceParameters, /* 5.6.0 */
|
.domainSetInterfaceParameters = testDomainSetInterfaceParameters, /* 5.6.0 */
|
||||||
.domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */
|
.domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */
|
||||||
|
.domainSetBlockIoTune = testDomainSetBlockIoTune, /* 5.7.0 */
|
||||||
.domainGetBlockIoTune = testDomainGetBlockIoTune, /* 5.7.0 */
|
.domainGetBlockIoTune = testDomainGetBlockIoTune, /* 5.7.0 */
|
||||||
.connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */
|
.connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */
|
||||||
.connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */
|
.connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user