mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-11 15:27:47 +00:00
parallels: implement functions for domain life cycle management
Add functions for create/shutdown/destroy and suspend/resume domain. Signed-off-by: Dmitry Guryanov <dguryanov@parallels.com>
This commit is contained in:
parent
e93c33a987
commit
0740e1bb01
@ -825,6 +825,120 @@ parallelsDomainGetAutostart(virDomainPtr domain, int *autostart)
|
|||||||
return ret;
|
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 = virDomainFindByUUID(&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)
|
||||||
|
virDomainObjUnlock(privdom);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parallelsPause(virDomainObjPtr privdom)
|
||||||
|
{
|
||||||
|
return parallelsCmdRun(PRLCTL, "pause", PARALLELS_UUID(privdom), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
parallelsPauseDomain(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
|
||||||
|
parallelsResumeDomain(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
|
||||||
|
parallelsDestroyDomain(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
|
||||||
|
parallelsShutdownDomain(virDomainPtr domain)
|
||||||
|
{
|
||||||
|
return parallelsDomainChangeState(domain,
|
||||||
|
VIR_DOMAIN_RUNNING, "running",
|
||||||
|
parallelsStop,
|
||||||
|
VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
|
||||||
|
}
|
||||||
|
|
||||||
static virDriver parallelsDriver = {
|
static virDriver parallelsDriver = {
|
||||||
.no = VIR_DRV_PARALLELS,
|
.no = VIR_DRV_PARALLELS,
|
||||||
.name = "Parallels",
|
.name = "Parallels",
|
||||||
@ -848,6 +962,11 @@ static virDriver parallelsDriver = {
|
|||||||
.domainGetXMLDesc = parallelsDomainGetXMLDesc, /* 0.10.0 */
|
.domainGetXMLDesc = parallelsDomainGetXMLDesc, /* 0.10.0 */
|
||||||
.domainIsPersistent = parallelsDomainIsPersistent, /* 0.10.0 */
|
.domainIsPersistent = parallelsDomainIsPersistent, /* 0.10.0 */
|
||||||
.domainGetAutostart = parallelsDomainGetAutostart, /* 0.10.0 */
|
.domainGetAutostart = parallelsDomainGetAutostart, /* 0.10.0 */
|
||||||
|
.domainSuspend = parallelsPauseDomain, /* 0.10.0 */
|
||||||
|
.domainResume = parallelsResumeDomain, /* 0.10.0 */
|
||||||
|
.domainDestroy = parallelsDestroyDomain, /* 0.10.0 */
|
||||||
|
.domainShutdown = parallelsShutdownDomain, /* 0.10.0 */
|
||||||
|
.domainCreate = parallelsDomainCreate, /* 0.10.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -107,3 +107,21 @@ parallelsGetOutput(const char *binary, ...)
|
|||||||
|
|
||||||
return outbuf;
|
return outbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Run prlctl command and check for errors
|
||||||
|
*
|
||||||
|
* Return value is 0 in case of success, else - -1
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
parallelsCmdRun(const char *binary, ...)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
va_list list;
|
||||||
|
|
||||||
|
va_start(list, binary);
|
||||||
|
ret = parallelsDoCmdRun(NULL, binary, list);
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -27,5 +27,7 @@ virJSONValuePtr parallelsParseOutput(const char *binary, ...)
|
|||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
|
||||||
char * parallelsGetOutput(const char *binary, ...)
|
char * parallelsGetOutput(const char *binary, ...)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
|
||||||
|
int parallelsCmdRun(const char *binary, ...)
|
||||||
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user