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(a)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