Re: [libvirt] [PATCH 1/6] test_driver: implement virDomainAttachDeviceFlags
On Tue, Sep 17, 2019 at 5:51 PM Daniel Henrique Barboza wrote: > > > > On 8/1/19 9:54 AM, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 290 + > > 1 file changed, 290 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index aae9875194..c8aad6a0bb 100755 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -4013,6 +4013,295 @@ static int testDomainUndefine(virDomainPtr domain) > > return testDomainUndefineFlags(domain, 0); > > } > > > > + > > +static int > > +testDomainAttachDeviceLiveAndConfig(virDomainDefPtr vmdef, > > +virDomainDeviceDefPtr dev) > > +{ > > +virDomainDiskDefPtr disk; > > +virDomainNetDefPtr net; > > +virDomainHostdevDefPtr hostdev; > > +virDomainControllerDefPtr controller; > > +virDomainHostdevDefPtr found; > > +virDomainLeaseDefPtr lease; > > +virDomainFSDefPtr fs; > > +virDomainRedirdevDefPtr redirdev; > > +virDomainShmemDefPtr shmem; > > +char mac[VIR_MAC_STRING_BUFLEN]; > > + > > +switch (dev->type) { > > +case VIR_DOMAIN_DEVICE_DISK: > > +disk = dev->data.disk; > > +if (virDomainDiskIndexByName(vmdef, disk->dst, true) >= 0) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("target %s already exists."), disk->dst); > > +return -1; > > +} > > + > > +if (virDomainDiskInsert(vmdef, disk) < 0) > > +return -1; > > + > > +dev->data.disk = NULL; > > +break; > > + > > +case VIR_DOMAIN_DEVICE_CONTROLLER: > > +controller = dev->data.controller; > > +if (controller->idx != -1 && > > +virDomainControllerFind(vmdef, controller->type, > > +controller->idx) >= 0) { > > +virReportError(VIR_ERR_OPERATION_INVALID, "%s", > > + _("Target already exists")); > > +return -1; > > +} > > + > > +if (virDomainControllerInsert(vmdef, controller) < 0) > > +return -1; > > + > > +dev->data.controller = NULL; > > +break; > > + > > +case VIR_DOMAIN_DEVICE_NET: > > +net = dev->data.net; > > +if (virDomainHasNet(vmdef, net)) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("network device with mac %s already > > exists"), > > + virMacAddrFormat(>mac, mac)); > > +return -1; > > +} > > + > > +if (virDomainNetInsert(vmdef, net)) > > +return -1; > > + > > +dev->data.net = NULL; > > +break; > > + > > +case VIR_DOMAIN_DEVICE_HOSTDEV: > > +hostdev = dev->data.hostdev; > > +if (virDomainHostdevFind(vmdef, hostdev, ) >= 0) { > > +virReportError(VIR_ERR_OPERATION_INVALID, "%s", > > + _("device is already in the domain > > configuration")); > > +return -1; > > +} > > + > > +if (virDomainHostdevInsert(vmdef, hostdev) < 0) > > +return -1; > > + > > +dev->data.hostdev = NULL; > > +break; > > + > > +case VIR_DOMAIN_DEVICE_LEASE: > > +lease = dev->data.lease; > > +if (virDomainLeaseIndex(vmdef, lease) >= 0) { > > +virReportError(VIR_ERR_OPERATION_INVALID, > > + _("Lease %s in lockspace %s already > > exists"), > > + lease->key, NULLSTR(lease->lockspace)); > > +return -1; > > +} > > + > > +if (virDomainLeaseInsert(vmdef, lease) < 0) > > +return -1; > > + > > +dev->data.lease = NULL; > > +break; > > + > > +case VIR_DOMAIN_DEVICE_FS: > > +fs = dev->data.fs; &
Re: [libvirt] [PATCH 1/2] test_driver: implement virDomainPMSuspendForDuration
On Tue, Sep 3, 2019 at 8:17 PM Daniel Henrique Barboza wrote: > > > > On 9/3/19 2:00 PM, Daniel Henrique Barboza wrote: > > > > > > On 8/13/19 1:19 PM, Ilias Stamatis wrote: > >> Signed-off-by: Ilias Stamatis > >> --- > >> src/test/test_driver.c | 79 ++ > >> 1 file changed, 79 insertions(+) > >> > >> [...] > >> + > >> +virDomainObjSetState(vm, VIR_DOMAIN_PMSUSPENDED, > >> + VIR_DOMAIN_PMSUSPENDED_UNKNOWN); > >> +event_suspend = virDomainEventLifecycleNewFromObj(vm, > >> + VIR_DOMAIN_EVENT_PMSUSPENDED, > >> + VIR_DOMAIN_EVENT_SUSPENDED_PAUSED); > >> +virObjectEventStateQueue(privconn->eventState, event_suspend); > >> + > >> +if (target == VIR_NODE_SUSPEND_TARGET_DISK) { > >> +testDomainShutdownState(dom, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); > >> +event_shutdown = virDomainEventLifecycleNewFromObj(vm, > >> + VIR_DOMAIN_EVENT_STOPPED, > >> + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > >> +if (!vm->persistent) > >> +virDomainObjListRemove(privconn->domains, vm); > >> +} > >> + > >> +ret = 0; > >> + cleanup: > >> +virDomainObjEndAPI(); > >> +virObjectEventStateQueue(privconn->eventState, event_shutdown); > > > > > > Unless you're OK with passing a NULL here, you need to check if > > 'event_shutdown' is NULL at this point, since there's no guarantee that > > you set the var with something else in the 'if > > target==VIR_NODE_SUSPEND_TARGET_DISK' > > conditional. > > > > I'll take a guess here and say that this is unintended, thus it's best > > to move this > > 'virObjectEventStateQueue()' call that uses 'event_shutdown' inside > > the "if" > > right before the cleanup label. > > Just saw that patch 2/2 did something similar and decided to get more > informed. > > Checking what virObjectEventStateQueue() does, I see that it's a wrapper to > virObjectEventStateQueueRemote(), which is a no-op if the second > argument - in this case, event_shutdown - is NULL. This means that the > usage above does not harm, which is good. > > I'd still prefer to avoid using virObjectEventStateQueue() like you're doing > here, especially when it's easier to simply move the function call inside > the "if" in which you defined a non-NULL value to event_shutdown. > > However, I see this same use of virObjectEventStateQueue() across the > board in test_driver.c. That said, I'll assume that this question was > already > dealt with in the first time this code pattern was introduced in the > code, and > this use is ok. I think not only in test_driver.c. I took a quick look and it's also like that in some places in the QEMU driver. Plus I would say this "pattern" is in general common in the codebase with all these free*() functions on the cleanup sections which do the same thing - always check for NULL first. Additionally, if you want to check for NULL in that case you need to do it explicitly because virDomainEventLifecycleNewFromObj might also return NULL. This results in adding extra lines of code. Merely moving the virObjectEventStateQueue above wouldn't change much. So, since virObjectEventStateQueue already protects us against NULL I think maybe it's fine to leave it like that? In general I'm neutral to this, so feel free to alter it before merging. Thanks for the review! Ilias > > Rest of the code looks fine, so: > > > Reviewed-by: Daniel Henrique Barboza > > > > > > > > > > > > > > Thanks, > > > > > > DHB > > > >> +return ret; > >> +} > >> + > >> + > >> #define TEST_TOTAL_CPUTIME 48772617035LL > >> > >> static int > >> @@ -9415,6 +9493,7 @@ static virHypervisorDriver testHypervisorDriver > >> = { > >> .domainSendKey = testDomainSendKey, /* 5.5.0 */ > >> .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */ > >> .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */ > >> +.domainPMSuspendForDuration = testDomainPMSuspendForDuration, /* > >> 5.7.0 */ > >> .domainGetCPUStats = testDomainGetCPUStats, /* 5.6.0 */ > >> .domainSendProcessSignal = testDomainSendProcessSignal, /* > >> 5.5.0 */ > >> .connectGetCPUModelNames = testConnectGetCPUModelNames, /* > >> 1.1.3 */ > >> -- > >> 2.22.0 > >> > >> -- > >> libvir-list mailing list > >> libvir-list@redhat.com > >> https://www.redhat.com/mailman/listinfo/libvir-list > > > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainSetBlockThreshold
Store disk name - threshold pairs in vm-private data so they can be retrieved by virConnectGetAllDomainStats later. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 91 +- src/test/test_driver.h | 9 + 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 9bf3728654..0b4646b0bb 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -396,6 +396,10 @@ struct _testDomainObjPrivate { /* used by get/set time APIs */ long long seconds; unsigned int nseconds; + +/* used by domainSetBlockThreshold */ +size_t num_thresholds; +testBlockThresholdPtr *thresholds; }; @@ -413,6 +417,9 @@ testDomainObjPrivateAlloc(void *opaque) priv->seconds = 627319920; priv->nseconds = 0; +priv->num_thresholds = 0; +priv->thresholds = NULL; + return priv; } @@ -3974,6 +3981,71 @@ testDomainGetBlockIoTune(virDomainPtr dom, #undef TEST_SET_PARAM +static int +testDomainSetBlockThreshold(virDomainPtr dom, +const char *dev, +unsigned long long threshold, +unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDiskDefPtr disk; +testDomainObjPrivatePtr priv; +testBlockThresholdPtr blockthreshold = NULL; +size_t i; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +if (!(disk = virDomainDiskByName(vm->def, dev, true))) { +virReportError(VIR_ERR_INVALID_ARG, + _("failed to find disk '%s'"), + dev); +goto cleanup; +} + +priv = vm->privateData; + +for (i = 0; i < priv->num_thresholds; i++) { +if (STREQ(dev, priv->thresholds[i]->name)) { +blockthreshold = priv->thresholds[i]; +break; +} +} + +if (blockthreshold != NULL) { +blockthreshold->threshold = threshold; +} else { +/* disk not found. add it to the list */ +if (VIR_ALLOC(blockthreshold) < 0) +goto cleanup; +if (VIR_STRDUP(blockthreshold->name, dev) < 0) +goto cleanup; + +blockthreshold->threshold = threshold; + +if (VIR_APPEND_ELEMENT(priv->thresholds, priv->num_thresholds, + blockthreshold) < 0) +goto cleanup; +} + +ret = 0; + + cleanup: +if (ret < 0 && blockthreshold != NULL) { +VIR_FREE(blockthreshold->name); +VIR_FREE(blockthreshold); +} +virDomainObjEndAPI(); +return ret; +} + + static int testConnectNumOfDefinedDomains(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; @@ -5070,10 +5142,12 @@ testDomainDeviceOperation(testDriverPtr driver, virTestDeviceOperation operation, const char *xml, const char *alias, + virDomainObjPtr vm, virDomainDefPtr def) { virDomainDeviceDefPtr dev = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE; +size_t i; int ret = -1; if (operation == TEST_DEVICE_DETACH) @@ -5097,6 +5171,17 @@ testDomainDeviceOperation(testDriverPtr driver, case TEST_DEVICE_DETACH: if (testDomainDetachDeviceLiveAndConfig(def, dev) < 0) goto cleanup; + +if (dev->type == VIR_DOMAIN_DEVICE_DISK) { +testDomainObjPrivatePtr priv = vm->privateData; + +for (i = 0; i < priv->num_thresholds; i++) { +if (STREQ(dev->data.disk->dst, priv->thresholds[i]->name)) { +VIR_DELETE_ELEMENT(priv->thresholds[i], i, priv->num_thresholds); +break; +} +} +} break; case TEST_DEVICE_UPDATE: if (testDomainUpdateDeviceLiveAndConfig(def, dev) < 0) @@ -5137,12 +5222,13 @@ testDomainAttachDetachUpdateDevice(virDomainPtr dom, goto cleanup; if (persistentDef) { -if (testDomainDeviceOperation(driver, operation, xml, alias, persistentDef) < 0) +if (testDomainDeviceOperation(driver, operation, xml, alias, vm, + persistentDef) < 0) goto cleanup; } if (def) { -if (testDomainDeviceOperation(driver, operation, xml, alias, def) < 0) +if (testDomainDeviceOperation(driver, operation, xml, alias, vm, def) < 0) goto cleanup; } @@ -10001,6 +10087,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0
Re: [libvirt] [PATCH v2 1/6] test_driver: implement virDomainAttachDeviceFlags
On Fri, Aug 16, 2019 at 5:39 PM Erik Skultety wrote: > > ... > > > + > > +if (operation == TEST_DEVICE_DETACH) > > +parse_flags |= VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE; > > ^This should be added by patch 3/5 > > > + > > +if (xml) { > > +if (!(dev = virDomainDeviceDefParse(xml, def, > > +driver->caps, driver->xmlopt, > > +NULL, parse_flags))) > > +goto cleanup; > > +} else if (alias) { > > +if (VIR_ALLOC(dev) < 0 || virDomainDefFindDevice(def, alias, dev, > > true) < 0) > > +goto cleanup; > > +} > > + > > +switch (operation) { > > +case TEST_DEVICE_ATTACH: > > +if (testDomainAttachDeviceLiveAndConfig(def, dev) < 0) > > +goto cleanup; > > +break; > > +case TEST_DEVICE_DETACH: > > +break; > > +case TEST_DEVICE_UPDATE: > > +break; > > +} > > + > > +ret = 0; > > + cleanup: > > +if (xml) > > +virDomainDeviceDefFree(dev); > > +else > > +VIR_FREE(dev); > > virDomainDeviceDefFree() can handle both cases. It cannot! This got me as well and made me wonder! Try attaching a device with an alias and then try detaching it with virDomainDetachDeviceAlias and use virDomainDeviceDefFree to free the resource. The program crashes with: free(): double free detected in tcache 2 Ilias > > Reviewed-by: Erik Skultety -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virConnectCompareCPU
Signed-off-by: Ilias Stamatis --- Probably we need to extend the host CPU's capabilities as well along with this patch. Currently virCPUx86Compare reports "unknown host CPU". src/test/test_driver.c | 21 + 1 file changed, 21 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index c39eef2d4b..b1037f4eab 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1529,6 +1529,26 @@ static int testConnectGetMaxVcpus(virConnectPtr conn ATTRIBUTE_UNUSED, return 32; } + +static int +testConnectCompareCPU(virConnectPtr conn, + const char *xmlDesc, + unsigned int flags) +{ +testDriverPtr privconn = conn->privateData; +bool failIncompatible = !!(flags & VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE); +int ret = VIR_CPU_COMPARE_ERROR; + +virCheckFlags(VIR_CONNECT_COMPARE_CPU_FAIL_INCOMPATIBLE, + VIR_CPU_COMPARE_ERROR); + +ret = virCPUCompareXML(privconn->caps->host.arch, privconn->caps->host.cpu, + xmlDesc, failIncompatible); + +return ret; +} + + static char * testConnectBaselineCPU(virConnectPtr conn ATTRIBUTE_UNUSED, const char **xmlCPUs, @@ -9510,6 +9530,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainRevertToSnapshot = testDomainRevertToSnapshot, /* 1.1.4 */ .domainSnapshotDelete = testDomainSnapshotDelete, /* 1.1.4 */ +.connectCompareCPU = testConnectCompareCPU, /* 5.7.0 */ .connectBaselineCPU = testConnectBaselineCPU, /* 1.2.0 */ .domainCheckpointCreateXML = testDomainCheckpointCreateXML, /* 5.6.0 */ .domainCheckpointGetXMLDesc = testDomainCheckpointGetXMLDesc, /* 5.6.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 6/6] test_driver: implement virDomainUpdateDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 72 ++ 1 file changed, 72 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index e271bc58f8..9bf3728654 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4999,6 +4999,65 @@ testDomainDetachDeviceLiveAndConfig(virDomainDefPtr vmdef, } +static int +testDomainUpdateDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr newDisk; +virDomainDeviceDef oldDev = { .type = dev->type }; +virDomainNetDefPtr net; +int idx; +int ret = -1; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +newDisk = dev->data.disk; +if ((idx = virDomainDiskIndexByName(vmdef, newDisk->dst, false)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, + _("target %s doesn't exist."), newDisk->dst); +return -1; +} + +oldDev.data.disk = vmdef->disks[idx]; +if (virDomainDefCompatibleDevice(vmdef, dev, , + VIR_DOMAIN_DEVICE_ACTION_UPDATE, + false) < 0) +return -1; + +virDomainDiskDefFree(vmdef->disks[idx]); +vmdef->disks[idx] = newDisk; +dev->data.disk = NULL; +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if ((idx = virDomainNetFindIdx(vmdef, net)) < 0) +goto cleanup; + +oldDev.data.net = vmdef->nets[idx]; +if (virDomainDefCompatibleDevice(vmdef, dev, , + VIR_DOMAIN_DEVICE_ACTION_UPDATE, + false) < 0) +return -1; + +virDomainNetDefFree(vmdef->nets[idx]); +vmdef->nets[idx] = net; +dev->data.net = NULL; +ret = 0; +break; + +default: +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("neither persistent nor live update of device is supported")); +goto cleanup; +} + +ret = 0; + cleanup: +return ret; +} + + typedef enum { TEST_DEVICE_ATTACH = 0, TEST_DEVICE_DETACH, @@ -5040,6 +5099,8 @@ testDomainDeviceOperation(testDriverPtr driver, goto cleanup; break; case TEST_DEVICE_UPDATE: +if (testDomainUpdateDeviceLiveAndConfig(def, dev) < 0) +goto cleanup; break; } @@ -5138,6 +5199,16 @@ testDomainDetachDevice(virDomainPtr dom, } +static int +testDomainUpdateDeviceFlags(virDomainPtr dom, +const char *xml, +unsigned int flags) +{ +return testDomainAttachDetachUpdateDevice(dom, TEST_DEVICE_UPDATE, + xml, NULL, flags); +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -9947,6 +10018,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ .domainDetachDeviceAlias = testDomainDetachDeviceAlias, /* 5.7.0 */ +.domainUpdateDeviceFlags = testDomainUpdateDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 5/6] test_driver: implement virDomainDetachDeviceAlias
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 12 1 file changed, 12 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 1152ca5bed..e271bc58f8 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5119,6 +5119,17 @@ testDomainDetachDeviceFlags(virDomainPtr dom, xml, NULL, flags); } + +static int +testDomainDetachDeviceAlias(virDomainPtr dom, +const char *alias, +unsigned int flags) +{ +return testDomainAttachDetachUpdateDevice(dom, TEST_DEVICE_DETACH, + NULL, alias, flags); +} + + static int testDomainDetachDevice(virDomainPtr dom, const char *xml) @@ -9935,6 +9946,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ .domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ +.domainDetachDeviceAlias = testDomainDetachDeviceAlias, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 4/6] test_driver: implement virDomainDetachDevice
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 8 1 file changed, 8 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index ff9693ccb7..1152ca5bed 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -5119,6 +5119,13 @@ testDomainDetachDeviceFlags(virDomainPtr dom, xml, NULL, flags); } +static int +testDomainDetachDevice(virDomainPtr dom, + const char *xml) +{ +return testDomainDetachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE); +} + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) @@ -9926,6 +9933,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainFSTrim = testDomainFSTrim, /* 5.7.0 */ .domainAttachDevice = testDomainAttachDevice, /* 5.7.0 */ .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ +.domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 3/6] test_driver: implement virDomainDetachDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 178 + 1 file changed, 178 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index abf80b97cf..ff9693ccb7 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4834,6 +4834,171 @@ testDomainAttachDeviceLiveAndConfig(virDomainDefPtr vmdef, } +static int +testDomainDetachDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr disk, detach; +virDomainHostdevDefPtr hostdev, det_hostdev; +virDomainControllerDefPtr cont, det_cont; +virDomainNetDefPtr net; +virDomainLeaseDefPtr lease, det_lease; +virDomainFSDefPtr fs; +virDomainMemoryDefPtr mem; +int idx; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +disk = dev->data.disk; +if (!(detach = virDomainDiskRemoveByName(vmdef, disk->dst))) { +virReportError(VIR_ERR_INVALID_ARG, + _("no target device %s"), disk->dst); +return -1; +} +virDomainDiskDefFree(detach); +break; + +case VIR_DOMAIN_DEVICE_CONTROLLER: +cont = dev->data.controller; +if ((idx = virDomainControllerFind(vmdef, cont->type, + cont->idx)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("device not present in domain configuration")); +return -1; +} +det_cont = virDomainControllerRemove(vmdef, idx); +virDomainControllerDefFree(det_cont); +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if ((idx = virDomainNetFindIdx(vmdef, net)) < 0) +return -1; + +/* this is guaranteed to succeed */ +virDomainNetDefFree(virDomainNetRemove(vmdef, idx)); +break; + +case VIR_DOMAIN_DEVICE_HOSTDEV: { +hostdev = dev->data.hostdev; +if ((idx = virDomainHostdevFind(vmdef, hostdev, _hostdev)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("device not present in domain configuration")); +return -1; +} +virDomainHostdevRemove(vmdef, idx); +virDomainHostdevDefFree(det_hostdev); +break; +} + +case VIR_DOMAIN_DEVICE_LEASE: +lease = dev->data.lease; +if (!(det_lease = virDomainLeaseRemove(vmdef, lease))) { +virReportError(VIR_ERR_DEVICE_MISSING, + _("Lease %s in lockspace %s does not exist"), + lease->key, NULLSTR(lease->lockspace)); +return -1; +} +virDomainLeaseDefFree(det_lease); +break; + +case VIR_DOMAIN_DEVICE_FS: +fs = dev->data.fs; +idx = virDomainFSIndexByName(vmdef, fs->dst); +if (idx < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching filesystem device was found")); +return -1; +} + +fs = virDomainFSRemove(vmdef, idx); +virDomainFSDefFree(fs); +break; + +case VIR_DOMAIN_DEVICE_RNG: +if ((idx = virDomainRNGFind(vmdef, dev->data.rng)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching RNG device was found")); +return -1; +} + +virDomainRNGDefFree(virDomainRNGRemove(vmdef, idx)); +break; + +case VIR_DOMAIN_DEVICE_MEMORY: +if ((idx = virDomainMemoryFindInactiveByDef(vmdef, +dev->data.memory)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("matching memory device was not found")); +return -1; +} +mem = virDomainMemoryRemove(vmdef, idx); +vmdef->mem.cur_balloon -= mem->size; +virDomainMemoryDefFree(mem); +break; + +case VIR_DOMAIN_DEVICE_REDIRDEV: +if ((idx = virDomainRedirdevDefFind(vmdef, +dev->data.redirdev)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching redirdev was not found")); +return -1; +} + +virDomainRedirdevDefFree(virDomainRedirde
[libvirt] [PATCH v2 2/6] test_driver: implement virDomainAttachDevice
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 9 + 1 file changed, 9 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5f28e9017f..abf80b97cf 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4935,6 +4935,14 @@ testDomainAttachDeviceFlags(virDomainPtr dom, } +static int +testDomainAttachDevice(virDomainPtr dom, + const char *xml) +{ +return testDomainAttachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE); +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -9739,6 +9747,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ .domainFSThaw = testDomainFSThaw, /* 5.7.0 */ .domainFSTrim = testDomainFSTrim, /* 5.7.0 */ +.domainAttachDevice = testDomainAttachDevice, /* 5.7.0 */ .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/6] test_driver: implement virDomainAttachDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 290 + 1 file changed, 290 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index c39eef2d4b..5f28e9017f 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4646,6 +4646,295 @@ testDomainFSTrim(virDomainPtr dom, } +static int +testDomainAttachDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr disk; +virDomainNetDefPtr net; +virDomainHostdevDefPtr hostdev; +virDomainControllerDefPtr controller; +virDomainHostdevDefPtr found; +virDomainLeaseDefPtr lease; +virDomainFSDefPtr fs; +virDomainRedirdevDefPtr redirdev; +virDomainShmemDefPtr shmem; +char mac[VIR_MAC_STRING_BUFLEN]; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +disk = dev->data.disk; +if (virDomainDiskIndexByName(vmdef, disk->dst, true) >= 0) { +virReportError(VIR_ERR_INVALID_ARG, + _("target %s already exists."), disk->dst); +return -1; +} + +if (virDomainDiskInsert(vmdef, disk) < 0) +return -1; + +dev->data.disk = NULL; +break; + +case VIR_DOMAIN_DEVICE_CONTROLLER: +controller = dev->data.controller; +if (controller->idx != -1 && +virDomainControllerFind(vmdef, controller->type, +controller->idx) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Target already exists")); +return -1; +} + +if (virDomainControllerInsert(vmdef, controller) < 0) +return -1; + +dev->data.controller = NULL; +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if (virDomainHasNet(vmdef, net)) { +virReportError(VIR_ERR_INVALID_ARG, + _("network device with mac %s already exists"), + virMacAddrFormat(>mac, mac)); +return -1; +} + +if (virDomainNetInsert(vmdef, net)) +return -1; + +dev->data.net = NULL; +break; + +case VIR_DOMAIN_DEVICE_HOSTDEV: +hostdev = dev->data.hostdev; +if (virDomainHostdevFind(vmdef, hostdev, ) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("device is already in the domain configuration")); +return -1; +} + +if (virDomainHostdevInsert(vmdef, hostdev) < 0) +return -1; + +dev->data.hostdev = NULL; +break; + +case VIR_DOMAIN_DEVICE_LEASE: +lease = dev->data.lease; +if (virDomainLeaseIndex(vmdef, lease) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, + _("Lease %s in lockspace %s already exists"), + lease->key, NULLSTR(lease->lockspace)); +return -1; +} + +if (virDomainLeaseInsert(vmdef, lease) < 0) +return -1; + +dev->data.lease = NULL; +break; + +case VIR_DOMAIN_DEVICE_FS: +fs = dev->data.fs; +if (virDomainFSIndexByName(vmdef, fs->dst) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("Target already exists")); +return -1; +} + +if (virDomainFSInsert(vmdef, fs) < 0) +return -1; + +dev->data.fs = NULL; +break; + +case VIR_DOMAIN_DEVICE_RNG: +if (dev->data.rng->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && +virDomainDefHasDeviceAddress(vmdef, >data.rng->info)) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("a device with the same address already exists ")); +return -1; +} + +if (VIR_APPEND_ELEMENT(vmdef->rngs, vmdef->nrngs, dev->data.rng) < 0) +return -1; + +dev->data.rng = NULL; +break; + +case VIR_DOMAIN_DEVICE_MEMORY: +if (vmdef->nmems == vmdef->mem.memory_slots) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("no free memory device slot available")); +
[libvirt] [PATCH v2 0/6] test_driver: implement device attach/detach APIs
This series needed a respin since there were conflicts when trying to apply on the current master. Ilias Stamatis (6): test_driver: implement virDomainAttachDeviceFlags test_driver: implement virDomainAttachDevice test_driver: implement virDomainDetachDeviceFlags test_driver: implement virDomainDetachDevice test_driver: implement virDomainDetachDeviceAlias test_driver: implement virDomainUpdateDeviceFlags src/test/test_driver.c | 569 + 1 file changed, 569 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainPMWakeup
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 37 + 1 file changed, 37 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d21a69c7ed..b2a9baf361 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4168,6 +4168,42 @@ testDomainPMSuspendForDuration(virDomainPtr dom, } +static int +testDomainPMWakeup(virDomainPtr dom, + unsigned int flags) +{ +virDomainObjPtr vm; +virObjectEventPtr event = NULL; +testDriverPtr privconn = dom->conn->privateData; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_PMSUSPENDED) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Unable to wake up: guest is not in suspended state")); +goto cleanup; +} + +virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_WAKEUP); + +event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STARTED, + VIR_DOMAIN_EVENT_STARTED_WAKEUP); + +ret = 0; + cleanup: +virDomainObjEndAPI(); +virObjectEventStateQueue(privconn->eventState, event); +return ret; +} + + #define TEST_TOTAL_CPUTIME 48772617035LL static int @@ -9494,6 +9530,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */ .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */ .domainPMSuspendForDuration = testDomainPMSuspendForDuration, /* 5.7.0 */ +.domainPMWakeup = testDomainPMWakeup, /* 5.7.0 */ .domainGetCPUStats = testDomainGetCPUStats, /* 5.6.0 */ .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */ .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement PM suspend/wakeup APIs
Ilias Stamatis (2): test_driver: implement virDomainPMSuspendForDuration test_driver: implement virDomainPMWakeup src/test/test_driver.c | 116 + 1 file changed, 116 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] test_driver: implement virDomainPMSuspendForDuration
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 79 ++ 1 file changed, 79 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5f5c512571..d21a69c7ed 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4090,6 +4090,84 @@ static int testDomainSetMetadata(virDomainPtr dom, return ret; } + +static int +testDomainPMSuspendForDuration(virDomainPtr dom, + unsigned int target, + unsigned long long duration, + unsigned int flags) +{ +virDomainObjPtr vm; +testDriverPtr privconn = dom->conn->privateData; +virObjectEventPtr event_suspend = NULL; +virObjectEventPtr event_shutdown = NULL; +int ret = -1; + +virCheckFlags(0, -1); + +if (duration) { +virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", + _("Duration not supported. Use 0 for now")); +return -1; +} + +if (target >= VIR_NODE_SUSPEND_TARGET_LAST) { +virReportError(VIR_ERR_INVALID_ARG, + _("Unknown suspend target: %u"), + target); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain is not running")); +goto cleanup; +} + +if (vm->def->pm.s3 || vm->def->pm.s4) { +if (vm->def->pm.s3 == VIR_TRISTATE_BOOL_NO && +(target == VIR_NODE_SUSPEND_TARGET_MEM || + target == VIR_NODE_SUSPEND_TARGET_HYBRID)) { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("S3 state is disabled for this domain")); +goto cleanup; +} + +if (vm->def->pm.s4 == VIR_TRISTATE_BOOL_NO && +target == VIR_NODE_SUSPEND_TARGET_DISK) { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("S4 state is disabled for this domain")); +goto cleanup; +} +} + +virDomainObjSetState(vm, VIR_DOMAIN_PMSUSPENDED, + VIR_DOMAIN_PMSUSPENDED_UNKNOWN); +event_suspend = virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_PMSUSPENDED, + VIR_DOMAIN_EVENT_SUSPENDED_PAUSED); +virObjectEventStateQueue(privconn->eventState, event_suspend); + +if (target == VIR_NODE_SUSPEND_TARGET_DISK) { +testDomainShutdownState(dom, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); +event_shutdown = virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); +if (!vm->persistent) +virDomainObjListRemove(privconn->domains, vm); +} + +ret = 0; + cleanup: +virDomainObjEndAPI(); +virObjectEventStateQueue(privconn->eventState, event_shutdown); +return ret; +} + + #define TEST_TOTAL_CPUTIME 48772617035LL static int @@ -9415,6 +9493,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSendKey = testDomainSendKey, /* 5.5.0 */ .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */ .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */ +.domainPMSuspendForDuration = testDomainPMSuspendForDuration, /* 5.7.0 */ .domainGetCPUStats = testDomainGetCPUStats, /* 5.6.0 */ .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */ .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 1/2] test_driver: handle different lifecycle actions in testDomainShutdownFlags
On Tue, Aug 13, 2019 at 3:28 PM Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > --- > src/test/test_driver.c | 77 -- > 1 file changed, 45 insertions(+), 32 deletions(-) > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > index 5f5c512571..5a3ed45008 100755 > --- a/src/test/test_driver.c > +++ b/src/test/test_driver.c > @@ -1902,6 +1902,40 @@ static int testDomainSuspend(virDomainPtr domain) > return ret; > } > > + > +static void > +testDomainActionSetState(virDomainObjPtr dom, > + int lifecycle_type) > +{ > +switch (lifecycle_type) { > +case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY: > +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, > + VIR_DOMAIN_SHUTOFF_SHUTDOWN); > +break; > + > +case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: > +virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, > + VIR_DOMAIN_RUNNING_BOOTED); > +break; > + > +case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: > +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, > + VIR_DOMAIN_SHUTOFF_SHUTDOWN); > +break; > + > +case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: > +virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, > + VIR_DOMAIN_RUNNING_BOOTED); > +break; > + > +default: > +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, > + VIR_DOMAIN_SHUTOFF_SHUTDOWN); > +break; > +} > +} > + > + > static int testDomainShutdownFlags(virDomainPtr domain, > unsigned int flags) > { > @@ -1922,13 +1956,17 @@ static int testDomainShutdownFlags(virDomainPtr > domain, > goto cleanup; > } > > -testDomainShutdownState(domain, privdom, VIR_DOMAIN_SHUTOFF_SHUTDOWN); > -event = virDomainEventLifecycleNewFromObj(privdom, > - VIR_DOMAIN_EVENT_STOPPED, > - VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > +testDomainActionSetState(privdom, privdom->def->onPoweroff); > > -if (!privdom->persistent) > -virDomainObjListRemove(privconn->domains, privdom); > +if (virDomainObjGetState(privdom, NULL) == VIR_DOMAIN_SHUTOFF) { > +testDomainShutdownState(domain, privdom, > VIR_DOMAIN_SHUTOFF_SHUTDOWN); > +event = virDomainEventLifecycleNewFromObj(privdom, > + VIR_DOMAIN_EVENT_STOPPED, > + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); > + > +if (!privdom->persistent) > +virDomainObjListRemove(privconn->domains, privdom); > +} > > ret = 0; > cleanup: > @@ -1967,32 +2005,7 @@ static int testDomainReboot(virDomainPtr domain, > virDomainObjSetState(privdom, VIR_DOMAIN_SHUTDOWN, > VIR_DOMAIN_SHUTDOWN_USER); ^ Actually probably this is not needed since it's going to get overridden anyways. > > -switch (privdom->def->onReboot) { > -case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY: > -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, > - VIR_DOMAIN_SHUTOFF_SHUTDOWN); > -break; > - > -case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: > -virDomainObjSetState(privdom, VIR_DOMAIN_RUNNING, > - VIR_DOMAIN_RUNNING_BOOTED); > -break; > - > -case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: > -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, > - VIR_DOMAIN_SHUTOFF_SHUTDOWN); > -break; > - > -case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: > -virDomainObjSetState(privdom, VIR_DOMAIN_RUNNING, > - VIR_DOMAIN_RUNNING_BOOTED); > -break; > - > -default: > -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, > - VIR_DOMAIN_SHUTOFF_SHUTDOWN); > -break; > -} > +testDomainActionSetState(privdom, privdom->def->onReboot); > > if (virDomainObjGetState(privdom, NULL) == VIR_DOMAIN_SHUTOFF) { > testDomainShutdownState(domain, privdom, > VIR_DOMAIN_SHUTOFF_SHUTDOWN); > -- > 2.22.0 > -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/2] test_driver: implement virDomainSetLifecycleAction
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 58 ++ 1 file changed, 58 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5a3ed45008..2008e7e43a 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -8132,6 +8132,63 @@ testDomainGetBlockInfo(virDomainPtr dom, } +static void +testDomainModifyLifecycleAction(virDomainDefPtr def, +virDomainLifecycle type, +virDomainLifecycleAction action) +{ +switch (type) { +case VIR_DOMAIN_LIFECYCLE_POWEROFF: +def->onPoweroff = action; +break; +case VIR_DOMAIN_LIFECYCLE_REBOOT: +def->onReboot = action; +break; +case VIR_DOMAIN_LIFECYCLE_CRASH: +def->onCrash = action; +break; +case VIR_DOMAIN_LIFECYCLE_LAST: +break; +} +} + + +static int +testDomainSetLifecycleAction(virDomainPtr dom, + unsigned int type, + unsigned int action, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainDefPtr persistentDef = NULL; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!virDomainDefLifecycleActionAllowed(type, action)) +return -1; + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjGetDefs(vm, flags, , ) < 0) +goto cleanup; + +if (def) +testDomainModifyLifecycleAction(def, type, action); + +if (persistentDef) +testDomainModifyLifecycleAction(persistentDef, type, action); + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + /* * Snapshot APIs */ @@ -9437,6 +9494,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ .domainGetBlockInfo = testDomainGetBlockInfo, /* 5.7.0 */ +.domainSetLifecycleAction = testDomainSetLifecycleAction, /* 5.7.0 */ .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ .domainSnapshotListNames = testDomainSnapshotListNames, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/2] test_driver: handle different lifecycle actions in testDomainShutdownFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 77 -- 1 file changed, 45 insertions(+), 32 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5f5c512571..5a3ed45008 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1902,6 +1902,40 @@ static int testDomainSuspend(virDomainPtr domain) return ret; } + +static void +testDomainActionSetState(virDomainObjPtr dom, + int lifecycle_type) +{ +switch (lifecycle_type) { +case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY: +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, + VIR_DOMAIN_SHUTOFF_SHUTDOWN); +break; + +case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: +virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, + VIR_DOMAIN_RUNNING_BOOTED); +break; + +case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, + VIR_DOMAIN_SHUTOFF_SHUTDOWN); +break; + +case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: +virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, + VIR_DOMAIN_RUNNING_BOOTED); +break; + +default: +virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, + VIR_DOMAIN_SHUTOFF_SHUTDOWN); +break; +} +} + + static int testDomainShutdownFlags(virDomainPtr domain, unsigned int flags) { @@ -1922,13 +1956,17 @@ static int testDomainShutdownFlags(virDomainPtr domain, goto cleanup; } -testDomainShutdownState(domain, privdom, VIR_DOMAIN_SHUTOFF_SHUTDOWN); -event = virDomainEventLifecycleNewFromObj(privdom, - VIR_DOMAIN_EVENT_STOPPED, - VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); +testDomainActionSetState(privdom, privdom->def->onPoweroff); -if (!privdom->persistent) -virDomainObjListRemove(privconn->domains, privdom); +if (virDomainObjGetState(privdom, NULL) == VIR_DOMAIN_SHUTOFF) { +testDomainShutdownState(domain, privdom, VIR_DOMAIN_SHUTOFF_SHUTDOWN); +event = virDomainEventLifecycleNewFromObj(privdom, + VIR_DOMAIN_EVENT_STOPPED, + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); + +if (!privdom->persistent) +virDomainObjListRemove(privconn->domains, privdom); +} ret = 0; cleanup: @@ -1967,32 +2005,7 @@ static int testDomainReboot(virDomainPtr domain, virDomainObjSetState(privdom, VIR_DOMAIN_SHUTDOWN, VIR_DOMAIN_SHUTDOWN_USER); -switch (privdom->def->onReboot) { -case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY: -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, - VIR_DOMAIN_SHUTOFF_SHUTDOWN); -break; - -case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: -virDomainObjSetState(privdom, VIR_DOMAIN_RUNNING, - VIR_DOMAIN_RUNNING_BOOTED); -break; - -case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, - VIR_DOMAIN_SHUTOFF_SHUTDOWN); -break; - -case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: -virDomainObjSetState(privdom, VIR_DOMAIN_RUNNING, - VIR_DOMAIN_RUNNING_BOOTED); -break; - -default: -virDomainObjSetState(privdom, VIR_DOMAIN_SHUTOFF, - VIR_DOMAIN_SHUTOFF_SHUTDOWN); -break; -} +testDomainActionSetState(privdom, privdom->def->onReboot); if (virDomainObjGetState(privdom, NULL) == VIR_DOMAIN_SHUTOFF) { testDomainShutdownState(domain, privdom, VIR_DOMAIN_SHUTOFF_SHUTDOWN); -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/2] test_driver: implement virDomainSetLifecycleAction
Ilias Stamatis (2): test_driver: handle different lifecycle actions in testDomainShutdownFlags test_driver: implement virDomainSetLifecycleAction src/test/test_driver.c | 135 +++-- 1 file changed, 103 insertions(+), 32 deletions(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] test_driver: implement virDomainSetLifecycleAction
On Fri, Aug 9, 2019 at 3:55 PM Erik Skultety wrote: > > On Fri, Aug 02, 2019 at 11:51:05AM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 58 ++ > > 1 file changed, 58 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index aae9875194..71d6baa3da 100755 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -7404,6 +7404,63 @@ testDomainMemoryPeek(virDomainPtr dom, > > } > > > > > > +static void > > +testDomainModifyLifecycleAction(virDomainDefPtr def, > > +virDomainLifecycle type, > > +virDomainLifecycleAction action) > > +{ > > +switch (type) { > > +case VIR_DOMAIN_LIFECYCLE_POWEROFF: > > +def->onPoweroff = action; > > +break; > > +case VIR_DOMAIN_LIFECYCLE_REBOOT: > > +def->onReboot = action; > > +break; > > +case VIR_DOMAIN_LIFECYCLE_CRASH: > > +def->onCrash = action; > > +break; > > +case VIR_DOMAIN_LIFECYCLE_LAST: > > +break; > > +} > > +} > > + > > + > > +static int > > +testDomainSetLifecycleAction(virDomainPtr dom, > > + unsigned int type, > > + unsigned int action, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm = NULL; > > +virDomainDefPtr def = NULL; > > +virDomainDefPtr persistentDef = NULL; > > +int ret = -1; > > + > > +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | > > + VIR_DOMAIN_AFFECT_CONFIG, -1); > > + > > +if (!virDomainDefLifecycleActionAllowed(type, action)) > > +return -1; > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +return -1; > > + > > +if (virDomainObjGetDefs(vm, flags, , ) < 0) > > We should use virDomainObjGetOneDef instead. I think not. Because the 2 flags aren't mutually exclusive for this API. So the user might want to affect both the persistent and the live config at the same time with a single call. What do you think? > > > +goto cleanup; > > + > > +if (def) > > +testDomainModifyLifecycleAction(def, type, action); > > + > > +if (persistentDef) > > +testDomainModifyLifecycleAction(persistentDef, type, action); > > We'll need to make use of private data here too, if I set: > type=poweroff > action=restart > > the test domain needs to change states accordingly, IOW running->running, > right now we merely modified the XML which is not enough. > > Erik Right. A v2 is in the works. Thanks, Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainSetBlkioParameters
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 76 ++ 1 file changed, 76 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index a2a8599dac..e961e696eb 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3964,6 +3964,81 @@ testDomainGetBlockIoTune(virDomainPtr dom, #undef TEST_SET_PARAM +static int +testDomainSetBlkioParameters(virDomainPtr dom, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +size_t i; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_BLKIO_WEIGHT, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BLKIO_DEVICE_WEIGHT, + VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS, + VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS, + VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_BLKIO_DEVICE_READ_BPS, + VIR_TYPED_PARAM_STRING, + VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS, + VIR_TYPED_PARAM_STRING, + NULL) < 0) +return -1; + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +ret = 0; + +for (i = 0; i < nparams; i++) { +virTypedParameterPtr param = [i]; + +if (STREQ(param->field, VIR_DOMAIN_BLKIO_WEIGHT)) { +def->blkio.weight = param->value.ui; +} else if (STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WEIGHT) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_IOPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_IOPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_READ_BPS) || + STREQ(param->field, VIR_DOMAIN_BLKIO_DEVICE_WRITE_BPS)) { +virBlkioDevicePtr devices = NULL; +size_t ndevices; + +if (virDomainParseBlkioDeviceStr(param->value.s, + param->field, + , + ) < 0) { +ret = -1; +continue; +} + +if (virDomainMergeBlkioDevice(>blkio.devices, + >blkio.ndevices, + devices, ndevices, param->field) < 0) +ret = -1; + +virBlkioDeviceArrayClear(devices, ndevices); +VIR_FREE(devices); +} +} + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetBlkioParameters(virDomainPtr dom, virTypedParameterPtr params, @@ -9417,6 +9492,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */ .domainSetBlockIoTune = testDomainSetBlockIoTune, /* 5.7.0 */ .domainGetBlockIoTune = testDomainGetBlockIoTune, /* 5.7.0 */ +.domainSetBlkioParameters = testDomainSetBlkioParameters, /* 5.7.0 */ .domainGetBlkioParameters = testDomainGetBlkioParameters, /* 5.7.0 */ .connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */ .connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] test_driver: implement virDomainGetBlkioParameters
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 47 ++ 1 file changed, 47 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5f5c512571..a2a8599dac 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3964,6 +3964,52 @@ testDomainGetBlockIoTune(virDomainPtr dom, #undef TEST_SET_PARAM +static int +testDomainGetBlkioParameters(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +int maxparams = 6; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG | + VIR_TYPED_PARAM_STRING_OKAY, -1); + +if ((*nparams) == 0) { +*nparams = 6; +return 0; +} else if (*nparams < maxparams) { +maxparams = *nparams; +} + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +*nparams = 0; + +if (virTypedParameterAssign(&(params[(*nparams)++]), +VIR_DOMAIN_BLKIO_WEIGHT, +VIR_TYPED_PARAM_UINT, +def->blkio.weight) < 0) +goto cleanup; + +if (virDomainGetBlkioParametersAssignFromDef(def, params, nparams, maxparams) < 0) +goto cleanup; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testConnectNumOfDefinedDomains(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; @@ -9371,6 +9417,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */ .domainSetBlockIoTune = testDomainSetBlockIoTune, /* 5.7.0 */ .domainGetBlockIoTune = testDomainGetBlockIoTune, /* 5.7.0 */ +.domainGetBlkioParameters = testDomainGetBlkioParameters, /* 5.7.0 */ .connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */ .connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */ .domainCreate = testDomainCreate, /* 0.1.11 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement Get/Set Blkio parameters APIs
This series depends on another series that haven't been merged yet: https://www.redhat.com/archives/libvir-list/2019-July/msg00520.html Ilias Stamatis (2): test_driver: implement virDomainGetBlkioParameters test_driver: implement virDomainSetBlkioParameters src/test/test_driver.c | 123 + 1 file changed, 123 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 5/5] test_driver: implement virDomainSetIOThreadParams
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 85 ++ 1 file changed, 85 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7eef54bb05..6274d5bf0f 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3170,6 +3170,90 @@ testDomainGetIOThreadInfo(virDomainPtr dom, } +static int +testDomainSetIOThreadParams(virDomainPtr dom, +unsigned int iothread_id, +virTypedParameterPtr params, +int nparams, +unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +testDomainObjPrivatePtr priv; +testIOThreadInfo info_copy; +testIOThreadInfoPtr infop = NULL; +size_t i; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (iothread_id == 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("invalid value of 0 for iothread_id")); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!virDomainIOThreadIDFind(def, iothread_id)) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot find IOThread '%u' in iothreadids list"), + iothread_id); +goto cleanup; +} + +if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_IOTHREAD_POLL_MAX_NS, + VIR_TYPED_PARAM_ULLONG, + VIR_DOMAIN_IOTHREAD_POLL_GROW, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_IOTHREAD_POLL_SHRINK, + VIR_TYPED_PARAM_UINT, + NULL) < 0) +goto cleanup; + +priv = vm->privateData; + +for (i = 0; i < priv->num_iothreads; i++) { +if (iothread_id == priv->iothreads[i]->id) { +infop = priv->iothreads[i]; +break; +} +} + +if (!infop) +goto cleanup; + +memcpy(_copy, infop, sizeof(testIOThreadInfo)); + +if (virTypedParamsGetULLong(params, nparams, +VIR_DOMAIN_IOTHREAD_POLL_MAX_NS, +_copy.poll_max_ns) < 0) +goto cleanup; + +if (virTypedParamsGetUInt(params, nparams, + VIR_DOMAIN_IOTHREAD_POLL_GROW, + _copy.poll_grow) < 0) +goto cleanup; + +if (virTypedParamsGetUInt(params, nparams, + VIR_DOMAIN_IOTHREAD_POLL_SHRINK, + _copy.poll_shrink) < 0) +goto cleanup; + +memcpy(infop, _copy, sizeof(testIOThreadInfo)); + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -9628,6 +9712,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDelIOThread = testDomainDelIOThread, /* 5.7.0 */ .domainPinIOThread = testDomainPinIOThread, /* 5.7.0 */ .domainGetIOThreadInfo = testDomainGetIOThreadInfo, /* 5.7.0 */ +.domainSetIOThreadParams = testDomainSetIOThreadParams, /* 5.7.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 4/5] test_driver: implement virDomainGetIOThreadInfo
Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 74 ++ 1 file changed, 74 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 60d611245d..7eef54bb05 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3097,6 +3097,79 @@ testDomainPinIOThread(virDomainPtr dom, } +static int +testDomainGetIOThreadInfo(virDomainPtr dom, + virDomainIOThreadInfoPtr **info, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virBitmapPtr cpumask = NULL; +virBitmapPtr bitmap = NULL; +virDomainIOThreadInfoPtr *info_ret = NULL; +size_t i; +int hostcpus; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (def->niothreadids == 0) +goto cleanup; + +if ((hostcpus = virHostCPUGetCount()) < 0) +goto cleanup; + +if (VIR_ALLOC_N(info_ret, def->niothreadids) < 0) +goto cleanup; + +for (i = 0; i < def->niothreadids; i++) { +if (VIR_ALLOC(info_ret[i]) < 0) +goto cleanup; + +info_ret[i]->iothread_id = def->iothreadids[i]->iothread_id; + +cpumask = def->iothreadids[i]->cpumask; +if (!cpumask) { +if (def->cpumask) { +cpumask = def->cpumask; +} else { +if (!(bitmap = virBitmapNew(hostcpus))) +goto cleanup; +virBitmapSetAll(bitmap); +cpumask = bitmap; +} +} + +if (virBitmapToData(cpumask, _ret[i]->cpumap, +_ret[i]->cpumaplen) < 0) +goto cleanup; + +virBitmapFree(bitmap); +bitmap = NULL; +} + +VIR_STEAL_PTR(*info, info_ret); +ret = def->niothreadids; + + cleanup: +if (info_ret) { +for (i = 0; i < def->niothreadids; i++) +virDomainIOThreadInfoFree(info_ret[i]); +VIR_FREE(info_ret); +} +virBitmapFree(bitmap); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -9554,6 +9627,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainAddIOThread = testDomainAddIOThread, /* 5.7.0 */ .domainDelIOThread = testDomainDelIOThread, /* 5.7.0 */ .domainPinIOThread = testDomainPinIOThread, /* 5.7.0 */ +.domainGetIOThreadInfo = testDomainGetIOThreadInfo, /* 5.7.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 3/5] test_driver: implement virDomainPinIOThread
Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 51 ++ 1 file changed, 51 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index b4a883cb54..60d611245d 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3047,6 +3047,56 @@ testDomainDelIOThread(virDomainPtr dom, } +static int +testDomainPinIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned char *cpumap, + int maplen, + unsigned int flags) +{ +int ret = -1; +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainIOThreadIDDefPtr iothrid = NULL; +virBitmapPtr cpumask = NULL; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(cpumask = virBitmapNewData(cpumap, maplen))) +goto cleanup; + +if (virBitmapIsAllClear(cpumask)) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Empty iothread cpumap list for pinning")); +goto cleanup; +} + +if (!(iothrid = virDomainIOThreadIDFind(def, iothread_id))) { +virReportError(VIR_ERR_INVALID_ARG, + _("iothreadid %d not found"), iothread_id); +goto cleanup; +} + +virBitmapFree(iothrid->cpumask); +iothrid->cpumask = cpumask; +iothrid->autofill = false; + +ret = 0; + cleanup: +if (ret < 0) +virBitmapFree(cpumask); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -9503,6 +9553,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainAddIOThread = testDomainAddIOThread, /* 5.7.0 */ .domainDelIOThread = testDomainDelIOThread, /* 5.7.0 */ +.domainPinIOThread = testDomainPinIOThread, /* 5.7.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/5] test_driver: implement virDomainDelIOThread
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 85 ++ 1 file changed, 85 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7acde811ef..b4a883cb54 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2963,6 +2963,90 @@ testDomainAddIOThread(virDomainPtr dom, } +static int +testDomainDelIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +testDomainObjPrivatePtr priv; +size_t i, j; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (iothread_id == 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("invalid value of 0 for iothread_id")); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!virDomainIOThreadIDFind(def, iothread_id)) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot find IOThread '%u' in iothreadids list"), + iothread_id); +goto cleanup; +} + +for (i = 0; i < def->ndisks; i++) { +if (def->disks[i]->iothread == iothread_id) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot remove IOThread %u since it " + "is being used by disk '%s'"), + iothread_id, def->disks[i]->dst); +goto cleanup; +} +} + +for (i = 0; i < def->ncontrollers; i++) { +if (def->controllers[i]->iothread == iothread_id) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot remove IOThread '%u' since it " + "is being used by controller"), + iothread_id); +goto cleanup; +} +} + +for (i = 0; i < def->niothreadids; i++) { +if (def->iothreadids[i]->iothread_id == iothread_id) { +for (j = i + 1; j < def->niothreadids; j++) +def->iothreadids[j]->autofill = false; + +virDomainIOThreadIDDefFree(def->iothreadids[i]); +VIR_DELETE_ELEMENT(def->iothreadids, i, def->niothreadids); + +break; +} +} + +/* We have already deleted the iothread from the domain definition, now + * let's delete the info structure too from the domain-private data. */ + +priv = vm->privateData; + +for (i = 0; i < priv->num_iothreads; i++) { +if (iothread_id == priv->iothreads[i]->id) { +VIR_DELETE_ELEMENT(priv->iothreads, i, priv->num_iothreads); +break; +} +} + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -9418,6 +9502,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainAddIOThread = testDomainAddIOThread, /* 5.7.0 */ +.domainDelIOThread = testDomainDelIOThread, /* 5.7.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/5] test_driver: implement virDomainAddIOThread
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 67 ++ src/test/test_driver.h | 11 +++ 2 files changed, 78 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 5f5c512571..7acde811ef 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -396,6 +396,10 @@ struct _testDomainObjPrivate { /* used by get/set time APIs */ long long seconds; unsigned int nseconds; + +/* used by IOThread APIs */ +size_t num_iothreads; +testIOThreadInfoPtr *iothreads; }; @@ -413,6 +417,9 @@ testDomainObjPrivateAlloc(void *opaque) priv->seconds = 627319920; priv->nseconds = 0; +priv->num_iothreads = 0; +priv->iothreads = NULL; + return priv; } @@ -2897,6 +2904,65 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, } +static int +testDomainAddIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainIOThreadIDDefPtr iothrid = NULL; +testDomainObjPrivatePtr priv; +testIOThreadInfoPtr info; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (iothread_id == 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("invalid value of 0 for iothread_id")); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (virDomainIOThreadIDFind(def, iothread_id)) { +virReportError(VIR_ERR_INVALID_ARG, + _("an IOThread is already using iothread_id '%u'"), + iothread_id); +goto cleanup; +} + +if (!virDomainIOThreadIDAdd(def, iothread_id)) +goto cleanup; + +priv = vm->privateData; + +if (VIR_ALLOC(info) < 0) +goto cleanup; + +info->id = iothread_id; +info->poll_max_ns = 32768; + +if (VIR_APPEND_ELEMENT(priv->iothreads, priv->num_iothreads, info) < 0) +goto cleanup; + +ret = 0; + cleanup: +if (ret < 0) { +virDomainIOThreadIDDefFree(iothrid); +VIR_FREE(info); +} +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -9351,6 +9417,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSaveImageGetXMLDesc = testDomainSaveImageGetXMLDesc, /* 5.5.0 */ .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ +.domainAddIOThread = testDomainAddIOThread, /* 5.7.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ diff --git a/src/test/test_driver.h b/src/test/test_driver.h index 8c8a462db7..0ef913fdd3 100644 --- a/src/test/test_driver.h +++ b/src/test/test_driver.h @@ -23,4 +23,15 @@ #include "internal.h" + +typedef struct _testIOThreadInfo testIOThreadInfo; +typedef testIOThreadInfo *testIOThreadInfoPtr; + +struct _testIOThreadInfo { +unsigned int id; +unsigned long long poll_max_ns; +unsigned int poll_grow; +unsigned int poll_shrink; +}; + int testRegister(void); -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/5] test_driver: implement IOThread related APIs
Changes since v1: - Use vm-private data for storing iothread parameters and implement virDomainSetIOThreadParams Ilias Stamatis (5): test_driver: implement virDomainAddIOThread test_driver: implement virDomainDelIOThread test_driver: implement virDomainPinIOThread test_driver: implement virDomainGetIOThreadInfo test_driver: implement virDomainSetIOThreadParams src/test/test_driver.c | 362 + src/test/test_driver.h | 11 ++ 2 files changed, 373 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 1/2] test_driver: implement testDomainGetBlockIoTune
On Mon, Aug 12, 2019 at 11:33 AM Erik Skultety wrote: > > No need to CC me explicitly (especially for just a single patch of the > series), > all libvirt devs are subscribed to the list. > > Regards, > Erik I didn't do that intentionally. I think git send-email added you in the CC list because your e-mail address is contained in the commit message and I didn't notice when (and if) it told me so :) Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/2] test_driver: implement testDomainGetBlockIoTune
Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 102 + 1 file changed, 102 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2b5376ec28..14b7d683e1 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3611,6 +3611,107 @@ testDomainGetInterfaceParameters(virDomainPtr dom, virDomainObjEndAPI(); return ret; } + + +static int +testDomainGetBlockIoTune(virDomainPtr dom, + const char *path, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainDiskDefPtr disk; +virDomainBlockIoTuneInfo reply = {0}; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG | + VIR_TYPED_PARAM_STRING_OKAY, -1); + +flags &= ~VIR_TYPED_PARAM_STRING_OKAY; + +if (*nparams == 0) { +*nparams = 20; +return 0; +} + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(disk = virDomainDiskByName(def, path, true))) { +virReportError(VIR_ERR_INVALID_ARG, + _("disk '%s' was not found in the domain config"), + path); +goto cleanup; +} + +reply = disk->blkdeviotune; +if (VIR_STRDUP(reply.group_name, disk->blkdeviotune.group_name) < 0) +goto cleanup; + +TEST_SET_PARAM(0, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC, + VIR_TYPED_PARAM_ULLONG, reply.total_bytes_sec); +TEST_SET_PARAM(1, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC, + VIR_TYPED_PARAM_ULLONG, reply.read_bytes_sec); +TEST_SET_PARAM(2, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC, + VIR_TYPED_PARAM_ULLONG, reply.write_bytes_sec); + +TEST_SET_PARAM(3, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC, + VIR_TYPED_PARAM_ULLONG, reply.total_iops_sec); +TEST_SET_PARAM(4, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC, + VIR_TYPED_PARAM_ULLONG, reply.read_iops_sec); +TEST_SET_PARAM(5, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC, + VIR_TYPED_PARAM_ULLONG, reply.write_iops_sec); + +TEST_SET_PARAM(6, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.total_bytes_sec_max); +TEST_SET_PARAM(7, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.read_bytes_sec_max); +TEST_SET_PARAM(8, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.write_bytes_sec_max); + +TEST_SET_PARAM(9, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.total_iops_sec_max); +TEST_SET_PARAM(10, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.read_iops_sec_max); +TEST_SET_PARAM(11, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX, + VIR_TYPED_PARAM_ULLONG, reply.write_iops_sec_max); + +TEST_SET_PARAM(12, VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC, + VIR_TYPED_PARAM_ULLONG, reply.size_iops_sec); + +TEST_SET_PARAM(13, VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME, + VIR_TYPED_PARAM_STRING, reply.group_name); +reply.group_name = NULL; + +TEST_SET_PARAM(14, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.total_bytes_sec_max_length); +TEST_SET_PARAM(15, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.read_bytes_sec_max_length); +TEST_SET_PARAM(16, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.write_bytes_sec_max_length); + +TEST_SET_PARAM(17, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.total_iops_sec_max_length); +TEST_SET_PARAM(18, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.read_iops_sec_max_length); +TEST_SET_PARAM(19, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH, + VIR_TYPED_PARAM_ULLONG, reply.write_iops_sec_max_length); + +if (*nparams > 20) +*nparams = 20; + +ret = 0; + cleanup: +VIR_FREE(reply.group_name); +virDomainObjEndAPI(); +return ret; +} #undef TEST_SET_PARAM @@ -9019,6 +9120,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */ .domainSetInterfaceParameters = testDomainSetInterfaceParameters, /* 5.6.0 */ .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */
[libvirt] [PATCH v2 2/2] test_driver: implement virDomainSetBlockIoTune
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 259 + 1 file changed, 259 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 14b7d683e1..009bc18a73 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3613,6 +3613,264 @@ testDomainGetInterfaceParameters(virDomainPtr dom, } +#define TEST_BLOCK_IOTUNE_MAX 1000LL + +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(, , , +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(, , \ +, \ +TUNABLE_STR, \ +param->value.ul) < 0) \ +goto cleanup; \ +continue; \ +} + +for (i = 0; i < nparams; i++) { +virTypedParameterPtr par
[libvirt] [PATCH v2 0/2] test_driver: implement get/set BlockIoTune APIs
Ilias Stamatis (2): test_driver: implement testDomainGetBlockIoTune test_driver: implement virDomainSetBlockIoTune src/test/test_driver.c | 361 + 1 file changed, 361 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/3] test_driver: implement virDomainManagedSaveGetXMLDesc
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 30 ++ 1 file changed, 30 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 8bd5a5296b..211c0d737a 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7624,6 +7624,35 @@ testDomainManagedSave(virDomainPtr dom, unsigned int flags) } +static char * +testDomainManagedSaveGetXMLDesc(virDomainPtr dom, +unsigned int flags) +{ +virDomainObjPtr vm; +testDriverPtr privconn = dom->conn->privateData; +testDomainObjPrivatePtr privdom; +char *ret = NULL; + +virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); + +if (!(vm = testDomObjFromDomain(dom))) +return NULL; + +if (vm->hasManagedSave == false) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain does not have managed save image")); +goto cleanup; +} + +privdom = vm->privateData; +ret = virDomainDefFormat(privdom->managedDef, privconn->caps, VIR_DOMAIN_DEF_FORMAT_SECURE); + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) { @@ -9088,6 +9117,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */ .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ +.domainManagedSaveGetXMLDesc = testDomainManagedSaveGetXMLDesc, /* 5.7.0 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 3/3] test_driver: implement virDomainManagedSaveDefineXML
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 40 1 file changed, 40 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 211c0d737a..a127dc69c1 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7653,6 +7653,45 @@ testDomainManagedSaveGetXMLDesc(virDomainPtr dom, } +static int +testDomainManagedSaveDefineXML(virDomainPtr dom, + const char *dxml, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr newdef = NULL; +testDriverPtr privconn = dom->conn->privateData; +testDomainObjPrivatePtr privdom; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | + VIR_DOMAIN_SAVE_RUNNING | + VIR_DOMAIN_SAVE_PAUSED, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (vm->hasManagedSave == false) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain does not have managed save image")); +goto cleanup; +} + +if ((newdef = virDomainDefParseString(dxml, privconn->caps, privconn->xmlopt, NULL, + VIR_DOMAIN_DEF_PARSE_INACTIVE)) == NULL) +goto cleanup; + +privdom = vm->privateData; +virDomainDefFree(privdom->managedDef); +privdom->managedDef = newdef; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) { @@ -9118,6 +9157,7 @@ static virHypervisorDriver testHypervisorDriver = { .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ .domainManagedSaveGetXMLDesc = testDomainManagedSaveGetXMLDesc, /* 5.7.0 */ +.domainManagedSaveDefineXML = testDomainManagedSaveDefineXML, /* 5.7.0 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/3] test_driver: use domain-private data to store managed image
The managedSave APIs according to the documentation are supposed to operate on a disk file. However, this might not be appropriate in the case of the test driver since: * It's better if the test driver keeps all its state in memory only and doesn't affect the host in any way. * The test driver, apart from "emulating" the domains, it additionally "emulates" a fake physical host. Every time we start a new test connection that sort of means that a new physical host is created as well. And this fake host isn't necessarily the same. What we can do instead is operating on the already existing domain definitions. So along as a connection remains open, a domain can preserve the managed state between different shutdown / create calls. When the test connection closes this means that the fake host is destroyed as well, hence no other state is preserved after that. This way we also make sure that we don't touch the real host's filesystem. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 23 ++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2b5376ec28..8bd5a5296b 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -396,6 +396,9 @@ struct _testDomainObjPrivate { /* used by get/set time APIs */ long long seconds; unsigned int nseconds; + +/* used by managed save APIs */ +virDomainDefPtr managedDef; }; @@ -413,6 +416,8 @@ testDomainObjPrivateAlloc(void *opaque) priv->seconds = 627319920; priv->nseconds = 0; +priv->managedDef = NULL; + return priv; } @@ -624,6 +629,7 @@ static const unsigned long long defaultPoolAlloc; static int testStoragePoolObjSetDefaults(virStoragePoolObjPtr obj); static int testNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info); static virNetworkObjPtr testNetworkObjFindByName(testDriverPtr privconn, const char *name); +static int testDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags); static virDomainObjPtr testDomObjFromDomain(virDomainPtr domain) @@ -706,6 +712,7 @@ testDomainStartState(testDriverPtr privconn, virDomainObjPtr dom, virDomainRunningReason reason) { +testDomainObjPrivatePtr priv = dom->privateData; int ret = -1; virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, reason); @@ -717,7 +724,9 @@ testDomainStartState(testDriverPtr privconn, goto cleanup; } +virDomainDefFree(priv->managedDef); dom->hasManagedSave = false; + ret = 0; cleanup: if (ret < 0) @@ -4114,7 +4123,8 @@ static int testDomainUndefineFlags(virDomainPtr domain, event = virDomainEventLifecycleNewFromObj(privdom, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); -privdom->hasManagedSave = false; + +testDomainManagedSaveRemove(domain, 0); if (virDomainObjIsActive(privdom)) privdom->persistent = 0; @@ -7572,6 +7582,7 @@ static int testDomainManagedSave(virDomainPtr dom, unsigned int flags) { testDriverPtr privconn = dom->conn->privateData; +testDomainObjPrivatePtr privdom; virDomainObjPtr vm = NULL; virObjectEventPtr event = NULL; int ret = -1; @@ -7596,6 +7607,12 @@ testDomainManagedSave(virDomainPtr dom, unsigned int flags) event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SAVED); + +privdom = vm->privateData; +virDomainDefFree(privdom->managedDef); +privdom->managedDef = virDomainDefCopy(vm->def, privconn->caps, + privconn->xmlopt, NULL, false); + vm->hasManagedSave = true; ret = 0; @@ -7628,12 +7645,16 @@ static int testDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) { virDomainObjPtr vm; +testDomainObjPrivatePtr priv; virCheckFlags(0, -1); if (!(vm = testDomObjFromDomain(dom))) return -1; +priv = vm->privateData; +virDomainDefFree(priv->managedDef); + vm->hasManagedSave = false; virDomainObjEndAPI(); -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/3] test_driver: implement the remaining ManagedSave APIs
Ilias Stamatis (3): test_driver: use domain-private data to store managed image test_driver: implement virDomainManagedSaveGetXMLDesc test_driver: implement virDomainManagedSaveDefineXML src/test/test_driver.c | 93 +- 1 file changed, 92 insertions(+), 1 deletion(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 3/4] test_driver: implement virDomainSetVcpu
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 76 ++ 1 file changed, 76 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 99cba7db42..d6f1adf6e9 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2995,6 +2995,81 @@ testDomainSetVcpus(virDomainPtr domain, unsigned int nrCpus) return testDomainSetVcpusFlags(domain, nrCpus, VIR_DOMAIN_AFFECT_LIVE); } + +static int +testDomainSetVcpu(virDomainPtr dom, + const char *cpumap, + int state, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainDefPtr persistentDef = NULL; +virBitmapPtr map = NULL; +ssize_t lastvcpu; +size_t i; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (state != 0 && state != 1) { +virReportInvalidArg(state, "%s", _("unsupported state value")); +return -1; +} + +if (virBitmapParse(cpumap, , 32) < 0) +goto cleanup; + +if ((lastvcpu = virBitmapLastSetBit(map)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("no vcpus selected for modification")); +goto cleanup; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (virDomainObjGetDefs(vm, flags, , ) < 0) +goto cleanup; + +if (persistentDef) { +if (lastvcpu >= virDomainDefGetVcpusMax(persistentDef)) { +virReportError(VIR_ERR_INVALID_ARG, + _("vcpu %zd is not present in persistent config"), + lastvcpu); +goto cleanup; +} +} + +if (def) { +if (lastvcpu >= virDomainDefGetVcpusMax(def)) { +virReportError(VIR_ERR_INVALID_ARG, + _("vcpu %zd is not present in live config"), + lastvcpu); +goto cleanup; +} +} + +if (virBitmapIsBitSet(map, 0)) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("vCPU '0' can't be modified")); +goto cleanup; +} + +for (i = 1; i < vm->def->maxvcpus - 1; i++) { +if (virBitmapIsBitSet(map, i)) +vm->def->vcpus[i]->online = state; +} + +ret = 0; + cleanup: +virBitmapFree(map); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo, @@ -9032,6 +9107,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ +.domainSetVcpu = testDomainSetVcpu, /* 5.7.0 */ .domainGetVcpusFlags = testDomainGetVcpusFlags, /* 0.8.5 */ .domainGetGuestVcpus = testDomainGetGuestVcpus, /* 5.7.0 */ .domainPinVcpu = testDomainPinVcpu, /* 0.7.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 4/4] test_driver: implement virDomainSetGuestVcpus
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 12 1 file changed, 12 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d6f1adf6e9..6698fb7cf6 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3070,6 +3070,17 @@ testDomainSetVcpu(virDomainPtr dom, } +static int +testDomainSetGuestVcpus(virDomainPtr dom, +const char *cpumap, +int state, +unsigned int flags) +{ +virCheckFlags(0, -1); +return testDomainSetVcpu(dom, cpumap, state, VIR_DOMAIN_AFFECT_LIVE); +} + + static int testDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo, @@ -9108,6 +9119,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ .domainSetVcpu = testDomainSetVcpu, /* 5.7.0 */ +.domainSetGuestVcpus = testDomainSetGuestVcpus, /* 5.7.0 */ .domainGetVcpusFlags = testDomainGetVcpusFlags, /* 0.8.5 */ .domainGetGuestVcpus = testDomainGetGuestVcpus, /* 5.7.0 */ .domainPinVcpu = testDomainPinVcpu, /* 0.7.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/4] test_driver: implement virDomainGetGuestVcpus
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 70 ++ 1 file changed, 70 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index a6f239b9f1..99cba7db42 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2820,6 +2820,75 @@ testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags) return ret; } + +static int +testDomainGetGuestVcpus(virDomainPtr dom, +virTypedParameterPtr *params, +unsigned int *nparams, +unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virBitmapPtr vcpus = NULL; +virBitmapPtr online = NULL; +virTypedParameterPtr par = NULL; +char *tmp = NULL; +size_t i; +int npar = 0; +int maxpar = 0; +int ret = -1; + +virCheckFlags(0, ret); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +if (!(vcpus = virBitmapNew(vm->def->maxvcpus))) +goto cleanup; + +if (!(online = virBitmapNew(vm->def->maxvcpus))) +goto cleanup; + +for (i = 0; i < vm->def->maxvcpus; i++) { +if (virBitmapSetBit(vcpus, i) < 0) +goto cleanup; + +if (vm->def->vcpus[i]->online && virBitmapSetBit(online, i) < 0) +goto cleanup; +} + +#define ADD_BITMAP(map, name) \ +if (!(tmp = virBitmapFormat(map))) \ +goto cleanup; \ +if (virTypedParamsAddString(, , , name, tmp) < 0) \ +goto cleanup; \ +VIR_FREE(tmp) + +ADD_BITMAP(vcpus, "vcpus"); +ADD_BITMAP(online, "online"); + +if (virBitmapClearBit(online, 0) < 0) +goto cleanup; +ADD_BITMAP(online, "offlinable"); +#undef ADD_BITMAP + +*params = par; +*nparams = npar; +par = NULL; + +ret = 0; + cleanup: +VIR_FREE(tmp); +virBitmapFree(vcpus); +virBitmapFree(online); +virDomainObjEndAPI(); +virTypedParamsFree(par, npar); +return ret; +} + + static int testDomainGetMaxVcpus(virDomainPtr domain) { @@ -8964,6 +9033,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ .domainGetVcpusFlags = testDomainGetVcpusFlags, /* 0.8.5 */ +.domainGetGuestVcpus = testDomainGetGuestVcpus, /* 5.7.0 */ .domainPinVcpu = testDomainPinVcpu, /* 0.7.3 */ .domainPinVcpuFlags = testDomainPinVcpuFlags, /* 5.6.0 */ .domainGetVcpus = testDomainGetVcpus, /* 0.7.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/4] test_driver: make testDomainGetVcpus report all vcpus
The current implementation of testDomainGetVcpus is erroneous. When offline vcpus are encountered in the vm definition, the corresponding fields in the output array are left empty. Additionally some vcpus are not reported at all due to the wrong invariant checking done in the loop. Make testDomainGetVcpus report all vcpus instead of reporting the online ones only. Set the state field in the virVcpuInfo structure appropriately in order to mark offline vcpus. --- src/test/test_driver.c | 9 +++-- 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18baa265..a6f239b9f1 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2968,8 +2968,8 @@ static int testDomainGetVcpus(virDomainPtr domain, virBitmapSetAll(allcpumap); /* Clamp to actual number of vcpus */ -if (maxinfo > virDomainDefGetVcpus(privdom->def)) -maxinfo = virDomainDefGetVcpus(privdom->def); +if (maxinfo > virDomainDefGetVcpusMax(def)) +maxinfo = virDomainDefGetVcpusMax(def); memset(info, 0, sizeof(*info) * maxinfo); memset(cpumaps, 0, maxinfo * maplen); @@ -2978,9 +2978,6 @@ static int testDomainGetVcpus(virDomainPtr domain, virDomainVcpuDefPtr vcpu = virDomainDefGetVcpu(def, i); virBitmapPtr bitmap = NULL; -if (!vcpu->online) -continue; - if (vcpu->cpumask) bitmap = vcpu->cpumask; else if (def->cpumask) @@ -2992,7 +2989,7 @@ static int testDomainGetVcpus(virDomainPtr domain, virBitmapToDataBuf(bitmap, VIR_GET_CPUMAP(cpumaps, maplen, i), maplen); info[i].number = i; -info[i].state = VIR_VCPU_RUNNING; +info[i].state = vcpu->online; info[i].cpu = virBitmapLastSetBit(bitmap); /* Fake an increasing cpu time value */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/4] test_driver: implement the remaining VCPUs-related APIs
Ilias Stamatis (4): test_driver: make testDomainGetVcpus report all vcpus test_driver: implement virDomainGetGuestVcpus test_driver: implement virDomainSetVcpu test_driver: implement virDomainSetGuestVcpus src/test/test_driver.c | 167 +++-- 1 file changed, 161 insertions(+), 6 deletions(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainGetBlockInfo
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 40 1 file changed, 40 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18baa265..106e8f027e 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7729,6 +7729,45 @@ testDomainMemoryPeek(virDomainPtr dom, } +static int +testDomainGetBlockInfo(virDomainPtr dom, + const char *path, + virDomainBlockInfoPtr info, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDiskDefPtr disk; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(disk = virDomainDiskByName(vm->def, path, false))) { +virReportError(VIR_ERR_INVALID_ARG, + _("invalid path %s not assigned to domain"), path); +goto cleanup; +} + +if (virStorageSourceIsEmpty(disk->src)) { +virReportError(VIR_ERR_INVALID_ARG, + _("disk '%s' does not currently have a source assigned"), + path); +goto cleanup; +} + +info->capacity = 1099506450432; +info->allocation = 1099511627776; +info->physical = 1099511627776; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + /* * Snapshot APIs */ @@ -9031,6 +9070,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ +.domainGetBlockInfo = testDomainGetBlockInfo, /* 5.7.0 */ .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ .domainSnapshotListNames = testDomainSnapshotListNames, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] test_driver: implement virDomainManagedSaveGetXMLDesc
The managedSave APIs according to the documentation are supposed to operate on a disk file. However, this might not be appropriate in the case of the test driver since: * It's better if the test driver keeps all its state in memory only and doesn't affect the host in any way. * The test driver, apart from "emulating" the domains, it additionally "emulates" a fake physical host. Every time we start a new test connection that sort of means that a new physical host is created as well. And this fake host isn't necessarily the same. What we can do instead is operating on the already existing domain definitions. So along as a connection remains open, a domain can preserve the managed state between different shutdown / create calls. When the test connection closes this means that the fake host is destroyed as well, hence no other state is preserved after that. This way we also make sure that we don't touch the real host's filesystem. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 28 1 file changed, 28 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6f18baa265..8715d6c0d6 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7606,6 +7606,33 @@ testDomainManagedSave(virDomainPtr dom, unsigned int flags) } +static char * +testDomainManagedSaveGetXMLDesc(virDomainPtr dom, +unsigned int flags) +{ +virDomainObjPtr vm; +testDriverPtr privconn = dom->conn->privateData; +char *ret = NULL; + +virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); + +if (!(vm = testDomObjFromDomain(dom))) +return NULL; + +if (vm->hasManagedSave == false) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain does not have managed save image")); +goto cleanup; +} + +ret = virDomainDefFormat(vm->def, privconn->caps, VIR_DOMAIN_DEF_FORMAT_SECURE); + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) { @@ -9027,6 +9054,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */ .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ +.domainManagedSaveGetXMLDesc = testDomainManagedSaveGetXMLDesc, /* 5.7.0 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement the remaining ManagedSave APIs
Ilias Stamatis (2): test_driver: implement virDomainManagedSaveGetXMLDesc test_driver: implement virDomainManagedSaveDefineXML src/test/test_driver.c | 66 ++ 1 file changed, 66 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainManagedSaveDefineXML
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 38 ++ 1 file changed, 38 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 8715d6c0d6..360bdef373 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7633,6 +7633,43 @@ testDomainManagedSaveGetXMLDesc(virDomainPtr dom, } +static int +testDomainManagedSaveDefineXML(virDomainPtr dom, + const char *dxml, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr newdef = NULL; +testDriverPtr privconn = dom->conn->privateData; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | + VIR_DOMAIN_SAVE_RUNNING | + VIR_DOMAIN_SAVE_PAUSED, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (vm->hasManagedSave == false) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain does not have managed save image")); +goto cleanup; +} + +if ((newdef = virDomainDefParseString(dxml, privconn->caps, privconn->xmlopt, NULL, + VIR_DOMAIN_DEF_PARSE_INACTIVE)) == NULL) +goto cleanup; + +virDomainDefFree(vm->def); +vm->def = newdef; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) { @@ -9055,6 +9092,7 @@ static virHypervisorDriver testHypervisorDriver = { .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ .domainManagedSaveGetXMLDesc = testDomainManagedSaveGetXMLDesc, /* 5.7.0 */ +.domainManagedSaveDefineXML = testDomainManagedSaveDefineXML, /* 5.7.0 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/2] test_driver: implement virDomainSetBlockIoTune
On Sun, Aug 4, 2019 at 6:32 PM Erik Skultety wrote: > > On Sat, Jul 27, 2019 at 05:04:38PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > > > I deliberately omitted the logic from qemuDomainSetBlockIoTuneDefaults > > in order to leave the function simpler. I think that in the case of the > > test driver it is ok. > > > > After all, how we handle the parameters it is supposed to be > > hypervisor-specific. > > > > src/test/test_driver.c | 196 + > > 1 file changed, 196 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index 9f4e255e35..3272ecf4b7 100755 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -3502,6 +3502,201 @@ testDomainGetInterfaceParameters(virDomainPtr dom, > > } > > > > > > +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, > > +
Re: [libvirt] [PATCH 1/2] test_driver: implement virDomainGetBlockIoTune
On Sun, Aug 4, 2019 at 5:32 PM Erik Skultety wrote: > > On Sun, Aug 04, 2019 at 03:46:03PM +0200, Ilias Stamatis wrote: > > On Sun, Aug 4, 2019 at 11:12 AM Erik Skultety wrote: > > > > > > On Sat, Jul 27, 2019 at 05:04:37PM +0200, Ilias Stamatis wrote: > > > > Signed-off-by: Ilias Stamatis > > > > --- > > > > src/test/test_driver.c | 90 ++ > > > > 1 file changed, 90 insertions(+) > > > > > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > > > index ab0f8b06d6..9f4e255e35 100755 > > > > --- a/src/test/test_driver.c > > > > +++ b/src/test/test_driver.c > > > > @@ -3500,6 +3500,95 @@ testDomainGetInterfaceParameters(virDomainPtr > > > > dom, > > > > virDomainObjEndAPI(); > > > > return ret; > > > > } > > > > + > > > > + > > > > +static int > > > > +testDomainGetBlockIoTune(virDomainPtr dom, > > > > + const char *path, > > > > + virTypedParameterPtr params, > > > > + int *nparams, > > > > + unsigned int flags) > > > > +{ > > > > +virDomainObjPtr vm = NULL; > > > > +virDomainDefPtr def = NULL; > > > > +virDomainDiskDefPtr disk; > > > > +virDomainBlockIoTuneInfo reply = {0}; > > > > +int ret = -1; > > > > + > > > > +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | > > > > + VIR_DOMAIN_AFFECT_CONFIG | > > > > + VIR_TYPED_PARAM_STRING_OKAY, -1); > > > > + > > > > +flags &= ~VIR_TYPED_PARAM_STRING_OKAY; > > > > + > > > > +if (*nparams == 0) { > > > > +*nparams = 20; > > > > +return 0; > > > > +} > > > > + > > > > +if (!(vm = testDomObjFromDomain(dom))) > > > > +return -1; > > > > + > > > > +if (!(def = virDomainObjGetOneDef(vm, flags))) > > > > +goto cleanup; > > > > + > > > > +if (!(disk = virDomainDiskByName(def, path, true))) { > > > > +virReportError(VIR_ERR_INVALID_ARG, > > > > + _("disk '%s' was not found in the domain > > > > config"), > > > > + path); > > > > +goto cleanup; > > > > +} > > > > + > > > > +reply = disk->blkdeviotune; > > > > +if (VIR_STRDUP(reply.group_name, disk->blkdeviotune.group_name) < > > > > 0) > > > > +goto cleanup; > > > > + > > > > +#define ULL VIR_TYPED_PARAM_ULLONG > > > > > > I don't see a point in doing ^this just to save a few characters, we're > > > way > > > over the 80 columns already anyway, so wrap the long lines and span the > > > macro > > > call over multiple lines. > > > > That's true that we're already over the 80 columns, but not by that > > much so I thought that by doing it like that it allows us to "save" 13 > > new lines. > > Well, there isn't strictly a rule of thumb here. It's always a personal > preference, but I look at it whether we gained anything by this "translation", > we saved 13 lines, great. However, if you split the lines properly, are we > really going to lose anything? No, not even in terms of readability. Okay, I see your point and it makes sense. > > > > > > Funny that I remember us having a discussion about macros doing string > > > concatenation (which I don't really mind that much) but prevents you from > > > jumping > > > directly to the symbol definition - that's exactly what the QEMU > > > alternative > > > does, I guess just to save some common prefixes :D. > > > > Actually in this case it doesn't really prevent you. Just you need an > > extra jump. One to jump to the definition of the ULL and from there to > > jump to the next definition (even though all the ULL usage fits in a > > single screen). > > > > Instead if there are many (instead of a single one) strings like like > > "TOTAL_BYTES_SEC", "READ_BYTES_SEC" etc that are concatenated/extended > > magically by some macro it makes it trickier to find the original > > definitions. But that's just my opinion. > >
[libvirt] [PATCH v2 1/2] test_driver: make testDomainGetTime read time from vm-private data
Until now, testDomainGetTime would always return the same fixed values everytime it was called. By using domain-private data we can make this API return the values previously set with testDomainSetTime, or use the same old fixed values in case testDomainSetTime hasn't been called at all. Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 13 +++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6bca4e277f..3e2cd3a9a4 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -392,6 +392,10 @@ struct _testDomainObjPrivate { testDriverPtr driver; bool frozen[2]; /* used by file system related calls */ + +/* used by get/set time APIs */ +long long seconds; +unsigned int nseconds; }; @@ -406,6 +410,9 @@ testDomainObjPrivateAlloc(void *opaque) priv->driver = opaque; priv->frozen[0] = priv->frozen[1] = false; +priv->seconds = 627319920; +priv->nseconds = 0; + return priv; } @@ -2104,6 +2111,7 @@ testDomainGetTime(virDomainPtr dom, unsigned int flags) { virDomainObjPtr vm = NULL; +testDomainObjPrivatePtr priv; int ret = -1; virCheckFlags(0, -1); @@ -2117,8 +2125,9 @@ testDomainGetTime(virDomainPtr dom, goto cleanup; } -*seconds = 627319920; -*nseconds = 0; +priv = vm->privateData; +*seconds = priv->seconds; +*nseconds = priv->nseconds; ret = 0; cleanup: -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/2] test_driver: implement virDomainSetTime
Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 30 ++ 1 file changed, 30 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 3e2cd3a9a4..6f18baa265 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2135,6 +2135,35 @@ testDomainGetTime(virDomainPtr dom, return ret; } + +static int +testDomainSetTime(virDomainPtr dom, + long long seconds, + unsigned int nseconds, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +testDomainObjPrivatePtr priv; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_TIME_SYNC, ret); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +priv = vm->privateData; +priv->seconds = seconds; +priv->nseconds = nseconds; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + #define TEST_SAVE_MAGIC "TestGuestMagic" @@ -8923,6 +8952,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetInfo = testDomainGetInfo, /* 0.1.1 */ .domainGetState = testDomainGetState, /* 0.9.2 */ .domainGetTime = testDomainGetTime, /* 5.4.0 */ +.domainSetTime = testDomainSetTime, /* 5.7.0 */ .domainSave = testDomainSave, /* 0.3.2 */ .domainSaveFlags = testDomainSaveFlags, /* 0.9.4 */ .domainRestore = testDomainRestore, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/2] test_driver: implement virDomainSetTime and update virDomainGetTime
Ilias Stamatis (2): test_driver: make testDomainGetTime read time from vm-private data test_driver: implement virDomainSetTime src/test/test_driver.c | 43 -- 1 file changed, 41 insertions(+), 2 deletions(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainSetTime and update virDomainGetTime
Until now, testDomainGetTime would always return the same fixed value everytime it was called. By using domain-private data we can make this API return the values previously set with testDomainSetTime, or use the same old fixed value in case testDomainSetTime hasn't been called at all. --- src/test/test_driver.c | 45 -- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d9a7f815d5..6a75e63429 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -392,6 +392,11 @@ struct _testDomainObjPrivate { testDriverPtr driver; bool frozen[2]; /* used by file system related calls */ + + +/* used by get/set time APIs */ +long long seconds; +unsigned int nseconds; }; @@ -406,6 +411,9 @@ testDomainObjPrivateAlloc(void *opaque) priv->driver = opaque; priv->frozen[0] = priv->frozen[1] = false; +priv->seconds = 627319920; +priv->nseconds = 0; + return priv; } @@ -2082,6 +2090,7 @@ testDomainGetTime(virDomainPtr dom, unsigned int flags) { virDomainObjPtr vm = NULL; +testDomainObjPrivatePtr priv; int ret = -1; virCheckFlags(0, -1); @@ -2095,8 +2104,39 @@ testDomainGetTime(virDomainPtr dom, goto cleanup; } -*seconds = 627319920; -*nseconds = 0; +priv = vm->privateData; + +*seconds = priv->seconds; +*nseconds = priv->nseconds; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + +static int +testDomainSetTime(virDomainPtr dom, + long long seconds, + unsigned int nseconds, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +testDomainObjPrivatePtr priv; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_TIME_SYNC, ret); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +priv = vm->privateData; +priv->seconds = seconds; +priv->nseconds = nseconds; ret = 0; cleanup: @@ -8891,6 +8931,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetInfo = testDomainGetInfo, /* 0.1.1 */ .domainGetState = testDomainGetState, /* 0.9.2 */ .domainGetTime = testDomainGetTime, /* 5.4.0 */ +.domainSetTime = testDomainSetTime, /* 5.7.0 */ .domainSave = testDomainSave, /* 0.3.2 */ .domainSaveFlags = testDomainSaveFlags, /* 0.9.4 */ .domainRestore = testDomainRestore, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainReset
The qemu and vz implementations don't emit any signals when this API is called, so we can do the same here for now and succeed by doing nothing. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 23 +++ 1 file changed, 23 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index d9a7f815d5..6bca4e277f 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2004,6 +2004,28 @@ static int testDomainReboot(virDomainPtr domain, } +static int +testDomainReset(virDomainPtr dom, +unsigned int flags) +{ +virDomainObjPtr vm; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static char * testDomainGetHostname(virDomainPtr domain, unsigned int flags) @@ -8878,6 +8900,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainShutdown = testDomainShutdown, /* 0.1.1 */ .domainShutdownFlags = testDomainShutdownFlags, /* 0.9.10 */ .domainReboot = testDomainReboot, /* 0.1.1 */ +.domainReset = testDomainReset, /* 5.7.0 */ .domainDestroy = testDomainDestroy, /* 0.1.1 */ .domainDestroyFlags = testDomainDestroyFlags, /* 4.2.0 */ .domainGetOSType = testDomainGetOSType, /* 0.1.9 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] test_driver: implement virDomainCreateWithFiles
This should just forward the call to testDomainCreateWithFlags since we can't do anything with the provided file descriptors in the test driver. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 11 +++ 1 file changed, 11 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..ea1febd960 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3948,6 +3948,16 @@ static int testDomainCreate(virDomainPtr domain) return testDomainCreateWithFlags(domain, 0); } + +static int testDomainCreateWithFiles(virDomainPtr domain, + unsigned int nfiles ATTRIBUTE_UNUSED, + int *files ATTRIBUTE_UNUSED, + unsigned int flags) +{ +return testDomainCreateWithFlags(domain, flags); +} + + static int testDomainUndefineFlags(virDomainPtr domain, unsigned int flags) { @@ -8655,6 +8665,7 @@ static virHypervisorDriver testHypervisorDriver = { .connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */ .domainCreate = testDomainCreate, /* 0.1.11 */ .domainCreateWithFlags = testDomainCreateWithFlags, /* 0.8.2 */ +.domainCreateWithFiles = testDomainCreateWithFiles, /* 5.7.0 */ .domainDefineXML = testDomainDefineXML, /* 0.1.11 */ .domainDefineXMLFlags = testDomainDefineXMLFlags, /* 1.2.12 */ .domainUndefine = testDomainUndefine, /* 0.1.11 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainCreateXMLWithFile
This should just forward the call to testDomainCreateXML since we can't do anything with the provided file descriptors in the test driver. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 12 1 file changed, 12 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index ea1febd960..b14ae51baa 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1684,6 +1684,17 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, } +static virDomainPtr +testDomainCreateXMLWithFiles(virConnectPtr conn, + const char *xml, + unsigned int nfiles ATTRIBUTE_UNUSED, + int *files ATTRIBUTE_UNUSED, + unsigned int flags) +{ +return testDomainCreateXML(conn, xml, flags); +} + + static virDomainPtr testDomainLookupByID(virConnectPtr conn, int id) { @@ -8614,6 +8625,7 @@ static virHypervisorDriver testHypervisorDriver = { .connectNumOfDomains = testConnectNumOfDomains, /* 0.1.1 */ .connectListAllDomains = testConnectListAllDomains, /* 0.9.13 */ .domainCreateXML = testDomainCreateXML, /* 0.1.4 */ +.domainCreateXMLWithFiles = testDomainCreateXMLWithFiles, /* 5.7.0 */ .domainLookupByID = testDomainLookupByID, /* 0.1.1 */ .domainLookupByUUID = testDomainLookupByUUID, /* 0.1.1 */ .domainLookupByName = testDomainLookupByName, /* 0.1.1 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement the remaining virDomainCreate APIs
Ilias Stamatis (2): test_driver: implement virDomainCreateWithFiles test_driver: implement virDomainCreateXMLWithFile src/test/test_driver.c | 23 +++ 1 file changed, 23 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/2] test_driver: implement virDomainGetBlockIoTune
On Sun, Aug 4, 2019 at 11:12 AM Erik Skultety wrote: > > On Sat, Jul 27, 2019 at 05:04:37PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 90 ++ > > 1 file changed, 90 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index ab0f8b06d6..9f4e255e35 100755 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -3500,6 +3500,95 @@ testDomainGetInterfaceParameters(virDomainPtr dom, > > virDomainObjEndAPI(); > > return ret; > > } > > + > > + > > +static int > > +testDomainGetBlockIoTune(virDomainPtr dom, > > + const char *path, > > + virTypedParameterPtr params, > > + int *nparams, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm = NULL; > > +virDomainDefPtr def = NULL; > > +virDomainDiskDefPtr disk; > > +virDomainBlockIoTuneInfo reply = {0}; > > +int ret = -1; > > + > > +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | > > + VIR_DOMAIN_AFFECT_CONFIG | > > + VIR_TYPED_PARAM_STRING_OKAY, -1); > > + > > +flags &= ~VIR_TYPED_PARAM_STRING_OKAY; > > + > > +if (*nparams == 0) { > > +*nparams = 20; > > +return 0; > > +} > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +return -1; > > + > > +if (!(def = virDomainObjGetOneDef(vm, flags))) > > +goto cleanup; > > + > > +if (!(disk = virDomainDiskByName(def, path, true))) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("disk '%s' was not found in the domain config"), > > + path); > > +goto cleanup; > > +} > > + > > +reply = disk->blkdeviotune; > > +if (VIR_STRDUP(reply.group_name, disk->blkdeviotune.group_name) < 0) > > +goto cleanup; > > + > > +#define ULL VIR_TYPED_PARAM_ULLONG > > I don't see a point in doing ^this just to save a few characters, we're way > over the 80 columns already anyway, so wrap the long lines and span the macro > call over multiple lines. That's true that we're already over the 80 columns, but not by that much so I thought that by doing it like that it allows us to "save" 13 new lines. > Funny that I remember us having a discussion about macros doing string > concatenation (which I don't really mind that much) but prevents you from > jumping > directly to the symbol definition - that's exactly what the QEMU alternative > does, I guess just to save some common prefixes :D. Actually in this case it doesn't really prevent you. Just you need an extra jump. One to jump to the definition of the ULL and from there to jump to the next definition (even though all the ULL usage fits in a single screen). Instead if there are many (instead of a single one) strings like like "TOTAL_BYTES_SEC", "READ_BYTES_SEC" etc that are concatenated/extended magically by some macro it makes it trickier to find the original definitions. But that's just my opinion. For me it's alright to use the QEMU macro as well, but we have already the TEST_SET_PARAM which is used everywhere else so it makes more sense to use it here too for consistency reasons I believe. > > Looking at the functions that use the typed parameters, an improvement we > could > definitely do (in a standalone patch) is to ditch the index from the macro > definition since it's quite fragile, by doing: > > int maxparams = X; > > if (*nparams == 0) { > *nparams = maxparams; > return 0; > } > > *nparams = 0; > > TEST_SET_PARAM([*nparams++],...) > > > +TEST_SET_PARAM(0, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC, ULL, > > reply.total_bytes_sec); > > +TEST_SET_PARAM(1, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC, ULL, > > reply.read_bytes_sec); > > +TEST_SET_PARAM(2, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC, ULL, > > reply.write_bytes_sec); > > + > > +TEST_SET_PARAM(3, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC, ULL, > > reply.total_iops_sec); > > +TEST_SET_PARAM(4, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC, ULL, > > reply.read_iops_sec); > > +TEST_SET_PARAM(5, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC, ULL, > > reply.write_iops_sec); > > + > > +TEST_SET_PARAM(6, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX, ULL, > > reply.total_bytes_sec_max); >
[libvirt] [PATCH v2 4/4] test_driver: implement virDomainFSTrim
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 32 1 file changed, 32 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2a9041d777..cb373f61d3 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4177,6 +4177,37 @@ testDomainFSThaw(virDomainPtr dom, } +static int +testDomainFSTrim(virDomainPtr dom, + const char *mountPoint, + unsigned long long minimum ATTRIBUTE_UNUSED, + unsigned int flags) +{ +virDomainObjPtr vm; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +if (mountPoint && STRNEQ(mountPoint, "/") && STRNEQ(mountPoint, "/boot")) { +virReportError(VIR_ERR_OPERATION_INVALID, + _("mount point not found: %s"), + mountPoint); +goto cleanup; +} + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8825,6 +8856,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ .domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ .domainFSThaw = testDomainFSThaw, /* 5.7.0 */ +.domainFSTrim = testDomainFSTrim, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/4] test_driver: implement virDomainFSFreeze
On success update the domain-private data. Consider / and /boot to be the only mountpoints avaiable in order to be consistent with the other FS-related calls. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 72 ++ 1 file changed, 72 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 88a1d330c1..a8b75b175a 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -390,6 +390,8 @@ typedef struct _testDomainObjPrivate testDomainObjPrivate; typedef testDomainObjPrivate *testDomainObjPrivatePtr; struct _testDomainObjPrivate { testDriverPtr driver; + +bool frozen[2]; /* used by file system related calls */ }; @@ -402,6 +404,7 @@ testDomainObjPrivateAlloc(void *opaque) return NULL; priv->driver = opaque; +priv->frozen[0] = priv->frozen[1] = false; return priv; } @@ -4046,6 +4049,74 @@ static int testDomainUndefine(virDomainPtr domain) return testDomainUndefineFlags(domain, 0); } + +static int +testDomainFSFreeze(virDomainPtr dom, + const char **mountpoints, + unsigned int nmountpoints, + unsigned int flags) +{ +virDomainObjPtr vm; +testDomainObjPrivatePtr priv; +size_t i; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +priv = vm->privateData; + +if (nmountpoints == 0) { +ret = 0; +if (priv->frozen[0] == false) { +priv->frozen[0] = true; +ret++; +} +if (priv->frozen[1] == false) { +priv->frozen[1] = true; +ret++; +} +} else { +int nfreeze = 0; +bool freeze[2]; + +memcpy(, priv->frozen, 2); + +for (i = 0; i < nmountpoints; i++) { +if (STREQ(mountpoints[i], "/")) { +if (!freeze[0]) { +freeze[0] = true; +nfreeze++; +} +} else if (STREQ(mountpoints[i], "/boot")) { +if (!freeze[1]) { +freeze[1] = true; +nfreeze++; +} +} else { +virReportError(VIR_ERR_OPERATION_INVALID, + _("mount point not found: %s"), + mountpoints[i]); +goto cleanup; +} +} + +/* steal the helper copy */ +memcpy(priv->frozen, , 2); +ret = nfreeze; +} + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8692,6 +8763,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDefineXMLFlags = testDomainDefineXMLFlags, /* 1.2.12 */ .domainUndefine = testDomainUndefine, /* 0.1.11 */ .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ +.domainFSFreeze = testDomainFSFreeze, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/4] test_driver: implement FS-related APIs
Ilias Stamatis (4): test_driver: introduce domain-private data test_driver: implement virDomainFSFreeze test_driver: implement virDomainFSThaw test_driver: implement virDomainFSTrim src/test/test_driver.c | 200 - 1 file changed, 199 insertions(+), 1 deletion(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/4] test_driver: introduce domain-private data
vm-specific data can be used by APIs that need to preserve some state between calls Some of them are: - FS-related APIs for remembering which mountpoints are frozen - virDomainSetTime / virDomainGetTime for maintaining time information - virDomainSetIOThreadParams for storing the I/O thread parameters - virDomainManagedSaveDefineXML for internally storing the VM definition Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 35 ++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..88a1d330c1 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -386,6 +386,35 @@ testBuildCapabilities(virConnectPtr conn) } +typedef struct _testDomainObjPrivate testDomainObjPrivate; +typedef testDomainObjPrivate *testDomainObjPrivatePtr; +struct _testDomainObjPrivate { +testDriverPtr driver; +}; + + +static void * +testDomainObjPrivateAlloc(void *opaque) +{ +testDomainObjPrivatePtr priv; + +if (VIR_ALLOC(priv) < 0) +return NULL; + +priv->driver = opaque; + +return priv; +} + + +static void +testDomainObjPrivateFree(void *data) +{ +testDomainObjPrivatePtr priv = data; +VIR_FREE(priv); +} + + static testDriverPtr testDriverNew(void) { @@ -401,6 +430,10 @@ testDriverNew(void) VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT | VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING, }; +virDomainXMLPrivateDataCallbacks privatecb = { +.alloc = testDomainObjPrivateAlloc, +.free = testDomainObjPrivateFree, +}; testDriverPtr ret; if (testDriverInitialize() < 0) @@ -409,7 +442,7 @@ testDriverNew(void) if (!(ret = virObjectLockableNew(testDriverClass))) return NULL; -if (!(ret->xmlopt = virDomainXMLOptionNew(, NULL, , NULL, NULL)) || +if (!(ret->xmlopt = virDomainXMLOptionNew(, , , NULL, NULL)) || !(ret->eventState = virObjectEventStateNew()) || !(ret->ifaces = virInterfaceObjListNew()) || !(ret->domains = virDomainObjListNew()) || -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/4] test_driver: implement virDomainFSFreeze
On Fri, Aug 2, 2019 at 4:39 PM Erik Skultety wrote: > > On Tue, Jul 09, 2019 at 09:23:22PM +0200, Ilias Stamatis wrote: > > On success update the domain-private data. Consider / and /boot to be > > the only mountpoints avaiable in order to be consistent with the other > > FS-related calls. > > > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 58 ++ > > 1 file changed, 58 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index af3503c523..8c25c679a5 100644 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -388,6 +388,8 @@ typedef struct _testDomainObjPrivate > > testDomainObjPrivate; > > typedef testDomainObjPrivate *testDomainObjPrivatePtr; > > struct _testDomainObjPrivate { > > testDriverPtr driver; > > + > > +bool frozen[2]; /* used by file system related calls */ > > }; > > > > > > @@ -400,6 +402,7 @@ testDomainObjPrivateAlloc(void *opaque) > > return NULL; > > > > priv->driver = opaque; > > +priv->frozen[0] = priv->frozen[1] = false; > > > > return priv; > > } > > @@ -3439,6 +3442,60 @@ static int testDomainUndefine(virDomainPtr domain) > > return testDomainUndefineFlags(domain, 0); > > } > > > > + > > +static int > > +testDomainFSFreeze(virDomainPtr dom, > > + const char **mountpoints, > > + unsigned int nmountpoints, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm; > > +testDomainObjPrivatePtr priv; > > +size_t i; > > +int slash = 0, slash_boot = 0; > > One declaration per line please. Also, we should define these explicitly as > booleans, the standard states these would return 0 and 1 respectively. > I have seen in many places in the codebase many variables declared in the same line so that's what I thought it was okay when the variables are somehow coupled or related. But okay, apparently the single declaration per line rule has been added later. > > +int ret = -1; > > + > > +virCheckFlags(0, -1); > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +goto cleanup; > > + > > +if (virDomainObjCheckActive(vm) < 0) > > +goto cleanup; > > + > > +priv = vm->privateData; > > + > > +if (nmountpoints == 0) { > > +priv->frozen[0] = priv->frozen[1] = true; > > +ret = 2; > > Well, this is not always true, e.g. if '/' was frozen before, ret should be 1. > Similarly, if both were frozen prior to calling this API, we should return 0. Right. I don't remember why but I thought in the past that it made sense to report that we froze a partition even if it was already frozen from before. Maybe for simplicity? I can't recall my original thinking right now. But thinking about it again, sure, let's make it freeze only what's not frozen already. I'm sending a new patch with implementing your feedback. Thanks! Ilias > > > +} else { > > +for (i = 0; i < nmountpoints; i++) { > > +if (STREQ(mountpoints[i], "/")) { > > +slash = 1; > > +} else if (STREQ(mountpoints[i], "/boot")) { > > +slash_boot = 1; > > ^here too, if the filesystems were already frozen, we should not account for > them in @ret. > > > +} else { > > +virReportError(VIR_ERR_OPERATION_INVALID, > > + _("mount point not found: %s"), > > + mountpoints[i]); > > +goto cleanup; > > +} > > +} > > + > > +if (slash) > > +priv->frozen[0] = true; > > +if (slash_boot) > > +priv->frozen[1] = true; > > + > > +ret = slash + slash_boot; > > +} > > We could do ^this or alternatively, we could introduce another iterator > @nfreeze, use it within the loop. We could also declare: > > bool freeze[2]; > > //backup the original values: > memcpy(, priv->frozen, 2); > > for (mountpoints) { > //set the helper array > if (mount[i] == / && !freeze[i]) { > freeze[i] = true; > nfreeze++; > } > > else if (mount[i] == /boot && !freeze[i]) { > freeze[i] = true; > nfreeze++; > } > } > ret = nfreeze; > > //steal the helper copy > memcpy(priv->frozen, , 2); > > return ret; > > Erik -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/4] test_driver: introduce domain-private data
On Fri, Aug 2, 2019 at 1:23 PM Erik Skultety wrote: > > On Tue, Jul 09, 2019 at 09:23:21PM +0200, Ilias Stamatis wrote: > > --- > > Explaining that the private data will come handy to hold the information > whether filesystems have been frozen would be nice. Sure, just maybe let's not make it FS-specific only since we'll use that for other APIs too and there's nothing related to the FS APIs in this patch anyways. How about we add in the commit message something like: """ vm-specific data can be used by APIs that need to preserve some state between calls Some of them are: - FS-related APIs for remembering which mountpoints are frozen - virDomainSetTime / virDomainGetTime for maintaining time information - virDomainSetIOThreadParams for storing the I/O thread parameters - virDomainManagedSaveDefineXML for internally storing the VM definition """ > > Reviewed-by: Erik Skultety -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v3 2/2] test_driver: implement virDomainMemoryStats
Signed-off-by: Ilias Stamatis Reviewed-by: Erik Skultety --- src/test/test_driver.c | 54 ++ 1 file changed, 54 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 83e2c0289f..2fbaf1c4ee 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7370,6 +7370,59 @@ testDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) return 0; } + +static int +testDomainMemoryStats(virDomainPtr dom, + virDomainMemoryStatPtr stats, + unsigned int nr_stats, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +int cur_memory; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +cur_memory = vm->def->mem.cur_balloon; +ret = 0; + +#define STATS_SET_PARAM(name, value) \ +if (ret < nr_stats) { \ +stats[ret].tag = name; \ +stats[ret].val = value; \ +ret++; \ +} + +if (virDomainDefHasMemballoon(vm->def)) { +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, cur_memory); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_IN, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_UNUSED, cur_memory / 2); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_AVAILABLE, cur_memory); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_USABLE, cur_memory / 2); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 627319920); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_DISK_CACHES, cur_memory / 8); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_RSS, cur_memory / 2); +} + +#undef STATS_SET_PARAM + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainMemoryPeek(virDomainPtr dom, unsigned long long start, @@ -8700,6 +8753,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ +.domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v3 1/2] test_driver: add a memballoon device in the default config
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..83e2c0289f 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -450,6 +450,9 @@ static const char *defaultConnXML = " " " " "" +"" +" " +"" " " "" "" -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v3 0/2] test_driver: implement virDomainMemoryStats
Ilias Stamatis (2): test_driver: add a memballoon device in the default config test_driver: implement virDomainMemoryStats src/test/test_driver.c | 57 ++ 1 file changed, 57 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainSetLifecycleAction
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 58 ++ 1 file changed, 58 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..71d6baa3da 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7404,6 +7404,63 @@ testDomainMemoryPeek(virDomainPtr dom, } +static void +testDomainModifyLifecycleAction(virDomainDefPtr def, +virDomainLifecycle type, +virDomainLifecycleAction action) +{ +switch (type) { +case VIR_DOMAIN_LIFECYCLE_POWEROFF: +def->onPoweroff = action; +break; +case VIR_DOMAIN_LIFECYCLE_REBOOT: +def->onReboot = action; +break; +case VIR_DOMAIN_LIFECYCLE_CRASH: +def->onCrash = action; +break; +case VIR_DOMAIN_LIFECYCLE_LAST: +break; +} +} + + +static int +testDomainSetLifecycleAction(virDomainPtr dom, + unsigned int type, + unsigned int action, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainDefPtr persistentDef = NULL; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!virDomainDefLifecycleActionAllowed(type, action)) +return -1; + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjGetDefs(vm, flags, , ) < 0) +goto cleanup; + +if (def) +testDomainModifyLifecycleAction(def, type, action); + +if (persistentDef) +testDomainModifyLifecycleAction(persistentDef, type, action); + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + /* * Snapshot APIs */ @@ -8698,6 +8755,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ +.domainSetLifecycleAction = testDomainSetLifecycleAction, /* 5.7.0 */ .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ .domainSnapshotListNames = testDomainSnapshotListNames, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2] test_driver: implement virDomainMemoryStats
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 54 ++ 1 file changed, 54 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..0e0acf2baf 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -7367,6 +7367,59 @@ testDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) return 0; } + +static int +testDomainMemoryStats(virDomainPtr dom, + virDomainMemoryStatPtr stats, + unsigned int nr_stats, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +int cur_memory; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +cur_memory = vm->def->mem.cur_balloon; +ret = 0; + +#define STATS_SET_PARAM(name, value) \ +if (ret < nr_stats) { \ +stats[ret].tag = name; \ +stats[ret].val = value; \ +ret++; \ +} + +if (virDomainDefHasMemballoon(vm->def)) { +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, cur_memory); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_IN, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_UNUSED, cur_memory / 2); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_AVAILABLE, cur_memory); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_USABLE, cur_memory / 2); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 627319920); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_DISK_CACHES, cur_memory / 10); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL, 0); +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_RSS, cur_memory); +} + +#undef STATS_SET_PARAM + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainMemoryPeek(virDomainPtr dom, unsigned long long start, @@ -8697,6 +8750,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ +.domainMemoryStats = testDomainMemoryStats, /* 5.7.0 */ .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 6/6] test_driver: implement virDomainUpdateDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 72 ++ 1 file changed, 72 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index cffd60c75c..228e24b0ae 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4367,6 +4367,65 @@ testDomainDetachDeviceLiveAndConfig(virDomainDefPtr vmdef, } +static int +testDomainUpdateDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr newDisk; +virDomainDeviceDef oldDev = { .type = dev->type }; +virDomainNetDefPtr net; +int idx; +int ret = -1; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +newDisk = dev->data.disk; +if ((idx = virDomainDiskIndexByName(vmdef, newDisk->dst, false)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, + _("target %s doesn't exist."), newDisk->dst); +return -1; +} + +oldDev.data.disk = vmdef->disks[idx]; +if (virDomainDefCompatibleDevice(vmdef, dev, , + VIR_DOMAIN_DEVICE_ACTION_UPDATE, + false) < 0) +return -1; + +virDomainDiskDefFree(vmdef->disks[idx]); +vmdef->disks[idx] = newDisk; +dev->data.disk = NULL; +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if ((idx = virDomainNetFindIdx(vmdef, net)) < 0) +goto cleanup; + +oldDev.data.net = vmdef->nets[idx]; +if (virDomainDefCompatibleDevice(vmdef, dev, , + VIR_DOMAIN_DEVICE_ACTION_UPDATE, + false) < 0) +return -1; + +virDomainNetDefFree(vmdef->nets[idx]); +vmdef->nets[idx] = net; +dev->data.net = NULL; +ret = 0; +break; + +default: +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("neither persistent nor live update of device is supported")); +goto cleanup; +} + +ret = 0; + cleanup: +return ret; +} + + typedef enum { TEST_DEVICE_ATTACH = 0, TEST_DEVICE_DETACH, @@ -4408,6 +4467,8 @@ testDomainDeviceOperation(testDriverPtr driver, goto cleanup; break; case TEST_DEVICE_UPDATE: +if (testDomainUpdateDeviceLiveAndConfig(def, dev) < 0) +goto cleanup; break; } @@ -4506,6 +4567,16 @@ testDomainDetachDevice(virDomainPtr dom, } +static int +testDomainUpdateDeviceFlags(virDomainPtr dom, +const char *xml, +unsigned int flags) +{ +return testDomainAttachDetachUpdateDevice(dom, TEST_DEVICE_UPDATE, + xml, NULL, flags); +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -9157,6 +9228,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ .domainDetachDeviceAlias = testDomainDetachDeviceAlias, /* 5.7.0 */ +.domainUpdateDeviceFlags = testDomainUpdateDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 5/6] test_driver: implement virDomainDetachDeviceAlias
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 12 1 file changed, 12 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index de449d89fb..cffd60c75c 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4487,6 +4487,17 @@ testDomainDetachDeviceFlags(virDomainPtr dom, xml, NULL, flags); } + +static int +testDomainDetachDeviceAlias(virDomainPtr dom, +const char *alias, +unsigned int flags) +{ +return testDomainAttachDetachUpdateDevice(dom, TEST_DEVICE_DETACH, + NULL, alias, flags); +} + + static int testDomainDetachDevice(virDomainPtr dom, const char *xml) @@ -9145,6 +9156,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ .domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ +.domainDetachDeviceAlias = testDomainDetachDeviceAlias, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetDiskErrors = testDomainGetDiskErrors, /* 5.4.0 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 4/6] test_driver: implement virDomainDetachDevice
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 8 1 file changed, 8 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 1d371a5832..de449d89fb 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4487,6 +4487,13 @@ testDomainDetachDeviceFlags(virDomainPtr dom, xml, NULL, flags); } +static int +testDomainDetachDevice(virDomainPtr dom, + const char *xml) +{ +return testDomainDetachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE); +} + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) @@ -9136,6 +9143,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ .domainAttachDevice = testDomainAttachDevice, /* 5.7.0 */ .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ +.domainDetachDevice = testDomainDetachDevice, /* 5.7.0 */ .domainDetachDeviceFlags = testDomainDetachDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 3/6] test_driver: implement virDomainDetachDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 178 + 1 file changed, 178 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 784622985c..1d371a5832 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4202,6 +4202,171 @@ testDomainAttachDeviceLiveAndConfig(virDomainDefPtr vmdef, } +static int +testDomainDetachDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr disk, detach; +virDomainHostdevDefPtr hostdev, det_hostdev; +virDomainControllerDefPtr cont, det_cont; +virDomainNetDefPtr net; +virDomainLeaseDefPtr lease, det_lease; +virDomainFSDefPtr fs; +virDomainMemoryDefPtr mem; +int idx; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +disk = dev->data.disk; +if (!(detach = virDomainDiskRemoveByName(vmdef, disk->dst))) { +virReportError(VIR_ERR_INVALID_ARG, + _("no target device %s"), disk->dst); +return -1; +} +virDomainDiskDefFree(detach); +break; + +case VIR_DOMAIN_DEVICE_CONTROLLER: +cont = dev->data.controller; +if ((idx = virDomainControllerFind(vmdef, cont->type, + cont->idx)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("device not present in domain configuration")); +return -1; +} +det_cont = virDomainControllerRemove(vmdef, idx); +virDomainControllerDefFree(det_cont); +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if ((idx = virDomainNetFindIdx(vmdef, net)) < 0) +return -1; + +/* this is guaranteed to succeed */ +virDomainNetDefFree(virDomainNetRemove(vmdef, idx)); +break; + +case VIR_DOMAIN_DEVICE_HOSTDEV: { +hostdev = dev->data.hostdev; +if ((idx = virDomainHostdevFind(vmdef, hostdev, _hostdev)) < 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("device not present in domain configuration")); +return -1; +} +virDomainHostdevRemove(vmdef, idx); +virDomainHostdevDefFree(det_hostdev); +break; +} + +case VIR_DOMAIN_DEVICE_LEASE: +lease = dev->data.lease; +if (!(det_lease = virDomainLeaseRemove(vmdef, lease))) { +virReportError(VIR_ERR_DEVICE_MISSING, + _("Lease %s in lockspace %s does not exist"), + lease->key, NULLSTR(lease->lockspace)); +return -1; +} +virDomainLeaseDefFree(det_lease); +break; + +case VIR_DOMAIN_DEVICE_FS: +fs = dev->data.fs; +idx = virDomainFSIndexByName(vmdef, fs->dst); +if (idx < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching filesystem device was found")); +return -1; +} + +fs = virDomainFSRemove(vmdef, idx); +virDomainFSDefFree(fs); +break; + +case VIR_DOMAIN_DEVICE_RNG: +if ((idx = virDomainRNGFind(vmdef, dev->data.rng)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching RNG device was found")); +return -1; +} + +virDomainRNGDefFree(virDomainRNGRemove(vmdef, idx)); +break; + +case VIR_DOMAIN_DEVICE_MEMORY: +if ((idx = virDomainMemoryFindInactiveByDef(vmdef, +dev->data.memory)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("matching memory device was not found")); +return -1; +} +mem = virDomainMemoryRemove(vmdef, idx); +vmdef->mem.cur_balloon -= mem->size; +virDomainMemoryDefFree(mem); +break; + +case VIR_DOMAIN_DEVICE_REDIRDEV: +if ((idx = virDomainRedirdevDefFind(vmdef, +dev->data.redirdev)) < 0) { +virReportError(VIR_ERR_DEVICE_MISSING, "%s", + _("no matching redirdev was not found")); +return -1; +} + +virDomainRedirdevDefFree(virDomainRedirde
[libvirt] [PATCH 2/6] test_driver: implement virDomainAttachDevice
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 10 ++ 1 file changed, 10 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index c8aad6a0bb..784622985c 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4302,6 +4302,15 @@ testDomainAttachDeviceFlags(virDomainPtr dom, xml, NULL, flags); } + +static int +testDomainAttachDevice(virDomainPtr dom, + const char *xml) +{ +return testDomainAttachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE); +} + + static int testDomainGetAutostart(virDomainPtr domain, int *autostart) { @@ -8948,6 +8957,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainDefineXMLFlags = testDomainDefineXMLFlags, /* 1.2.12 */ .domainUndefine = testDomainUndefine, /* 0.1.11 */ .domainUndefineFlags = testDomainUndefineFlags, /* 0.9.4 */ +.domainAttachDevice = testDomainAttachDevice, /* 5.7.0 */ .domainAttachDeviceFlags = testDomainAttachDeviceFlags, /* 5.7.0 */ .domainGetAutostart = testDomainGetAutostart, /* 0.3.2 */ .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/6] test_driver: implement virDomainAttachDeviceFlags
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 290 + 1 file changed, 290 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index aae9875194..c8aad6a0bb 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4013,6 +4013,295 @@ static int testDomainUndefine(virDomainPtr domain) return testDomainUndefineFlags(domain, 0); } + +static int +testDomainAttachDeviceLiveAndConfig(virDomainDefPtr vmdef, +virDomainDeviceDefPtr dev) +{ +virDomainDiskDefPtr disk; +virDomainNetDefPtr net; +virDomainHostdevDefPtr hostdev; +virDomainControllerDefPtr controller; +virDomainHostdevDefPtr found; +virDomainLeaseDefPtr lease; +virDomainFSDefPtr fs; +virDomainRedirdevDefPtr redirdev; +virDomainShmemDefPtr shmem; +char mac[VIR_MAC_STRING_BUFLEN]; + +switch (dev->type) { +case VIR_DOMAIN_DEVICE_DISK: +disk = dev->data.disk; +if (virDomainDiskIndexByName(vmdef, disk->dst, true) >= 0) { +virReportError(VIR_ERR_INVALID_ARG, + _("target %s already exists."), disk->dst); +return -1; +} + +if (virDomainDiskInsert(vmdef, disk) < 0) +return -1; + +dev->data.disk = NULL; +break; + +case VIR_DOMAIN_DEVICE_CONTROLLER: +controller = dev->data.controller; +if (controller->idx != -1 && +virDomainControllerFind(vmdef, controller->type, +controller->idx) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("Target already exists")); +return -1; +} + +if (virDomainControllerInsert(vmdef, controller) < 0) +return -1; + +dev->data.controller = NULL; +break; + +case VIR_DOMAIN_DEVICE_NET: +net = dev->data.net; +if (virDomainHasNet(vmdef, net)) { +virReportError(VIR_ERR_INVALID_ARG, + _("network device with mac %s already exists"), + virMacAddrFormat(>mac, mac)); +return -1; +} + +if (virDomainNetInsert(vmdef, net)) +return -1; + +dev->data.net = NULL; +break; + +case VIR_DOMAIN_DEVICE_HOSTDEV: +hostdev = dev->data.hostdev; +if (virDomainHostdevFind(vmdef, hostdev, ) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("device is already in the domain configuration")); +return -1; +} + +if (virDomainHostdevInsert(vmdef, hostdev) < 0) +return -1; + +dev->data.hostdev = NULL; +break; + +case VIR_DOMAIN_DEVICE_LEASE: +lease = dev->data.lease; +if (virDomainLeaseIndex(vmdef, lease) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, + _("Lease %s in lockspace %s already exists"), + lease->key, NULLSTR(lease->lockspace)); +return -1; +} + +if (virDomainLeaseInsert(vmdef, lease) < 0) +return -1; + +dev->data.lease = NULL; +break; + +case VIR_DOMAIN_DEVICE_FS: +fs = dev->data.fs; +if (virDomainFSIndexByName(vmdef, fs->dst) >= 0) { +virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("Target already exists")); +return -1; +} + +if (virDomainFSInsert(vmdef, fs) < 0) +return -1; + +dev->data.fs = NULL; +break; + +case VIR_DOMAIN_DEVICE_RNG: +if (dev->data.rng->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && +virDomainDefHasDeviceAddress(vmdef, >data.rng->info)) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("a device with the same address already exists ")); +return -1; +} + +if (VIR_APPEND_ELEMENT(vmdef->rngs, vmdef->nrngs, dev->data.rng) < 0) +return -1; + +dev->data.rng = NULL; +break; + +case VIR_DOMAIN_DEVICE_MEMORY: +if (vmdef->nmems == vmdef->mem.memory_slots) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _(
[libvirt] [PATCH 0/6] test_driver: implement device attach/detach APIs
Ilias Stamatis (6): test_driver: implement virDomainAttachDeviceFlags test_driver: implement virDomainAttachDevice test_driver: implement virDomainDetachDeviceFlags test_driver: implement virDomainDetachDevice test_driver: implement virDomainDetachDeviceAlias test_driver: implement virDomainUpdateDeviceFlags src/test/test_driver.c | 570 + 1 file changed, 570 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/2] test_driver: implement virDomainGetCPUStats
On Mon, Jul 29, 2019 at 3:28 PM Erik Skultety wrote: > > On Sun, Jul 28, 2019 at 12:02:21PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 132 + > > 1 file changed, 132 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index ab0f8b06d6..56f08fc3d2 100755 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -3629,6 +3629,137 @@ static int testDomainSetMetadata(virDomainPtr dom, > > return ret; > > } > > > > +#define TEST_TOTAL_CPUTIME 48772617035 > > Let's be explicit with ullong ^here by adding LL Oops. I had seen Daniel's comment but forgot to apply. > > > + > > +static int > > +testDomainGetDomainTotalCpuStats(virTypedParameterPtr params, > > +int nparams) > > indent is off > > > +{ > > +if (nparams == 0) /* return supported number of params */ > > +return 3; > > + > > +if (virTypedParameterAssign([0], VIR_DOMAIN_CPU_STATS_CPUTIME, > > +VIR_TYPED_PARAM_ULLONG, > > TEST_TOTAL_CPUTIME) < 0) > > +return -1; > > + > > +if (nparams > 1 && > > +virTypedParameterAssign([1], > > +VIR_DOMAIN_CPU_STATS_USERTIME, > > +VIR_TYPED_PARAM_ULLONG, 554000) < 0) > > +return -1; > > + > > +if (nparams > 2 && > > +virTypedParameterAssign([2], > > +VIR_DOMAIN_CPU_STATS_SYSTEMTIME, > > +VIR_TYPED_PARAM_ULLONG, 646000) < 0) > > +return -1; > > + > > +if (nparams > 3) > > +nparams = 3; > > + > > +return nparams; > > +} > > + > > + > > +static int > > +testDomainGetPercpuStats(virTypedParameterPtr params, > > + unsigned int nparams, > > + int start_cpu, > > + unsigned int ncpus, > > + int total_cpus) > > +{ > > +size_t i; > > +int need_cpus; > > +int param_idx; > > +int ret = -1; > > @ret is unnecessary, see below > > > + > > +/* return the number of supported params */ > > +if (nparams == 0 && ncpus != 0) > > +return 2; > > + > > +/* return total number of cpus */ > > +if (ncpus == 0) { > > +ret = total_cpus; > > +goto cleanup; > > return total_cpus; > > > +} > > + > > +if (start_cpu >= total_cpus) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("start_cpu %d larger than maximum of %d"), > > + start_cpu, total_cpus - 1); > > +goto cleanup; > > return -1; > > > +} > > + > > +/* return percpu cputime in index 0 */ > > +param_idx = 0; > > + > > +/* number of cpus to compute */ > > +need_cpus = MIN(total_cpus, start_cpu + ncpus); > > + > > +for (i = 0; i < need_cpus; i++) { > > +if (i < start_cpu) > > +continue; > > How about initializing i = start_cpu straight away instead? > > > +int idx = (i - start_cpu) * nparams + param_idx; > > +if (virTypedParameterAssign([idx], > > +VIR_DOMAIN_CPU_STATS_CPUTIME, > > +VIR_TYPED_PARAM_ULLONG, > > +(TEST_TOTAL_CPUTIME / total_cpus) + i) > > < 0) > > I'd strongly prefer if we didn't perform the division in each iteration, I think the compiler will be smart enough to optimize this? But ok sure, let's not make assumptions. > the "+ i" also seems unnecessary. I just added it in order for different CPUs to return different values. +1, +2 etc. are trivial quantities so the results still make sense imo > > > +goto cleanup; > > return -1; > > > +} > > + > > +/* return percpu vcputime in index 1 */ > > +param_idx = 1; > > + > > +if (param_idx < nparams) { > > +for (i = start_cpu; i < need_cpus; i++) { > > +int idx = (i - start_cpu) * nparams + param_idx; > > +if (virTypedParameterAssign([idx], > > +
[libvirt] [PATCH v2 1/2] tests: virsh-optparse: remove no longer valid cpu-stats test cases
These test cases are no longer valid since this series provides an implementation of the virDomainGetCPUStats API for the test driver. Signed-off-by: Ilias Stamatis --- tests/virsh-optparse | 20 1 file changed, 20 deletions(-) diff --git a/tests/virsh-optparse b/tests/virsh-optparse index 090d6c205c..d9c8f3c731 100755 --- a/tests/virsh-optparse +++ b/tests/virsh-optparse @@ -179,26 +179,6 @@ virsh -q -c $test_url cpu-stats test --start -1 >out 2>err && fail=1 test -s out && fail=1 compare exp-err err || fail=1 -# Zero. The test driver doesn't support the operation so the command -# fails, but the value has been parsed correctly -cat <<\EOF > exp-err || framework_failure -error: Failed to retrieve CPU statistics for domain 'test' -error: this function is not supported by the connection driver: virDomainGetCPUStats -EOF -virsh -q -c $test_url cpu-stats test --start 0 >out 2>err && fail=1 -test -s out && fail=1 -compare exp-err err || fail=1 - -# Valid numeric value. The test driver doesn't support the operation -# so the command fails, but the value has been parsed correctly -cat <<\EOF > exp-err || framework_failure -error: Failed to retrieve CPU statistics for domain 'test' -error: this function is not supported by the connection driver: virDomainGetCPUStats -EOF -virsh -q -c $test_url cpu-stats test --start 42 >out 2>err && fail=1 -test -s out && fail=1 -compare exp-err err || fail=1 - ### Test a scaled numeric option # Non-numeric value -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/2] test_driver: implement virDomainGetCPUStats
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 132 + 1 file changed, 132 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index ab0f8b06d6..56f08fc3d2 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3629,6 +3629,137 @@ static int testDomainSetMetadata(virDomainPtr dom, return ret; } +#define TEST_TOTAL_CPUTIME 48772617035 + +static int +testDomainGetDomainTotalCpuStats(virTypedParameterPtr params, +int nparams) +{ +if (nparams == 0) /* return supported number of params */ +return 3; + +if (virTypedParameterAssign([0], VIR_DOMAIN_CPU_STATS_CPUTIME, +VIR_TYPED_PARAM_ULLONG, TEST_TOTAL_CPUTIME) < 0) +return -1; + +if (nparams > 1 && +virTypedParameterAssign([1], +VIR_DOMAIN_CPU_STATS_USERTIME, +VIR_TYPED_PARAM_ULLONG, 554000) < 0) +return -1; + +if (nparams > 2 && +virTypedParameterAssign([2], +VIR_DOMAIN_CPU_STATS_SYSTEMTIME, +VIR_TYPED_PARAM_ULLONG, 646000) < 0) +return -1; + +if (nparams > 3) +nparams = 3; + +return nparams; +} + + +static int +testDomainGetPercpuStats(virTypedParameterPtr params, + unsigned int nparams, + int start_cpu, + unsigned int ncpus, + int total_cpus) +{ +size_t i; +int need_cpus; +int param_idx; +int ret = -1; + +/* return the number of supported params */ +if (nparams == 0 && ncpus != 0) +return 2; + +/* return total number of cpus */ +if (ncpus == 0) { +ret = total_cpus; +goto cleanup; +} + +if (start_cpu >= total_cpus) { +virReportError(VIR_ERR_INVALID_ARG, + _("start_cpu %d larger than maximum of %d"), + start_cpu, total_cpus - 1); +goto cleanup; +} + +/* return percpu cputime in index 0 */ +param_idx = 0; + +/* number of cpus to compute */ +need_cpus = MIN(total_cpus, start_cpu + ncpus); + +for (i = 0; i < need_cpus; i++) { +if (i < start_cpu) +continue; +int idx = (i - start_cpu) * nparams + param_idx; +if (virTypedParameterAssign([idx], +VIR_DOMAIN_CPU_STATS_CPUTIME, +VIR_TYPED_PARAM_ULLONG, +(TEST_TOTAL_CPUTIME / total_cpus) + i) < 0) +goto cleanup; +} + +/* return percpu vcputime in index 1 */ +param_idx = 1; + +if (param_idx < nparams) { +for (i = start_cpu; i < need_cpus; i++) { +int idx = (i - start_cpu) * nparams + param_idx; +if (virTypedParameterAssign([idx], +VIR_DOMAIN_CPU_STATS_VCPUTIME, +VIR_TYPED_PARAM_ULLONG, +(TEST_TOTAL_CPUTIME / total_cpus) - 1234567890 + i) < 0) +goto cleanup; +} +param_idx++; +} + +ret = param_idx; + cleanup: +return ret; +} + + +static int +testDomainGetCPUStats(virDomainPtr dom, + virTypedParameterPtr params, + unsigned int nparams, + int start_cpu, + unsigned int ncpus, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +testDriverPtr privconn = dom->conn->privateData; +int ret = -1; + +virCheckFlags(VIR_TYPED_PARAM_STRING_OKAY, -1); + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +if (start_cpu == -1) +ret = testDomainGetDomainTotalCpuStats(params, nparams); +else +ret = testDomainGetPercpuStats(params, nparams, start_cpu, ncpus, + privconn->nodeInfo.cores); + + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSendProcessSignal(virDomainPtr dom, long long pid_value, @@ -8552,6 +8683,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSendKey = testDomainSendKey, /* 5.5.0 */ .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */ .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */ +.domainGetCPUStats = testDomainGetCPUStats, /* 5.6.0 */ .domainSendProcessSignal = testDomainSendProcessSignal, /* 5.5.0 */ .connectGetCPUModelNames = testConnectGetCPUModelNames, /* 1.1.3 */ .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/2] test_driver: implement virDomainGetCPUStats
Changes since v1: * Removed failing test cases * Total CPUTIME now is the sum of the individual CPUs Ilias Stamatis (2): tests: virsh-optparse: remove no longer valid cpu-stats test cases test_driver: implement virDomainGetCPUStats src/test/test_driver.c | 132 + tests/virsh-optparse | 20 --- 2 files changed, 132 insertions(+), 20 deletions(-) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainSetBlockIoTune
Signed-off-by: Ilias Stamatis --- I deliberately omitted the logic from qemuDomainSetBlockIoTuneDefaults in order to leave the function simpler. I think that in the case of the test driver it is ok. After all, how we handle the parameters it is supposed to be hypervisor-specific. src/test/test_driver.c | 196 + 1 file changed, 196 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 9f4e255e35..3272ecf4b7 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3502,6 +3502,201 @@ testDomainGetInterfaceParameters(virDomainPtr dom, } +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(, , , +VIR_DOMAIN_TUNABLE_BLKDEV_DISK, path) < 0) +goto cleanup; + +#define SET_IOTUNE_FIELD(FIELD, BOOL, CONST) \ +if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_##CONST)) { \ +info.FIELD = param->value.ul; \ +if (virTypedParamsAddULLong(, , \ +, \ +
[libvirt] [PATCH 1/2] test_driver: implement virDomainGetBlockIoTune
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 90 ++ 1 file changed, 90 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index ab0f8b06d6..9f4e255e35 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3500,6 +3500,95 @@ testDomainGetInterfaceParameters(virDomainPtr dom, virDomainObjEndAPI(); return ret; } + + +static int +testDomainGetBlockIoTune(virDomainPtr dom, + const char *path, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainDiskDefPtr disk; +virDomainBlockIoTuneInfo reply = {0}; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG | + VIR_TYPED_PARAM_STRING_OKAY, -1); + +flags &= ~VIR_TYPED_PARAM_STRING_OKAY; + +if (*nparams == 0) { +*nparams = 20; +return 0; +} + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(disk = virDomainDiskByName(def, path, true))) { +virReportError(VIR_ERR_INVALID_ARG, + _("disk '%s' was not found in the domain config"), + path); +goto cleanup; +} + +reply = disk->blkdeviotune; +if (VIR_STRDUP(reply.group_name, disk->blkdeviotune.group_name) < 0) +goto cleanup; + +#define ULL VIR_TYPED_PARAM_ULLONG +TEST_SET_PARAM(0, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC, ULL, reply.total_bytes_sec); +TEST_SET_PARAM(1, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC, ULL, reply.read_bytes_sec); +TEST_SET_PARAM(2, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC, ULL, reply.write_bytes_sec); + +TEST_SET_PARAM(3, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC, ULL, reply.total_iops_sec); +TEST_SET_PARAM(4, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC, ULL, reply.read_iops_sec); +TEST_SET_PARAM(5, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC, ULL, reply.write_iops_sec); + +TEST_SET_PARAM(6, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX, ULL, reply.total_bytes_sec_max); +TEST_SET_PARAM(7, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX, ULL, reply.read_bytes_sec_max); +TEST_SET_PARAM(8, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX, ULL, reply.write_bytes_sec_max); + +TEST_SET_PARAM(9, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX, ULL, reply.total_iops_sec_max); +TEST_SET_PARAM(10, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX, ULL, reply.read_iops_sec_max); +TEST_SET_PARAM(11, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX, ULL, reply.write_iops_sec_max); + +TEST_SET_PARAM(12, VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC, ULL, reply.size_iops_sec); + +TEST_SET_PARAM(13, VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME, VIR_TYPED_PARAM_STRING, reply.group_name); +reply.group_name = NULL; + +TEST_SET_PARAM(14, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH, ULL, + reply.total_bytes_sec_max_length); +TEST_SET_PARAM(15, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH, ULL, + reply.read_bytes_sec_max_length); +TEST_SET_PARAM(16, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH, ULL, + reply.write_bytes_sec_max_length); + +TEST_SET_PARAM(17, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH, ULL, + reply.total_iops_sec_max_length); +TEST_SET_PARAM(18, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH, ULL, + reply.read_iops_sec_max_length); +TEST_SET_PARAM(19, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH, ULL, + reply.write_iops_sec_max_length); +#undef ULL + +if (*nparams > 20) +*nparams = 20; + +ret = 0; + cleanup: +VIR_FREE(reply.group_name); +virDomainObjEndAPI(); +return ret; +} #undef TEST_SET_PARAM @@ -8512,6 +8601,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */ .domainSetInterfaceParameters = testDomainSetInterfaceParameters, /* 5.6.0 */ .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */ +.domainGetBlockIoTune = testDomainGetBlockIoTune, /* 5.6.0 */ .connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */ .connectNumOfDefinedDomains = testConnectNumOfDefinedDomains, /* 0.1.11 */ .domainCreate = testDomainCreate, /* 0.1.11 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement get/set BlockIoTune APIs
Ilias Stamatis (2): test_driver: implement virDomainGetBlockIoTune test_driver: implement virDomainSetBlockIoTune src/test/test_driver.c | 286 + 1 file changed, 286 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] test_driver: implement virDomainMemoryStats
On Wed, Jul 24, 2019 at 4:19 PM Erik Skultety wrote: > > On Tue, Jul 16, 2019 at 11:36:31PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 52 ++ > > 1 file changed, 52 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index fcb80c9e47..55976eedf1 100644 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -6845,6 +6845,57 @@ testDomainManagedSaveRemove(virDomainPtr dom, > > unsigned int flags) > > return 0; > > } > > > > + > > +static int > > +testDomainMemoryStats(virDomainPtr dom, > > + virDomainMemoryStatPtr stats, > > + unsigned int nr_stats, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm; > > +int ret = -1; > > + > > +virCheckFlags(0, -1); > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +return -1; > > + > > +if (virDomainObjCheckActive(vm) < 0) > > +goto cleanup; > > + > > +ret = 0; > > + > > +#define STATS_SET_PARAM(name, value) \ > > +if (ret < nr_stats) { \ > > +stats[ret].tag = name; \ > > +stats[ret].val = value; \ > > +ret++; \ > > +} > > + > > +if (virDomainDefHasMemballoon(vm->def)) { > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON, 1024000); > > ^This one... > > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_IN, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_UNUSED, 791584); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_AVAILABLE, 977816); > > ...and this one should be taken from the definition from what is reported in > . The reasoning behind that is that you can have multiple > machines defined and those values wouldn't make sense. Right, I'll fix that. > The rest can be semi-random in that the values need to be less than those I > mentioned. My concern here again is that we will have to send different values every time depending on the config. E.g. currentMemory - 45000. But is that good for testing? Ilias > > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_USABLE, 726244); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 627319920); > > I don't object to ^this unless it is affected by balloon period setting. If it > is, then it might make sense to take it into account. I haven't checked that > myself though, so it may simply not be worth anyway. > > Erik > > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_DISK_CACHES, 164964); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGALLOC, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_HUGETLB_PGFAIL, 0); > > +STATS_SET_PARAM(VIR_DOMAIN_MEMORY_STAT_RSS, 1131076); > > +} > > + > > +#undef STATS_SET_PARAM > > + > > + cleanup: > > +virDomainObjEndAPI(); > > +return ret; > > +} > > + > > + > > static int > > testDomainMemoryPeek(virDomainPtr dom, > > unsigned long long start, > > @@ -7799,6 +7850,7 @@ static virHypervisorDriver testHypervisorDriver = { > > .domainManagedSave = testDomainManagedSave, /* 1.1.4 */ > > .domainHasManagedSaveImage = testDomainHasManagedSaveImage, /* 1.1.4 */ > > .domainManagedSaveRemove = testDomainManagedSaveRemove, /* 1.1.4 */ > > +.domainMemoryStats = testDomainMemoryStats, /* 5.6.0 */ > > .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */ > > > > .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */ > > -- > > 2.22.0 > > > > -- > > libvir-list mailing list > > libvir-list@redhat.com > > https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] test_driver: implement virDomainGetCPUStats
On Thu, Jul 25, 2019 at 2:01 PM Erik Skultety wrote: > > On Thu, Jul 18, 2019 at 12:02:43PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 131 + > > 1 file changed, 131 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index fcb80c9e47..2907c043cb 100644 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -3258,6 +3258,136 @@ static int testDomainSetMetadata(virDomainPtr dom, > > return ret; > > } > > > > + > > +static int > > +testDomainGetDomainTotalCpuStats(virTypedParameterPtr params, > > +int nparams) > > +{ > > +if (nparams == 0) /* return supported number of params */ > > +return 3; > > + > > +if (virTypedParameterAssign([0], VIR_DOMAIN_CPU_STATS_CPUTIME, > > +VIR_TYPED_PARAM_ULLONG, 77102913900) < 0) > > +return -1; > > + > > +if (nparams > 1 && > > +virTypedParameterAssign([1], > > +VIR_DOMAIN_CPU_STATS_USERTIME, > > +VIR_TYPED_PARAM_ULLONG, 4565000) < 0) > > +return -1; > > + > > +if (nparams > 2 && > > +virTypedParameterAssign([2], > > +VIR_DOMAIN_CPU_STATS_SYSTEMTIME, > > +VIR_TYPED_PARAM_ULLONG, 1139000) < 0) > > +return -1; > > + > > +if (nparams > 3) > > +nparams = 3; > > + > > +return nparams; > > +} > > + > > + > > +static int > > +testDomainGetPercpuStats(virTypedParameterPtr params, > > + unsigned int nparams, > > + int start_cpu, > > + unsigned int ncpus, > > + int total_cpus) > > +{ > > +size_t i; > > +int need_cpus; > > +int param_idx; > > +int ret = -1; > > + > > +/* return the number of supported params */ > > +if (nparams == 0 && ncpus != 0) > > +return 2; > > + > > +/* return total number of cpus */ > > +if (ncpus == 0) { > > +ret = total_cpus; > > +goto cleanup; > > +} > > + > > +if (start_cpu >= total_cpus) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("start_cpu %d larger than maximum of %d"), > > + start_cpu, total_cpus - 1); > > +goto cleanup; > > +} > > + > > +/* return percpu cputime in index 0 */ > > +param_idx = 0; > > + > > +/* number of cpus to compute */ > > +need_cpus = MIN(total_cpus, start_cpu + ncpus); > > + > > +for (i = 0; i < need_cpus; i++) { > > +if (i < start_cpu) > > +continue; > > +int idx = (i - start_cpu) * nparams + param_idx; > > +if (virTypedParameterAssign([idx], > > +VIR_DOMAIN_CPU_STATS_CPUTIME, > > +VIR_TYPED_PARAM_ULLONG, > > +202542145062 + 10 * i) < 0) > > What's the reasoning behind the formula? I'm curious, wouldn't have > 202542145062 + i been enough? Anyhow, the CPUTIME should be a portion of the > total cputime of all CPUs, your per-CPU time is much bigger by the total, > that doesn't sound right. I don't care about the exact numbers, but I'd like > to > see them to make sense. > > Erik The 10 * i was totally random. You are right, let's make them make sense. We can have a total CPUTIME and then divide that equally (?) by the number of CPUs. The "problem" is that the number of CPUs can vary. So depending on the number of CPUs the test VM has been configured with, this API will return different numbers. Is that ok? Because I thought we would prefer to return the same fixed numbers every time. However then they won't make sense when the number of CPUs changes. Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 4/4] test_driver: implement virDomainGetIOThreadInfo
On Thu, Jul 25, 2019 at 5:43 PM Erik Skultety wrote: > > On Tue, Jul 23, 2019 at 12:17:57PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 74 ++ > > 1 file changed, 74 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index 47e28a01ec..4c6f3db8de 100644 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -2774,6 +2774,79 @@ testDomainPinIOThread(virDomainPtr dom, > > } > > > > > > +static int > > +testDomainGetIOThreadInfo(virDomainPtr dom, > > + virDomainIOThreadInfoPtr **info, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm = NULL; > > +virDomainDefPtr def = NULL; > > +virBitmapPtr cpumask = NULL; > > +virBitmapPtr bitmap = NULL; > > +virDomainIOThreadInfoPtr *info_ret = NULL; > > +size_t i; > > +int hostcpus; > > +int ret = -1; > > + > > +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | > > + VIR_DOMAIN_AFFECT_CONFIG, -1); > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +goto cleanup; > > + > > +if (!(def = virDomainObjGetOneDef(vm, flags))) > > +goto cleanup; > > + > > +if (def->niothreadids == 0) > > +return 0; > > ^This will leave the object locked, so once you do Info, anything else after > that will deadlock, so goto is needed. > > Erik Of course... I don't know how I missed that. I guess I don't need to re-send it though only for this change? Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 2/4] test_driver: implement virDomainDelIOThread
On Thu, Jul 25, 2019 at 5:47 PM Erik Skultety wrote: > > On Tue, Jul 23, 2019 at 12:17:55PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > > src/test/test_driver.c | 72 ++ > > 1 file changed, 72 insertions(+) > > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c > > index 313cf5e7ef..29262e4d34 100644 > > --- a/src/test/test_driver.c > > +++ b/src/test/test_driver.c > > @@ -2653,6 +2653,77 @@ testDomainAddIOThread(virDomainPtr dom, > > } > > > > > > +static int > > +testDomainDelIOThread(virDomainPtr dom, > > + unsigned int iothread_id, > > + unsigned int flags) > > +{ > > +virDomainObjPtr vm = NULL; > > +virDomainDefPtr def = NULL; > > +size_t i, j; > > +int ret = -1; > > + > > +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | > > + VIR_DOMAIN_AFFECT_CONFIG, -1); > > + > > +if (iothread_id == 0) { > > +virReportError(VIR_ERR_INVALID_ARG, "%s", > > + _("invalid value of 0 for iothread_id")); > > +return -1; > > +} > > + > > +if (!(vm = testDomObjFromDomain(dom))) > > +goto cleanup; > > + > > +if (!(def = virDomainObjGetOneDef(vm, flags))) > > +goto cleanup; > > + > > +if (!virDomainIOThreadIDFind(def, iothread_id)) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("cannot find IOThread '%u' in iothreadids list"), > > + iothread_id); > > +goto cleanup; > > +} > > + > > +for (i = 0; i < def->ndisks; i++) { > > +if (def->disks[i]->iothread == iothread_id) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("cannot remove IOThread %u since it " > > + "is being used by disk '%s'"), > > + iothread_id, def->disks[i]->dst); > > +goto cleanup; > > +} > > +} > > + > > +for (i = 0; i < def->ncontrollers; i++) { > > +if (def->controllers[i]->iothread == iothread_id) { > > +virReportError(VIR_ERR_INVALID_ARG, > > + _("cannot remove IOThread '%u' since it " > > + "is being used by controller"), > > + iothread_id); > > +goto cleanup; > > +} > > +} > > + > > +for (i = 0; i < def->niothreadids; i++) { > > +if (def->iothreadids[i]->iothread_id == iothread_id) { > > +for (j = i + 1; j < def->niothreadids; j++) > > +def->iothreadids[j]->autofill = false; > > So, I read both the commit and the commentary in the QEMU driver which added > ^this autofill clearing hunk. I haven't tried with QEMU, but just from reading > those, I'm still not clear why it's actually needed. Even more so in test > driver, I tried to remove the nested loop and everything seemed to be working, > I had half of the thread defined, half of them autofilled, removed from the > beginning, middle of the list, basically from anywhere and the data that > libvirt reported were intact, both in the XML and the dedicated API. Right > now, > it's magic to me. > > Erik Tbh, I also didn't understand it when I read it but I thought since it's there let's just copy it to make sure. Maybe somebody that touched that code could explain? If you checked that there are no side-effects when removing it then sure let's remove it. From the test driver at least. Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/2] test_driver: implement virDomainSetNumaParameters
Change since v1: * virDomainObjGetOneDefState is used instead of virDomainObjGetOneDef I send these 2 patches together, since testConnectSupportsFeature needs to be implemented in order for testDomainSetNumaParameters to support string parameters. Ilias Stamatis (2): test_driver: implement virConnectSupportsFeature test_driver: implement virDomainSetNumaParameters src/test/test_driver.c | 111 + 1 file changed, 111 insertions(+) mode change 100644 => 100755 src/test/test_driver.c -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/2] test_driver: implement virConnectSupportsFeature
Make the test driver only support the VIR_TYPED_PARAM_STRING flag for now. Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 29 + 1 file changed, 29 insertions(+) mode change 100644 => 100755 src/test/test_driver.c diff --git a/src/test/test_driver.c b/src/test/test_driver.c old mode 100644 new mode 100755 index 7cf92e78a7..6221f5b9ae --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1557,6 +1557,34 @@ testConnectGetType(virConnectPtr conn ATTRIBUTE_UNUSED) return "TEST"; } + +static int +testConnectSupportsFeature(virConnectPtr conn ATTRIBUTE_UNUSED, + int feature) +{ +switch ((virDrvFeature) feature) { +case VIR_DRV_FEATURE_TYPED_PARAM_STRING: +return 1; +case VIR_DRV_FEATURE_MIGRATION_V2: +case VIR_DRV_FEATURE_MIGRATION_V3: +case VIR_DRV_FEATURE_MIGRATION_P2P: +case VIR_DRV_FEATURE_MIGRATE_CHANGE_PROTECTION: +case VIR_DRV_FEATURE_FD_PASSING: +case VIR_DRV_FEATURE_XML_MIGRATABLE: +case VIR_DRV_FEATURE_MIGRATION_OFFLINE: +case VIR_DRV_FEATURE_MIGRATION_PARAMS: +case VIR_DRV_FEATURE_MIGRATION_DIRECT: +case VIR_DRV_FEATURE_MIGRATION_V1: +case VIR_DRV_FEATURE_PROGRAM_KEEPALIVE: +case VIR_DRV_FEATURE_REMOTE: +case VIR_DRV_FEATURE_REMOTE_CLOSE_CALLBACK: +case VIR_DRV_FEATURE_REMOTE_EVENT_CALLBACK: +default: +return 0; +} +} + + static int testConnectNumOfDomains(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; @@ -7767,6 +7795,7 @@ static virHypervisorDriver testHypervisorDriver = { .connectGetCapabilities = testConnectGetCapabilities, /* 0.2.1 */ .connectGetSysinfo = testConnectGetSysinfo, /* 2.3.0 */ .connectGetType = testConnectGetType, /* 2.3.0 */ +.connectSupportsFeature = testConnectSupportsFeature, /* 5.6.0 */ .connectListDomains = testConnectListDomains, /* 0.1.1 */ .connectNumOfDomains = testConnectNumOfDomains, /* 0.1.1 */ .connectListAllDomains = testConnectListAllDomains, /* 0.9.13 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 2/2] test_driver: implement virDomainSetNumaParameters
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 82 ++ 1 file changed, 82 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6221f5b9ae..127403bc0c 100755 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3091,6 +3091,87 @@ testDomainGetMemoryParameters(virDomainPtr dom, } +static int +testDomainSetNumaParameters(virDomainPtr dom, +virTypedParameterPtr params, +int nparams, +unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virBitmapPtr nodeset = NULL; +virDomainNumatuneMemMode config_mode; +bool live; +size_t i; +int mode = -1; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_NUMA_MODE, + VIR_TYPED_PARAM_INT, + VIR_DOMAIN_NUMA_NODESET, + VIR_TYPED_PARAM_STRING, + NULL) < 0) +return -1; + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDefState(vm, flags, ))) +goto cleanup; + +for (i = 0; i < nparams; i++) { +virTypedParameterPtr param = [i]; + +if (STREQ(param->field, VIR_DOMAIN_NUMA_MODE)) { +mode = param->value.i; + +if (mode < 0 || mode >= VIR_DOMAIN_NUMATUNE_MEM_LAST) { +virReportError(VIR_ERR_INVALID_ARG, + _("unsupported numatune mode: '%d'"), mode); +goto cleanup; +} + +} else if (STREQ(param->field, VIR_DOMAIN_NUMA_NODESET)) { +if (virBitmapParse(param->value.s, , + VIR_DOMAIN_CPUMASK_LEN) < 0) +goto cleanup; + +if (virBitmapIsAllClear(nodeset)) { +virReportError(VIR_ERR_OPERATION_INVALID, + _("Invalid nodeset of 'numatune': %s"), + param->value.s); +goto cleanup; +} +} +} + +if (live && +mode != -1 && +virDomainNumatuneGetMode(def->numa, -1, _mode) == 0 && +config_mode != mode) { +virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("can't change numatune mode for running domain")); +goto cleanup; +} + +if (virDomainNumatuneSet(def->numa, + def->placement_mode == + VIR_DOMAIN_CPU_PLACEMENT_MODE_STATIC, + -1, mode, nodeset) < 0) +goto cleanup; + +ret = 0; + cleanup: +virBitmapFree(nodeset); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetNumaParameters(virDomainPtr dom, virTypedParameterPtr params, @@ -7841,6 +7922,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainGetXMLDesc = testDomainGetXMLDesc, /* 0.1.4 */ .domainSetMemoryParameters = testDomainSetMemoryParameters, /* 5.6.0 */ .domainGetMemoryParameters = testDomainGetMemoryParameters, /* 5.6.0 */ +.domainSetNumaParameters = testDomainSetNumaParameters, /* 5.6.0 */ .domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */ .domainGetInterfaceParameters = testDomainGetInterfaceParameters, /* 5.6.0 */ .connectListDefinedDomains = testConnectListDefinedDomains, /* 0.1.11 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2] implement virDomainSetInterfaceParameters
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 106 + 1 file changed, 106 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 7cf92e78a7..fce38acc17 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -3108,6 +3108,111 @@ testDomainGetNumaParameters(virDomainPtr dom, } +static int +testDomainSetInterfaceParameters(virDomainPtr dom, + const char *device, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def; +virDomainNetDefPtr net = NULL; +virNetDevBandwidthPtr bandwidth = NULL; +bool inboundSpecified = false; +bool outboundSpecified = false; +size_t i; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (virTypedParamsValidate(params, nparams, + VIR_DOMAIN_BANDWIDTH_IN_AVERAGE, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_IN_PEAK, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_IN_BURST, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_IN_FLOOR, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_OUT_AVERAGE, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_OUT_PEAK, + VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BANDWIDTH_OUT_BURST, + VIR_TYPED_PARAM_UINT, + NULL) < 0) +return -1; + +if (!(vm = testDomObjFromDomain(dom))) +return -1; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(net = virDomainNetFind(def, device))) +goto cleanup; + +if ((VIR_ALLOC(bandwidth) < 0) || +(VIR_ALLOC(bandwidth->in) < 0) || +(VIR_ALLOC(bandwidth->out) < 0)) +goto cleanup; + +for (i = 0; i < nparams; i++) { +virTypedParameterPtr param = [i]; + +if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_IN_AVERAGE)) { +bandwidth->in->average = param->value.ui; +inboundSpecified = true; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_IN_PEAK)) { +bandwidth->in->peak = param->value.ui; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_IN_BURST)) { +bandwidth->in->burst = param->value.ui; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_IN_FLOOR)) { +bandwidth->in->floor = param->value.ui; +inboundSpecified = true; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_OUT_AVERAGE)) { +bandwidth->out->average = param->value.ui; +outboundSpecified = true; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_OUT_PEAK)) { +bandwidth->out->peak = param->value.ui; +} else if (STREQ(param->field, VIR_DOMAIN_BANDWIDTH_OUT_BURST)) { +bandwidth->out->burst = param->value.ui; +} +} + +/* average or floor are mandatory, peak and burst are optional */ +if (!bandwidth->in->average && !bandwidth->in->floor) +VIR_FREE(bandwidth->in); +if (!bandwidth->out->average) +VIR_FREE(bandwidth->out); + +if (!net->bandwidth) { +VIR_STEAL_PTR(net->bandwidth, bandwidth); +} else { +if (bandwidth->in) { +VIR_FREE(net->bandwidth->in); +VIR_STEAL_PTR(net->bandwidth->in, bandwidth->in); +} else if (inboundSpecified) { +VIR_FREE(net->bandwidth->in); +} +if (bandwidth->out) { +VIR_FREE(net->bandwidth->out); +VIR_STEAL_PTR(net->bandwidth->out, bandwidth->out); +} else if (outboundSpecified) { +VIR_FREE(net->bandwidth->out); +} +} + +ret = 0; + cleanup: +virNetDevBandwidthFree(bandwidth); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetInterfaceParameters(virDomainPtr dom, const char *device, @@ -7813,6 +7918,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSetMemoryParameters = testDomainSetMemoryParameters, /* 5.6.0 */ .domainGetMemoryParameters = testDomainGetMemoryParameters, /* 5.6.0 */ .domainGetNumaParameters = testDomainGetNumaParameters, /* 5.6.0 */ +.domainSetInterfaceParameters = testDomainSetI
Re: [libvirt] [PATCH] implement virDomainSetInterfaceParameters
On Wed, Jul 24, 2019 at 1:04 PM Erik Skultety wrote: > > On Sat, Jul 06, 2019 at 01:24:22PM +0200, Ilias Stamatis wrote: > > Signed-off-by: Ilias Stamatis > > --- > ... > > > + > > +/* average or floor are mandatory, peak and burst are optional */ > > +if (!bandwidth->in->average && !bandwidth->in->floor) > > +VIR_FREE(bandwidth->in); > > +if (!bandwidth->out->average) > > +VIR_FREE(bandwidth->out); > > + > > +if (!net->bandwidth) { > > +VIR_STEAL_PTR(net->bandwidth, bandwidth); > > +} else { > > +if (bandwidth->in) { > > +VIR_FREE(net->bandwidth->in); > > +VIR_STEAL_PTR(net->bandwidth->in, bandwidth->in); > > +} > > +if (bandwidth->out) { > > +VIR_FREE(net->bandwidth->out); > > +VIR_STEAL_PTR(net->bandwidth->out, bandwidth->out); > > +} > > +} > > Doesn't look quite right, you just lost any way of resetting the bandwidth > when > in fact this should be possible simply with setting .average=0, that's why the > original QEMU code uses booleans, because then at the end, the whole > net->bandwidth structure is set to NULL if reset was requested. > > Erik Aaah, right. This is one of the cases where many implicit comparisons can be confusing. When I was reading that code I was wondering how these booleans are useful at all. Now I get it, I'll send a v2. Thanks, Ilias -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/2] test_driver: implement virDomainPinEmulator
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 44 ++ 1 file changed, 44 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 235d70f793..5411a97a5b 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2501,6 +2501,49 @@ static int testDomainSetMemory(virDomainPtr domain, } +static int +testDomainPinEmulator(virDomainPtr dom, + unsigned char *cpumap, + int maplen, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virBitmapPtr pcpumap = NULL; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(pcpumap = virBitmapNewData(cpumap, maplen))) +goto cleanup; + +if (virBitmapIsAllClear(pcpumap)) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Empty cpu list for pinning")); +goto cleanup; +} + +virBitmapFree(def->cputune.emulatorpin); +def->cputune.emulatorpin = NULL; + +if (!(def->cputune.emulatorpin = virBitmapNewCopy(pcpumap))) +goto cleanup; + +ret = 0; + cleanup: +virBitmapFree(pcpumap); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainGetEmulatorPinInfo(virDomainPtr dom, unsigned char *cpumaps, @@ -7790,6 +7833,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ +.domainPinEmulator = testDomainPinEmulator, /* 5.6.0 */ .domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/2] test_driver: implement emulator pinning APIs
Ilias Stamatis (2): test_driver: implement virDomainGetEmulatorPinInfo test_driver: implement virDomainPinEmulator src/test/test_driver.c | 92 ++ 1 file changed, 92 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/2] test_driver: implement virDomainGetEmulatorPinInfo
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 48 ++ 1 file changed, 48 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2e33a9dd55..235d70f793 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2500,6 +2500,53 @@ static int testDomainSetMemory(virDomainPtr domain, return testDomainSetMemoryFlags(domain, memory, 0); } + +static int +testDomainGetEmulatorPinInfo(virDomainPtr dom, + unsigned char *cpumaps, + int maplen, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virBitmapPtr cpumask = NULL; +virBitmapPtr bitmap = NULL; +int hostcpus; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if ((hostcpus = virHostCPUGetCount()) < 0) +goto cleanup; + +if (def->cputune.emulatorpin) { +cpumask = def->cputune.emulatorpin; +} else if (def->cpumask) { +cpumask = def->cpumask; +} else { +if (!(bitmap = virBitmapNew(hostcpus))) +goto cleanup; +virBitmapSetAll(bitmap); +cpumask = bitmap; +} + +virBitmapToDataBuf(cpumask, cpumaps, maplen); + +ret = 1; + cleanup: +virDomainObjEndAPI(); +virBitmapFree(bitmap); +return ret; +} + + static int testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags) { @@ -7743,6 +7790,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ +.domainGetEmulatorPinInfo = testDomainGetEmulatorPinInfo, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ .domainGetVcpusFlags = testDomainGetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 3/4] test_driver: implement virDomainPinIOThread
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 51 ++ 1 file changed, 51 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 29262e4d34..47e28a01ec 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2724,6 +2724,56 @@ testDomainDelIOThread(virDomainPtr dom, } +static int +testDomainPinIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned char *cpumap, + int maplen, + unsigned int flags) +{ +int ret = -1; +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainIOThreadIDDefPtr iothrid = NULL; +virBitmapPtr cpumask = NULL; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!(cpumask = virBitmapNewData(cpumap, maplen))) +goto cleanup; + +if (virBitmapIsAllClear(cpumask)) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Empty iothread cpumap list for pinning")); +goto cleanup; +} + +if (!(iothrid = virDomainIOThreadIDFind(def, iothread_id))) { +virReportError(VIR_ERR_INVALID_ARG, + _("iothreadid %d not found"), iothread_id); +goto cleanup; +} + +virBitmapFree(iothrid->cpumask); +iothrid->cpumask = cpumask; +iothrid->autofill = false; + +ret = 0; + cleanup: +if (ret < 0) +virBitmapFree(cpumask); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -7865,6 +7915,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainAddIOThread = testDomainAddIOThread, /* 5.6.0 */ .domainDelIOThread = testDomainDelIOThread, /* 5.6.0 */ +.domainPinIOThread = testDomainPinIOThread, /* 5.6.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 4/4] test_driver: implement virDomainGetIOThreadInfo
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 74 ++ 1 file changed, 74 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 47e28a01ec..4c6f3db8de 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2774,6 +2774,79 @@ testDomainPinIOThread(virDomainPtr dom, } +static int +testDomainGetIOThreadInfo(virDomainPtr dom, + virDomainIOThreadInfoPtr **info, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virBitmapPtr cpumask = NULL; +virBitmapPtr bitmap = NULL; +virDomainIOThreadInfoPtr *info_ret = NULL; +size_t i; +int hostcpus; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (def->niothreadids == 0) +return 0; + +if ((hostcpus = virHostCPUGetCount()) < 0) +goto cleanup; + +if (VIR_ALLOC_N(info_ret, def->niothreadids) < 0) +goto cleanup; + +for (i = 0; i < def->niothreadids; i++) { +if (VIR_ALLOC(info_ret[i]) < 0) +goto cleanup; + +info_ret[i]->iothread_id = def->iothreadids[i]->iothread_id; + +cpumask = def->iothreadids[i]->cpumask; +if (!cpumask) { +if (def->cpumask) { +cpumask = def->cpumask; +} else { +if (!(bitmap = virBitmapNew(hostcpus))) +goto cleanup; +virBitmapSetAll(bitmap); +cpumask = bitmap; +} +} + +if (virBitmapToData(cpumask, _ret[i]->cpumap, +_ret[i]->cpumaplen) < 0) +goto cleanup; + +virBitmapFree(bitmap); +bitmap = NULL; +} + +VIR_STEAL_PTR(*info, info_ret); +ret = def->niothreadids; + + cleanup: +if (info_ret) { +for (i = 0; i < def->niothreadids; i++) +virDomainIOThreadInfoFree(info_ret[i]); +VIR_FREE(info_ret); +} +virBitmapFree(bitmap); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -7916,6 +7989,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainAddIOThread = testDomainAddIOThread, /* 5.6.0 */ .domainDelIOThread = testDomainDelIOThread, /* 5.6.0 */ .domainPinIOThread = testDomainPinIOThread, /* 5.6.0 */ +.domainGetIOThreadInfo = testDomainGetIOThreadInfo, /* 5.6.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/4] test_driver: implement virDomainDelIOThread
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 72 ++ 1 file changed, 72 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 313cf5e7ef..29262e4d34 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2653,6 +2653,77 @@ testDomainAddIOThread(virDomainPtr dom, } +static int +testDomainDelIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +size_t i, j; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (iothread_id == 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("invalid value of 0 for iothread_id")); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (!virDomainIOThreadIDFind(def, iothread_id)) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot find IOThread '%u' in iothreadids list"), + iothread_id); +goto cleanup; +} + +for (i = 0; i < def->ndisks; i++) { +if (def->disks[i]->iothread == iothread_id) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot remove IOThread %u since it " + "is being used by disk '%s'"), + iothread_id, def->disks[i]->dst); +goto cleanup; +} +} + +for (i = 0; i < def->ncontrollers; i++) { +if (def->controllers[i]->iothread == iothread_id) { +virReportError(VIR_ERR_INVALID_ARG, + _("cannot remove IOThread '%u' since it " + "is being used by controller"), + iothread_id); +goto cleanup; +} +} + +for (i = 0; i < def->niothreadids; i++) { +if (def->iothreadids[i]->iothread_id == iothread_id) { +for (j = i + 1; j < def->niothreadids; j++) +def->iothreadids[j]->autofill = false; + +virDomainIOThreadIDDefFree(def->iothreadids[i]); +VIR_DELETE_ELEMENT(def->iothreadids, i, def->niothreadids); + +break; +} +} + +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -7793,6 +7864,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ .domainAddIOThread = testDomainAddIOThread, /* 5.6.0 */ +.domainDelIOThread = testDomainDelIOThread, /* 5.6.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 0/4] test_driver: implement IOThread related APIs
Ilias Stamatis (4): test_driver: implement virDomainAddIOThread test_driver: implement virDomainDelIOThread test_driver: implement virDomainPinIOThread test_driver: implement virDomainGetIOThreadInfo src/test/test_driver.c | 248 + 1 file changed, 248 insertions(+) -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 1/4] test_driver: implement virDomainAddIOThread
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 51 ++ 1 file changed, 51 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2e33a9dd55..313cf5e7ef 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2603,6 +2603,56 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, } +static int +testDomainAddIOThread(virDomainPtr dom, + unsigned int iothread_id, + unsigned int flags) +{ +virDomainObjPtr vm = NULL; +virDomainDefPtr def = NULL; +virDomainIOThreadIDDefPtr iothrid = NULL; +int ret = -1; + +virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + +if (iothread_id == 0) { +virReportError(VIR_ERR_INVALID_ARG, "%s", + _("invalid value of 0 for iothread_id")); +return -1; +} + +if (!(vm = testDomObjFromDomain(dom))) +goto cleanup; + +if (!(def = virDomainObjGetOneDef(vm, flags))) +goto cleanup; + +if (virDomainIOThreadIDFind(def, iothread_id)) { +virReportError(VIR_ERR_INVALID_ARG, + _("an IOThread is already using iothread_id '%u'"), + iothread_id); +goto cleanup; +} + +if (VIR_ALLOC(iothrid) < 0) +goto cleanup; + +iothrid->iothread_id = iothread_id; + +if (VIR_APPEND_ELEMENT_COPY(def->iothreadids, def->niothreadids, iothrid) < 0) +goto cleanup; + +ret = 0; + + cleanup: +if (ret < 0) +virDomainIOThreadIDDefFree(iothrid); +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSetUserPassword(virDomainPtr dom, const char *user ATTRIBUTE_UNUSED, @@ -7742,6 +7792,7 @@ static virHypervisorDriver testHypervisorDriver = { .domainSaveImageGetXMLDesc = testDomainSaveImageGetXMLDesc, /* 5.5.0 */ .domainCoreDump = testDomainCoreDump, /* 0.3.2 */ .domainCoreDumpWithFormat = testDomainCoreDumpWithFormat, /* 1.2.3 */ +.domainAddIOThread = testDomainAddIOThread, /* 5.6.0 */ .domainSetUserPassword = testDomainSetUserPassword, /* 5.6.0 */ .domainSetVcpus = testDomainSetVcpus, /* 0.1.4 */ .domainSetVcpusFlags = testDomainSetVcpusFlags, /* 0.8.5 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] test_driver: implement virDomainInjectNMI
Signed-off-by: Ilias Stamatis --- src/test/test_driver.c | 24 1 file changed, 24 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 2e33a9dd55..90e1ede7c4 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6716,6 +6716,29 @@ testDomainScreenshot(virDomainPtr dom ATTRIBUTE_UNUSED, } +static int +testDomainInjectNMI(virDomainPtr domain, +unsigned int flags) +{ +virDomainObjPtr vm = NULL; +int ret = -1; + +virCheckFlags(0, -1); + +if (!(vm = testDomObjFromDomain(domain))) +return -1; + +if (virDomainObjCheckActive(vm) < 0) +goto cleanup; + +/* do nothing */ +ret = 0; + cleanup: +virDomainObjEndAPI(); +return ret; +} + + static int testDomainSendKey(virDomainPtr domain, unsigned int codeset, @@ -7792,6 +7815,7 @@ static virHypervisorDriver testHypervisorDriver = { .nodeGetCPUMap = testNodeGetCPUMap, /* 1.0.0 */ .domainRename = testDomainRename, /* 4.1.0 */ .domainScreenshot = testDomainScreenshot, /* 1.0.5 */ +.domainInjectNMI = testDomainInjectNMI, /* 5.6.0 */ .domainSendKey = testDomainSendKey, /* 5.5.0 */ .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */ .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */ -- 2.22.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list