[libvirt] [PATCH v3 05/12] parallels: reimplement functions, which change domain state

Dmitry Guryanov dguryanov at parallels.com
Thu Nov 27 15:02:22 UTC 2014


On Tuesday 25 November 2014 16:10:37 Maxim Nestratov wrote:
> 18.11.2014 16:17, Dmitry Guryanov пишет:
> > Change domain state using parallels SDK functions instead of
> > prlctl command.
> > 
> > We don't need to send events from these functions now, becase
> > events handler will send them. But we still need to update
> > virDomainObj in privconn->domains.
> > 
> > Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
> > ---
> > 
> >   src/parallels/parallels_driver.c | 139
> >   +++++++-------------------------------- src/parallels/parallels_sdk.c  
> >    |  70 ++++++++++++++++++++
> >   src/parallels/parallels_sdk.h    |  10 +++
> >   3 files changed, 105 insertions(+), 114 deletions(-)
> > 
> > diff --git a/src/parallels/parallels_driver.c
> > b/src/parallels/parallels_driver.c index e145766..658969f 100644
> > --- a/src/parallels/parallels_driver.c
> > +++ b/src/parallels/parallels_driver.c
> > @@ -670,120 +670,6 @@ parallelsDomainGetAutostart(virDomainPtr domain, int
> > *autostart)> 
> >       return ret;
> >   
> >   }
> > 
> > -typedef int (*parallelsChangeStateFunc)(virDomainObjPtr privdom);
> > -#define PARALLELS_UUID(x)    
> > (((parallelsDomObjPtr)(x->privateData))->uuid) -
> > -static int
> > -parallelsDomainChangeState(virDomainPtr domain,
> > -                           virDomainState req_state, const char
> > *req_state_name, -                           parallelsChangeStateFunc
> > chstate,
> > -                           virDomainState new_state, int reason)
> > -{
> > -    parallelsConnPtr privconn = domain->conn->privateData;
> > -    virDomainObjPtr privdom;
> > -    int state;
> > -    int ret = -1;
> > -
> > -    parallelsDriverLock(privconn);
> > -    privdom = virDomainObjListFindByUUID(privconn->domains,
> > domain->uuid);
> > -    parallelsDriverUnlock(privconn);
> > -
> > -    if (privdom == NULL) {
> > -        parallelsDomNotFoundError(domain);
> > -        goto cleanup;
> > -    }
> > -
> > -    state = virDomainObjGetState(privdom, NULL);
> > -    if (state != req_state) {
> > -        virReportError(VIR_ERR_INTERNAL_ERROR, _("domain '%s' not %s"),
> > -                       privdom->def->name, req_state_name);
> > -        goto cleanup;
> > -    }
> > -
> > -    if (chstate(privdom))
> > -        goto cleanup;
> > -
> > -    virDomainObjSetState(privdom, new_state, reason);
> > -
> > -    ret = 0;
> > -
> > - cleanup:
> > -    if (privdom)
> > -        virObjectUnlock(privdom);
> > -
> > -    return ret;
> > -}
> > -
> > -static int parallelsPause(virDomainObjPtr privdom)
> > -{
> > -    return parallelsCmdRun(PRLCTL, "pause", PARALLELS_UUID(privdom),
> > NULL); -}
> > -
> > -static int
> > -parallelsDomainSuspend(virDomainPtr domain)
> > -{
> > -    return parallelsDomainChangeState(domain,
> > -                                      VIR_DOMAIN_RUNNING, "running",
> > -                                      parallelsPause,
> > -                                      VIR_DOMAIN_PAUSED,
> > VIR_DOMAIN_PAUSED_USER); -}
> > -
> > -static int parallelsResume(virDomainObjPtr privdom)
> > -{
> > -    return parallelsCmdRun(PRLCTL, "resume", PARALLELS_UUID(privdom),
> > NULL); -}
> > -
> > -static int
> > -parallelsDomainResume(virDomainPtr domain)
> > -{
> > -    return parallelsDomainChangeState(domain,
> > -                                      VIR_DOMAIN_PAUSED, "paused",
> > -                                      parallelsResume,
> > -                                      VIR_DOMAIN_RUNNING,
> > VIR_DOMAIN_RUNNING_UNPAUSED); -}
> > -
> > -static int parallelsStart(virDomainObjPtr privdom)
> > -{
> > -    return parallelsCmdRun(PRLCTL, "start", PARALLELS_UUID(privdom),
> > NULL); -}
> > -
> > -static int
> > -parallelsDomainCreate(virDomainPtr domain)
> > -{
> > -    return parallelsDomainChangeState(domain,
> > -                                      VIR_DOMAIN_SHUTOFF, "stopped",
> > -                                      parallelsStart,
> > -                                      VIR_DOMAIN_RUNNING,
> > VIR_DOMAIN_EVENT_STARTED_BOOTED); -}
> > -
> > -static int parallelsKill(virDomainObjPtr privdom)
> > -{
> > -    return parallelsCmdRun(PRLCTL, "stop", PARALLELS_UUID(privdom),
> > "--kill", NULL); -}
> > -
> > -static int
> > -parallelsDomainDestroy(virDomainPtr domain)
> > -{
> > -    return parallelsDomainChangeState(domain,
> > -                                      VIR_DOMAIN_RUNNING, "running",
> > -                                      parallelsKill,
> > -                                      VIR_DOMAIN_SHUTOFF,
> > VIR_DOMAIN_SHUTOFF_DESTROYED); -}
> > -
> > -static int parallelsStop(virDomainObjPtr privdom)
> > -{
> > -    return parallelsCmdRun(PRLCTL, "stop", PARALLELS_UUID(privdom),
> > NULL);
> > -}
> > -
> > -static int
> > -parallelsDomainShutdown(virDomainPtr domain)
> > -{
> > -    return parallelsDomainChangeState(domain,
> > -                                      VIR_DOMAIN_RUNNING, "running",
> > -                                      parallelsStop,
> > -                                      VIR_DOMAIN_SHUTOFF,
> > VIR_DOMAIN_SHUTOFF_SHUTDOWN); -}
> > -
> > 
> >   static int
> >   parallelsApplyGraphicsParams(virDomainGraphicsDefPtr *oldgraphics, int
> >   nold,>   
> >                                virDomainGraphicsDefPtr *newgraphics, int
> >                                nnew)
> > 
> > @@ -1762,6 +1648,31 @@
> > parallelsConnectDomainEventDeregisterAny(virConnectPtr conn,> 
> >       return ret;
> >   
> >   }
> > 
> > +static int parallelsDomainSuspend(virDomainPtr domain)
> > +{
> > +    return prlsdkDomainChangeState(domain, prlsdkPause);
> > +}
> > +
> > +static int parallelsDomainResume(virDomainPtr domain)
> > +{
> > +    return prlsdkDomainChangeState(domain, prlsdkResume);
> > +}
> > +
> > +static int parallelsDomainCreate(virDomainPtr domain)
> > +{
> > +    return prlsdkDomainChangeState(domain, prlsdkStart);
> > +}
> > +
> > +static int parallelsDomainDestroy(virDomainPtr domain)
> > +{
> > +    return prlsdkDomainChangeState(domain, prlsdkKill);
> > +}
> > +
> > +static int parallelsDomainShutdown(virDomainPtr domain)
> > +{
> > +    return prlsdkDomainChangeState(domain, prlsdkStop);
> > +}
> > +
> > 
> >   static virHypervisorDriver parallelsDriver = {
> >   
> >       .no = VIR_DRV_PARALLELS,
> >       .name = "Parallels",
> > 
> > diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c
> > index 01efc22..d42456f 100644
> > --- a/src/parallels/parallels_sdk.c
> > +++ b/src/parallels/parallels_sdk.c
> > @@ -1538,3 +1538,73 @@ void
> > prlsdkUnsubscribeFromPCSEvents(parallelsConnPtr privconn)> 
> >       if (PRL_FAILED(ret))
> >       
> >           logPrlError(ret);
> >   
> >   }
> > 
> > +
> > +int prlsdkStart(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
> > +{
> > +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> > +
> > +    job = PrlVm_StartEx(sdkdom, PSM_VM_START, 0);
> > +    return waitJob(job, privconn->jobTimeout);
> > +}
> > +
> > +static int prlsdkStopEx(parallelsConnPtr privconn,
> > +                        PRL_HANDLE sdkdom,
> > +                        PRL_UINT32 mode)
> > +{
> > +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> > +
> > +    job = PrlVm_StopEx(sdkdom, mode, 0);
> > +    return waitJob(job, privconn->jobTimeout);
> > +}
> > +
> > +int prlsdkKill(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
> > +{
> > +    return prlsdkStopEx(privconn, sdkdom, PSM_KILL);
> > +}
> > +
> > +int prlsdkStop(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
> > +{
> > +    return prlsdkStopEx(privconn, sdkdom, PSM_SHUTDOWN);
> > +}
> > +
> > +int prlsdkPause(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
> > +{
> > +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> > +
> > +    job = PrlVm_Pause(sdkdom, false);
> > +    return waitJob(job, privconn->jobTimeout);
> > +}
> > +
> > +int prlsdkResume(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
> > +{
> > +    PRL_HANDLE job = PRL_INVALID_HANDLE;
> > +
> > +    job = PrlVm_Resume(sdkdom);
> > +    return waitJob(job, privconn->jobTimeout);
> > +}
> > +
> > +int
> > +prlsdkDomainChangeState(virDomainPtr domain,
> > +                        prlsdkChangeStateFunc chstate)
> > +{
> > +    parallelsConnPtr privconn = domain->conn->privateData;
> > +    virDomainObjPtr dom;
> > +    parallelsDomObjPtr pdom;
> > +    int ret = -1;
> > +
> > +    dom = virDomainObjListFindByUUID(privconn->domains, domain->uuid);
> > +    if (dom == NULL) {
> > +        parallelsDomNotFoundError(domain);
> > +        return -1;
> > +    }
> > +
> > +    pdom = dom->privateData;
> > +    if ((ret = chstate(privconn, pdom->sdkdom)))
> > +        goto cleanup;
> > +
> > +    ret = prlsdkUpdateDomain(privconn, dom);
> > +
> > + cleanup:
> > +    virObjectUnlock(dom);
> 
> error code translation is from PRL to VIR is necessary here
> something like this:
> 
>      switch(ret){
>      case PRL_ERR_DISP_VM_IS_NOT_STARTED:
>          ret = VIR_ERR_OPERATION_INVALID;
>          break;
>      default:
>          ret = VIR_ERR_OPERATION_FAILED;
>      }
> 

OK, I'll do it in a separate patch

> > +    return ret;
> > +}
> > diff --git a/src/parallels/parallels_sdk.h b/src/parallels/parallels_sdk.h
> > index 5ffbf53..1e26672 100644
> > --- a/src/parallels/parallels_sdk.h
> > +++ b/src/parallels/parallels_sdk.h
> > @@ -34,3 +34,13 @@ virDomainObjPtr
> > 
> >   prlsdkAddDomain(parallelsConnPtr privconn, const unsigned char *uuid);
> >   int prlsdkSubscribeToPCSEvents(parallelsConnPtr privconn);
> >   void prlsdkUnsubscribeFromPCSEvents(parallelsConnPtr privconn);
> > 
> > +int prlsdkStart(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
> > +int prlsdkKill(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
> > +int prlsdkStop(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
> > +int prlsdkPause(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
> > +int prlsdkResume(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
> > +
> > +typedef int (*prlsdkChangeStateFunc)(parallelsConnPtr privconn,
> > PRL_HANDLE sdkdom); +int
> > +prlsdkDomainChangeState(virDomainPtr domain,
> > +                        prlsdkChangeStateFunc chstate);

-- 
Dmitry Guryanov




More information about the libvir-list mailing list