]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
vz: support virDomainAbortJob
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Tue, 31 Jan 2017 07:44:12 +0000 (10:44 +0300)
committerMaxim Nestratov <mnestratov@virtuozzo.com>
Tue, 31 Jan 2017 14:02:26 +0000 (17:02 +0300)
src/vz/vz_driver.c
src/vz/vz_sdk.c
src/vz/vz_sdk.h
src/vz/vz_utils.c
src/vz/vz_utils.h

index 59bfb7a53d556f0654b2261c9b0557f6a3967b4e..0547de5863ca7d0ab177994e34a0b9ded504b13f 100644 (file)
@@ -3883,6 +3883,26 @@ vzConnectGetAllDomainStats(virConnectPtr conn,
 
 #undef VZ_ADD_STAT_PARAM_UUL
 
+static int
+vzDomainAbortJob(virDomainPtr domain)
+{
+    virDomainObjPtr dom;
+    int ret = -1;
+
+    if (!(dom = vzDomObjFromDomainRef(domain)))
+        return -1;
+
+    if (virDomainAbortJobEnsureACL(domain->conn, dom->def) < 0)
+        goto cleanup;
+
+    ret = prlsdkCancelJob(dom);
+
+ cleanup:
+    virDomainObjEndAPI(&dom);
+
+    return ret;
+}
+
 static virHypervisorDriver vzHypervisorDriver = {
     .name = "vz",
     .connectOpen = vzConnectOpen,            /* 0.10.0 */
@@ -3979,6 +3999,7 @@ static virHypervisorDriver vzHypervisorDriver = {
     .domainGetJobInfo = vzDomainGetJobInfo, /* 2.2.0 */
     .domainGetJobStats = vzDomainGetJobStats, /* 2.2.0 */
     .connectGetAllDomainStats = vzConnectGetAllDomainStats, /* 3.1.0 */
+    .domainAbortJob = vzDomainAbortJob, /* 3.1.0 */
 };
 
 static virConnectDriver vzConnectDriver = {
index 01b071c61628bc00bc873c17a2ba2a8c507832f0..d4d4d6d0bd09e3e820be2c2de15b76a0a1f387a0 100644 (file)
@@ -243,13 +243,22 @@ waitDomainJobHelper(PRL_HANDLE job, virDomainObjPtr dom, unsigned int timeout,
                     const char *filename, const char *funcname,
                     size_t linenr)
 {
+    vzDomObjPtr pdom = dom->privateData;
     PRL_RESULT ret;
 
+    if (pdom->job.cancelled) {
+        virReportError(VIR_ERR_OPERATION_ABORTED, "%s",
+                       _("Operation cancelled by client"));
+        return PRL_ERR_FAILURE;
+    }
+
+    pdom->job.sdkJob = job;
     if (dom)
         virObjectUnlock(dom);
     ret = waitJobHelper(job, timeout, filename, funcname, linenr);
     if (dom)
         virObjectLock(dom);
+    pdom->job.sdkJob = NULL;
 
     return ret;
 }
@@ -260,6 +269,30 @@ waitDomainJobHelper(PRL_HANDLE job, virDomainObjPtr dom, unsigned int timeout,
 
 typedef PRL_RESULT (*prlsdkParamGetterType)(PRL_HANDLE, char*, PRL_UINT32*);
 
+int
+prlsdkCancelJob(virDomainObjPtr dom)
+{
+    vzDomObjPtr privdom = dom->privateData;
+    PRL_RESULT pret;
+    PRL_HANDLE job;
+
+    if (!privdom->job.active) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "%s", _("no job is active on the domain"));
+        return -1;
+    }
+
+   privdom->job.cancelled = true;
+   job = PrlJob_Cancel(privdom->job.sdkJob);
+
+   virObjectUnlock(dom);
+   pret = waitJobHelper(job, JOB_INFINIT_WAIT_TIMEOUT,
+                        __FILE__, __FUNCTION__, __LINE__);
+   virObjectLock(dom);
+
+   return PRL_FAILED(pret) ? -1 : 0;
+}
+
 static char*
 prlsdkGetStringParamVar(prlsdkParamGetterType getter, PRL_HANDLE handle)
 {
index e4e46dcba1a0f4510b1f591bcb85f09d913c3f89..65a3e68adac103ec1455935c5663dcca03eac581 100644 (file)
@@ -89,3 +89,4 @@ prlsdkMigrate(virDomainObjPtr dom,
 
 PRL_HANDLE
 prlsdkSdkDomainLookupByName(vzDriverPtr driver, const char *name);
+int prlsdkCancelJob(virDomainObjPtr dom);
index 81429d2b0468c039d12e0557ec5577873f161b78..a6d7b93cbc508efdded59d1852b0ed994d61fb6d 100644 (file)
@@ -659,6 +659,7 @@ vzDomainObjEndJob(virDomainObjPtr dom)
     vzDomObjPtr pdom = dom->privateData;
 
     pdom->job.active = false;
+    pdom->job.cancelled = false;
     virCondSignal(&pdom->job.cond);
 }
 
index 9e02fe09698001996102014554bfb46d0409612f..ea2e2da684cfc175dfd54dc7d2c106a37d32f0d7 100644 (file)
@@ -100,6 +100,8 @@ struct _vzDomainJobObj {
     unsigned long long elapsed;
     bool hasProgress;
     int progress; /* percents */
+    PRL_HANDLE sdkJob;
+    bool cancelled;
 };
 
 typedef struct _vzDomainJobObj vzDomainJobObj;