[libvirt] [PATCH v8 6/8] parallels: implement virDomainDefineXML operation for existing domains

Dmitry Guryanov dguryanov at parallels.com
Tue Jul 17 11:13:43 UTC 2012


On 07/13/2012 04:04 PM, Peter Krempa wrote:

Hello, Peter,

Should I fix first 6 patches and resend them or wait until you finish 
reviewing
last 2 ones ?

> On 07/04/12 19:42, Dmitry Guryanov wrote:
>> Add parallelsDomainDefineXML function, it works only for existing
>> domains for the present.
>>
>> It's too hard to convert libvirt's XML domain configuration into
>> PARALLELS's one, so I've decided to compare virDomainDef structures:
>> current domain definition and the one created from XML, given to
>> the function. And change only different parameters.
>>
>> Only description change implemetented, changing other parameters
>> will be implemented later.
>>
>> Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
>> ---
>>   src/parallels/parallels_driver.c |   89 
>> ++++++++++++++++++++++++++++++++++++++
>>   1 files changed, 89 insertions(+), 0 deletions(-)
>>
>> diff --git a/src/parallels/parallels_driver.c 
>> b/src/parallels/parallels_driver.c
>> index b3d863f..54bdc9a 100644
>> --- a/src/parallels/parallels_driver.c
>> +++ b/src/parallels/parallels_driver.c
>> @@ -1089,6 +1089,94 @@ parallelsShutdownDomain(virDomainPtr domain)
>> VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
>>   }
>>
>> +static int
>> +parallelsSetDescription(virDomainObjPtr dom, const char *description)
>> +{
>> +    parallelsDomObjPtr parallelsdom;
>> +
>> +    parallelsdom = dom->privateData;
>> +    if (parallelsCmdRun(PRLCTL, "set", parallelsdom->uuid,
>> +                  "--description", description, NULL))
>> +        return -1;
>> +
>> +    return 0;
>> +}
>> +
>> +static int
>> +parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr newdef)
>> +{
>> +    virDomainDefPtr olddef = dom->def;
>> +
>> +    if (newdef->description && !STREQ(olddef->description, 
>> newdef->description)) {
>> +        if (parallelsSetDescription(dom, newdef->description))
>> +            return -1;
>> +    }
>> +
>> +    /* TODO: compare all other parameters */
>
> You should reject the change if something else is changed. Now the 
> change gets silently ignored but it's changed in libvirts data structs.
>
>> +
>> +    return 0;
>> +}
>> +
>> +static virDomainPtr
>> +parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
>> +{
>> +    parallelsConnPtr privconn = conn->privateData;
>> +    virDomainPtr ret = NULL;
>> +    virDomainDefPtr def;
>> +    virDomainObjPtr dom = NULL, olddom = NULL;
>> +    virDomainEventPtr event = NULL;
>> +    int dupVM;
>> +
>> +    parallelsDriverLock(privconn);
>> +    if ((def = virDomainDefParseString(privconn->caps, xml,
>> +                                       1 << VIR_DOMAIN_VIRT_PARALLELS,
>> + VIR_DOMAIN_XML_INACTIVE)) == NULL) {
>> +        parallelsError(VIR_ERR_INVALID_ARG, _("Can't parse XML desc"));
>> +        goto cleanup;
>> +    }
>> +
>> +    if ((dupVM = virDomainObjIsDuplicate(&privconn->domains, def, 
>> 0)) < 0) {
>> +        parallelsError(VIR_ERR_INVALID_ARG, _("Already exists"));
>> +        goto cleanup;
>> +    }
>> +
>> +    if (dupVM == 1) {
>> +        olddom = virDomainFindByUUID(&privconn->domains, def->uuid);
>> +        parallelsApplyChanges(olddom, def);
>> +        virDomainObjUnlock(olddom);
>> +
>> +        if (!(dom = virDomainAssignDef(privconn->caps,
>> + &privconn->domains, def, false))) {
>> +            parallelsError(VIR_ERR_INTERNAL_ERROR, _("Can't allocate 
>> domobj"));
>> +            goto cleanup;
>> +        }
>> +
>> +        def = NULL;
>> +    } else {
>> +        parallelsError(VIR_ERR_NO_SUPPORT, _("Not implemented yet"));
>> +            goto cleanup;
>> +    }
>> +
>> +    event = virDomainEventNewFromObj(dom,
>> +                                     VIR_DOMAIN_EVENT_DEFINED,
>> +                                     !dupVM ?
>> + VIR_DOMAIN_EVENT_DEFINED_ADDED :
>> + VIR_DOMAIN_EVENT_DEFINED_UPDATED);
>> +
>> +    ret = virGetDomain(conn, dom->def->name, dom->def->uuid);
>> +    if (ret)
>> +        ret->id = dom->def->id;
>> +
>> +  cleanup:
>> +    virDomainDefFree(def);
>> +    if (dom)
>> +        virDomainObjUnlock(dom);
>> +    if (event)
>> +        parallelsDomainEventQueue(privconn, event);
>> +    parallelsDriverUnlock(privconn);
>> +    return ret;
>> +}
>> +
>>   static virDriver parallelsDriver = {
>>       .no = VIR_DRV_PARALLELS,
>>       .name = "PARALLELS",
>> @@ -1116,6 +1204,7 @@ static virDriver parallelsDriver = {
>>       .domainDestroy = parallelsDestroyDomain,  /* 0.10.0 */
>>       .domainShutdown = parallelsShutdownDomain, /* 0.10.0 */
>>       .domainCreate = parallelsDomainCreate,    /* 0.10.0 */
>> +    .domainDefineXML = parallelsDomainDefineXML,      /* 0.10.0 */
>>   };
>>
>>   /**
>>
>


-- 
Dmitry Guryanov




More information about the libvir-list mailing list