]> xenbits.xensource.com Git - libvirt.git/commitdiff
parallels: implement functions for domain life cycle management
authorDmitry Guryanov <dguryanov@parallels.com>
Tue, 31 Jul 2012 18:56:08 +0000 (22:56 +0400)
committerDaniel Veillard <veillard@redhat.com>
Wed, 1 Aug 2012 03:44:40 +0000 (11:44 +0800)
Add functions for create/shutdown/destroy and suspend/resume domain.

Signed-off-by: Dmitry Guryanov <dguryanov@parallels.com>
src/parallels/parallels_driver.c
src/parallels/parallels_utils.c
src/parallels/parallels_utils.h

index 585260c23ed3e5c63fcfb273e5428490e321447e..dc841bfb28464de3562ce99c906641b1e03c2670 100644 (file)
@@ -825,6 +825,120 @@ 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 = 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 = {
     .no = VIR_DRV_PARALLELS,
     .name = "Parallels",
@@ -848,6 +962,11 @@ static virDriver parallelsDriver = {
     .domainGetXMLDesc = parallelsDomainGetXMLDesc,    /* 0.10.0 */
     .domainIsPersistent = parallelsDomainIsPersistent,        /* 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 */
 };
 
 /**
index afb221ea1a6f897102585ffcf21da8ff381ead31..06e5ddea352c4dd89f380f12893cdc06c2e3d7bb 100644 (file)
@@ -107,3 +107,21 @@ parallelsGetOutput(const char *binary, ...)
 
     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;
+}
index 422df6fdf9b395af0798397da4724f8a8b626719..c4267543177f6c48404298b432f15b85ea2044c1 100644 (file)
@@ -27,5 +27,7 @@ virJSONValuePtr parallelsParseOutput(const char *binary, ...)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
 char * parallelsGetOutput(const char *binary, ...)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
+int parallelsCmdRun(const char *binary, ...)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL;
 
 #endif