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@xxxxxxxxxxxxx> > > --- > > > > 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list