Re: [libvirt] [PATCH 1/6] test_driver: implement virDomainAttachDeviceFlags

2019-09-17 Thread Ilias Stamatis
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

2019-09-06 Thread Ilias Stamatis
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

2019-08-17 Thread Ilias Stamatis
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

2019-08-16 Thread Ilias Stamatis
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

2019-08-15 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-14 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-13 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-12 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-09 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-08 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-07 Thread Ilias Stamatis
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

2019-08-06 Thread Ilias Stamatis
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

2019-08-06 Thread Ilias Stamatis
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

2019-08-05 Thread Ilias Stamatis
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

2019-08-05 Thread Ilias Stamatis
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

2019-08-05 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-04 Thread Ilias Stamatis
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

2019-08-02 Thread Ilias Stamatis
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

2019-08-02 Thread Ilias Stamatis
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

2019-08-02 Thread Ilias Stamatis
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

2019-08-02 Thread Ilias Stamatis
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

2019-08-02 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-08-01 Thread Ilias Stamatis
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

2019-07-29 Thread Ilias Stamatis
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

2019-07-28 Thread Ilias Stamatis
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

2019-07-28 Thread Ilias Stamatis
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

2019-07-28 Thread Ilias Stamatis
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

2019-07-27 Thread Ilias Stamatis
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

2019-07-27 Thread Ilias Stamatis
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

2019-07-27 Thread Ilias Stamatis
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

2019-07-26 Thread Ilias Stamatis
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

2019-07-26 Thread Ilias Stamatis
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

2019-07-26 Thread Ilias Stamatis
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

2019-07-26 Thread Ilias Stamatis
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

2019-07-24 Thread Ilias Stamatis
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

2019-07-24 Thread Ilias Stamatis
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

2019-07-24 Thread Ilias Stamatis
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

2019-07-24 Thread Ilias Stamatis
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

2019-07-24 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-23 Thread Ilias Stamatis
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

2019-07-18 Thread Ilias Stamatis
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


  1   2   3   >