[libvirt] [PATCH v3 2/8] test: Wire up managed save APIs
Cole Robinson
crobinso at redhat.com
Tue Oct 1 15:38:09 UTC 2013
On 09/26/2013 10:44 AM, Michal Privoznik wrote:
> On 25.09.2013 21:15, Cole Robinson wrote:
>> Also add a <test:hasmanagedsave> element to set this data when starting
>> the connection.
>> ---
>> v3:
>> Mandate managedsave have runstate=shutoff
>>
>> src/test/test_driver.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++-
>> tests/virshtest.c | 2 +-
>> 2 files changed, 134 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
>> index c51c7ca..7e60716 100644
>> --- a/src/test/test_driver.c
>> +++ b/src/test/test_driver.c
>> @@ -160,6 +160,7 @@ typedef testDomainNamespaceDef *testDomainNamespaceDefPtr;
>> struct _testDomainNamespaceDef {
>> int runstate;
>> bool transient;
>> + bool hasManagedSave;
>> };
>>
>> static void
>> @@ -197,6 +198,13 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED,
>> }
>> nsdata->transient = tmp;
>>
>> + tmp = virXPathBoolean("boolean(./test:hasmanagedsave)", ctxt);
>> + if (tmp == -1) {
>> + virReportError(VIR_ERR_XML_ERROR, "%s", _("invalid hasmanagedsave"));
>> + goto error;
>> + }
>> + nsdata->hasManagedSave = tmp;
>> +
>> tmp = virXPathUInt("string(./test:runstate)", ctxt, &tmpuint);
>> if (tmp == 0) {
>> if (tmpuint >= VIR_DOMAIN_LAST) {
>> @@ -218,6 +226,11 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED,
>> _("transient domain cannot have runstate 'shutoff'"));
>> goto error;
>> }
>> + if (nsdata->hasManagedSave && nsdata->runstate != VIR_DOMAIN_SHUTOFF) {
>> + virReportError(VIR_ERR_XML_ERROR,
>
> s/$/ "%s",/
>
>> + _("domain with managedsave data can only have runstate 'shutoff'"));
>> + goto error;
>> + }
>
>
>> @@ -2836,6 +2851,15 @@ static int testDomainUndefineFlags(virDomainPtr domain,
>> goto cleanup;
>> }
>>
>> + if (privdom->hasManagedSave &&
>> + !(flags & VIR_DOMAIN_UNDEFINE_MANAGED_SAVE)) {
>> + virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> + _("Refusing to undefine while domain managed "
>> + "save image exists"));
>> + goto cleanup;
>> + }
>> + privdom->hasManagedSave = false;
>
> While this assignment is safe for now (there's not goto cleanup afterwards) I'd rather see it more closer to the ret = 0; line. What if in the future we insert something in between?
>
>> +
>> event = virDomainEventNewFromObj(privdom,
>> VIR_DOMAIN_EVENT_UNDEFINED,
>> VIR_DOMAIN_EVENT_UNDEFINED_REMOVED);
>> @@ -5969,6 +5993,111 @@ testConnectGetCPUModelNames(virConnectPtr conn ATTRIBUTE_UNUSED,
>> return cpuGetModels(arch, models);
>> }
>>
>> +static int
>> +testDomainManagedSave(virDomainPtr dom, unsigned int flags)
>> +{
>> + testConnPtr privconn = dom->conn->privateData;
>> + virDomainObjPtr vm = NULL;
>> + virDomainEventPtr event = NULL;
>> + int ret = -1;
>> +
>> + virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE |
>> + VIR_DOMAIN_SAVE_RUNNING |
>> + VIR_DOMAIN_SAVE_PAUSED, -1);
>> +
>> + testDriverLock(privconn);
>> + vm = virDomainObjListFindByName(privconn->domains, dom->name);
>> + testDriverUnlock(privconn);
>> +
>> + if (vm == NULL) {
>> + virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
>> + goto cleanup;
>> + }
>> +
>> + if (!virDomainObjIsActive(vm)) {
>> + virReportError(VIR_ERR_OPERATION_INVALID,
>> + "%s", _("domain is not running"));
>> + goto cleanup;
>> + }
>> +
>> + if (!vm->persistent) {
>> + virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> + _("cannot do managed save for transient domain"));
>> + goto cleanup;
>> + }
>> +
>> + testDomainShutdownState(dom, vm, VIR_DOMAIN_SHUTOFF_SAVED);
>> + event = virDomainEventNewFromObj(vm,
>> + VIR_DOMAIN_EVENT_STOPPED,
>> + VIR_DOMAIN_EVENT_STOPPED_SAVED);
>> + vm->hasManagedSave = true;
>> +
>> + ret = 0;
>
> This ^^^ is what I have in my mind.
>
>> +cleanup:
>> + if (vm)
>> + virObjectUnlock(vm);
>> + if (event) {
>> + testDriverLock(privconn);
>> + testDomainEventQueue(privconn, event);
>> + testDriverUnlock(privconn);
>> + }
>> +
>> + return ret;
>> +}
>> +
>> +
>
>
>> +static int
>> +testDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
>> +{
>> + testConnPtr privconn = dom->conn->privateData;
>> + virDomainObjPtr vm;
>> + int ret = -1;
>> +
>> + virCheckFlags(0, -1);
>> +
>> + testDriverLock(privconn);
>> +
>> + vm = virDomainObjListFindByName(privconn->domains, dom->name);
>> + if (vm == NULL) {
>> + virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
>> + goto cleanup;
>> + }
>> +
>> + ret = vm->hasManagedSave;
>> +cleanup:
>> + if (vm)
>> + virObjectUnlock(vm);
>> + testDriverUnlock(privconn);
>> + return ret;
>> +}
>> +
>> +static int
>> +testDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
>> +{
>> + testConnPtr privconn = dom->conn->privateData;
>> + virDomainObjPtr vm;
>> + int ret = -1;
>> +
>> + virCheckFlags(0, -1);
>> +
>> + testDriverLock(privconn);
>> +
>> + vm = virDomainObjListFindByName(privconn->domains, dom->name);
>> + if (vm == NULL) {
>> + virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__);
>> + goto cleanup;
>> + }
>> +
>> + vm->hasManagedSave = false;
>> + ret = 0;
>> +cleanup:
>> + if (vm)
>> + virObjectUnlock(vm);
>> + testDriverUnlock(privconn);
>> + return ret;
>> +}
>
> The driver can be unlocked right after virDomainObjListFindByName(). But who cares about throughput in test driver, right?
>
> ACK if you squash this in:
>
>
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 77c3d23..f40a841 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -227,7 +227,7 @@ testDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED,
> goto error;
> }
> if (nsdata->hasManagedSave && nsdata->runstate != VIR_DOMAIN_SHUTOFF) {
> - virReportError(VIR_ERR_XML_ERROR,
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> _("domain with managedsave data can only have runstate 'shutoff'"));
> goto error;
> }
>
> Michal
>
Thanks, pushed with that bit squashed in, and the above mentioned assignment
moved after the UNDEFINE event.
- Cole
More information about the libvir-list
mailing list