]> xenbits.xensource.com Git - libvirt.git/commitdiff
parallels: report proper error in Create/Destroy/Suspend e.t.c.
authorDmitry Guryanov <dguryanov@parallels.com>
Mon, 1 Dec 2014 15:39:01 +0000 (18:39 +0300)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 9 Dec 2014 18:42:04 +0000 (19:42 +0100)
If we want to perform some operation and domain state is not suitable
for that operation, we should report error VIR_ERR_OPERATION_INVALID.

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

index d3a10ab103c6ce52d8cf10b19543d83c51b5363a..0b05bc13a91543692d41ff017fc458bf750627e4 100644 (file)
@@ -1601,7 +1601,7 @@ void prlsdkUnsubscribeFromPCSEvents(parallelsConnPtr privconn)
         logPrlError(ret);
 }
 
-int prlsdkStart(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+PRL_RESULT prlsdkStart(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
 {
     PRL_HANDLE job = PRL_INVALID_HANDLE;
 
@@ -1609,40 +1609,40 @@ int prlsdkStart(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
     return PRL_FAILED(waitJob(job, privconn->jobTimeout)) ? -1 : 0;
 }
 
-static int prlsdkStopEx(parallelsConnPtr privconn,
+static PRL_RESULT prlsdkStopEx(parallelsConnPtr privconn,
                         PRL_HANDLE sdkdom,
                         PRL_UINT32 mode)
 {
     PRL_HANDLE job = PRL_INVALID_HANDLE;
 
     job = PrlVm_StopEx(sdkdom, mode, 0);
-    return PRL_FAILED(waitJob(job, privconn->jobTimeout)) ? -1 : 0;
+    return waitJob(job, privconn->jobTimeout);
 }
 
-int prlsdkKill(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+PRL_RESULT prlsdkKill(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
 {
     return prlsdkStopEx(privconn, sdkdom, PSM_KILL);
 }
 
-int prlsdkStop(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+PRL_RESULT prlsdkStop(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
 {
     return prlsdkStopEx(privconn, sdkdom, PSM_SHUTDOWN);
 }
 
-int prlsdkPause(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+PRL_RESULT prlsdkPause(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
 {
     PRL_HANDLE job = PRL_INVALID_HANDLE;
 
     job = PrlVm_Pause(sdkdom, false);
-    return PRL_FAILED(waitJob(job, privconn->jobTimeout)) ? -1 : 0;
+    return waitJob(job, privconn->jobTimeout);
 }
 
-int prlsdkResume(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
+PRL_RESULT prlsdkResume(parallelsConnPtr privconn, PRL_HANDLE sdkdom)
 {
     PRL_HANDLE job = PRL_INVALID_HANDLE;
 
     job = PrlVm_Resume(sdkdom);
-    return PRL_FAILED(waitJob(job, privconn->jobTimeout)) ? -1 : 0;
+    return waitJob(job, privconn->jobTimeout);
 }
 
 int
@@ -1652,7 +1652,9 @@ prlsdkDomainChangeState(virDomainPtr domain,
     parallelsConnPtr privconn = domain->conn->privateData;
     virDomainObjPtr dom;
     parallelsDomObjPtr pdom;
+    PRL_RESULT pret;
     int ret = -1;
+    virErrorNumber virerr;
 
     dom = virDomainObjListFindByUUID(privconn->domains, domain->uuid);
     if (dom == NULL) {
@@ -1661,8 +1663,24 @@ prlsdkDomainChangeState(virDomainPtr domain,
     }
 
     pdom = dom->privateData;
-    if ((ret = chstate(privconn, pdom->sdkdom)))
+    pret = chstate(privconn, pdom->sdkdom);
+    virReportError(VIR_ERR_OPERATION_FAILED,
+                   _("Can't change domain state: %d"), pret);
+    if (PRL_FAILED(pret)) {
+        virResetLastError();
+
+        switch (pret) {
+        case PRL_ERR_DISP_VM_IS_NOT_STARTED:
+        case PRL_ERR_DISP_VM_IS_NOT_STOPPED:
+            virerr = VIR_ERR_OPERATION_INVALID;
+            break;
+        default:
+            virerr = VIR_ERR_OPERATION_FAILED;
+        }
+
+        virReportError(virerr, "%s", _("Can't change domain state."));
         goto cleanup;
+    }
 
     ret = prlsdkUpdateDomain(privconn, dom);
 
index dee9359c376a921221541d79116ee53c22562541..694c19b6c660fd44e84d048d1d0f4c43e40e307a 100644 (file)
@@ -41,7 +41,7 @@ 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);
+typedef PRL_RESULT (*prlsdkChangeStateFunc)(parallelsConnPtr privconn, PRL_HANDLE sdkdom);
 int
 prlsdkDomainChangeState(virDomainPtr domain,
                         prlsdkChangeStateFunc chstate);