Implement functions, which change domain state with SDK.
We have to keep stored domains list up-to-date, so
update domain info after calling prlsdkDomain*.
When we remove cached domain list, we can remove
functions parallelsDomain*, because they will be
just calling corresponding functions from parallels_sdk.c
Signed-off-by: Dmitry Guryanov <dguryanov(a)parallels.com>
---
src/parallels/parallels_driver.c | 114 +++++++--------------------------------
src/parallels/parallels_sdk.c | 88 ++++++++++++++++++++++++++++++
src/parallels/parallels_sdk.h | 5 ++
3 files changed, 113 insertions(+), 94 deletions(-)
diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index ac192a0..bbed9dc 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -1333,118 +1333,44 @@ 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)
+int parallelsDomainSuspend(virDomainPtr domain)
{
- 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);
+ if (prlsdkDomainSuspend(domain) < 0)
+ return -1;
- return ret;
+ return parallelsLoadDomains(domain->conn->privateData, domain->name);
}
-static int parallelsPause(virDomainObjPtr privdom)
+int parallelsDomainResume(virDomainPtr domain)
{
- 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);
-}
+ if (prlsdkDomainResume(domain) < 0)
+ return -1;
-static int
-parallelsDomainResume(virDomainPtr domain)
-{
- return parallelsDomainChangeState(domain,
- VIR_DOMAIN_PAUSED, "paused",
- parallelsResume,
- VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_UNPAUSED);
+ return parallelsLoadDomains(domain->conn->privateData, domain->name);
}
-static int parallelsStart(virDomainObjPtr privdom)
+int parallelsDomainCreate(virDomainPtr domain)
{
- return parallelsCmdRun(PRLCTL, "start", PARALLELS_UUID(privdom), NULL);
-}
+ if (prlsdkDomainCreate(domain) < 0)
+ return -1;
-static int
-parallelsDomainCreate(virDomainPtr domain)
-{
- return parallelsDomainChangeState(domain,
- VIR_DOMAIN_SHUTOFF, "stopped",
- parallelsStart,
- VIR_DOMAIN_RUNNING,
VIR_DOMAIN_EVENT_STARTED_BOOTED);
+ return parallelsLoadDomains(domain->conn->privateData, domain->name);
}
-static int parallelsKill(virDomainObjPtr privdom)
+int parallelsDomainDestroy(virDomainPtr domain)
{
- return parallelsCmdRun(PRLCTL, "stop", PARALLELS_UUID(privdom),
"--kill", NULL);
-}
+ if (prlsdkDomainDestroy(domain) < 0)
+ return -1;
-static int
-parallelsDomainDestroy(virDomainPtr domain)
-{
- return parallelsDomainChangeState(domain,
- VIR_DOMAIN_RUNNING, "running",
- parallelsKill,
- VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_DESTROYED);
+ return parallelsLoadDomains(domain->conn->privateData, domain->name);
}
-static int parallelsStop(virDomainObjPtr privdom)
+int parallelsDomainShutdown(virDomainPtr domain)
{
- return parallelsCmdRun(PRLCTL, "stop", PARALLELS_UUID(privdom), NULL);
-}
+ if (prlsdkDomainShutdown(domain) < 0)
+ return -1;
-static int
-parallelsDomainShutdown(virDomainPtr domain)
-{
- return parallelsDomainChangeState(domain,
- VIR_DOMAIN_RUNNING, "running",
- parallelsStop,
- VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
+ return parallelsLoadDomains(domain->conn->privateData, domain->name);
}
static int
diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c
index ba9d226..8d22da3 100644
--- a/src/parallels/parallels_sdk.c
+++ b/src/parallels/parallels_sdk.c
@@ -1340,3 +1340,91 @@ prlsdkDomainObjLookupByUUID(virConnectPtr conn, const unsigned char
*uuid)
return dom;
}
+
+static 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);
+}
+
+static int prlsdkKill(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+{
+ return prlsdkStopEx(privconn, sdkdom, PSM_KILL);
+}
+
+static int prlsdkStop(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+{
+ return prlsdkStopEx(privconn, sdkdom, PSM_SHUTDOWN);
+}
+
+static int prlsdkPause(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+{
+ PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+ job = PrlVm_Pause(sdkdom, false);
+ return waitJob(job, privconn->jobTimeout);
+}
+
+static int prlsdkResume(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+{
+ PRL_HANDLE job = PRL_INVALID_HANDLE;
+
+ job = PrlVm_Resume(sdkdom);
+ return waitJob(job, privconn->jobTimeout);
+}
+
+typedef int (*prlsdkChangeStateFunc)(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
+
+static int
+prlsdkDomainChangeState(virDomainPtr domain,
+ prlsdkChangeStateFunc chstate)
+{
+ parallelsConnPtr privconn = domain->conn->privateData;
+ PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
+ int ret = -1;
+
+ sdkdom = prlsdkSdkDomainLookupByUUID(domain->conn, domain->uuid);
+ if (sdkdom == PRL_INVALID_HANDLE)
+ return -1;
+
+ ret = chstate(privconn, sdkdom);
+ PrlHandle_Free(sdkdom);
+ return ret;
+}
+
+int prlsdkDomainSuspend(virDomainPtr domain)
+{
+ return prlsdkDomainChangeState(domain, prlsdkPause);
+}
+
+int prlsdkDomainResume(virDomainPtr domain)
+{
+ return prlsdkDomainChangeState(domain, prlsdkResume);
+}
+
+int prlsdkDomainCreate(virDomainPtr domain)
+{
+ return prlsdkDomainChangeState(domain, prlsdkStart);
+}
+
+int prlsdkDomainDestroy(virDomainPtr domain)
+{
+ return prlsdkDomainChangeState(domain, prlsdkKill);
+}
+
+int prlsdkDomainShutdown(virDomainPtr domain)
+{
+ return prlsdkDomainChangeState(domain, prlsdkStop);
+}
diff --git a/src/parallels/parallels_sdk.h b/src/parallels/parallels_sdk.h
index 30c6c21..b02565b 100644
--- a/src/parallels/parallels_sdk.h
+++ b/src/parallels/parallels_sdk.h
@@ -37,3 +37,8 @@ virDomainPtr
prlsdkDomainLookupByName(virConnectPtr conn, const char *name);
virDomainObjPtr
prlsdkDomainObjLookupByUUID(virConnectPtr conn, const unsigned char *uuid);
+int prlsdkDomainSuspend(virDomainPtr domain);
+int prlsdkDomainResume(virDomainPtr domain);
+int prlsdkDomainCreate(virDomainPtr domain);
+int prlsdkDomainDestroy(virDomainPtr domain);
+int prlsdkDomainShutdown(virDomainPtr domain);
--
1.9.3