]> xenbits.xensource.com Git - libvirt.git/commitdiff
test: Implementing testDomainRename().
authorJulio Faracco <jcfaracco@gmail.com>
Mon, 15 Jan 2018 19:18:08 +0000 (17:18 -0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 29 Jan 2018 08:50:47 +0000 (09:50 +0100)
There is no method to rename inactive domains for test driver.
After this patch, we can rename the domains using 'domrename'.

    virsh# domrename test anothertest
    Domain successfully renamed

Signed-off-by: Julio Faracco <jcfaracco@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/test/test_driver.c

index dc743b49883542bbe4c4e53925f0579011a2193c..043caa976274cdd1296929bd2f04c32b0bb4c83a 100644 (file)
@@ -2618,6 +2618,90 @@ testDomainGetVcpuPinInfo(virDomainPtr dom,
     return ret;
 }
 
+static int
+testDomainRenameCallback(virDomainObjPtr privdom,
+                         const char *new_name,
+                         unsigned int flags,
+                         void *opaque)
+{
+    testDriverPtr driver = opaque;
+    virObjectEventPtr event_new = NULL;
+    virObjectEventPtr event_old = NULL;
+    int ret = -1;
+    char *new_dom_name = NULL;
+    char *old_dom_name = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (VIR_STRDUP(new_dom_name, new_name) < 0)
+        goto cleanup;
+
+    event_old = virDomainEventLifecycleNewFromObj(privdom,
+                                                  VIR_DOMAIN_EVENT_UNDEFINED,
+                                                  VIR_DOMAIN_EVENT_UNDEFINED_RENAMED);
+
+    /* Switch name in domain definition. */
+    old_dom_name = privdom->def->name;
+    privdom->def->name = new_dom_name;
+    new_dom_name = NULL;
+
+    event_new = virDomainEventLifecycleNewFromObj(privdom,
+                                                  VIR_DOMAIN_EVENT_DEFINED,
+                                                  VIR_DOMAIN_EVENT_DEFINED_RENAMED);
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(old_dom_name);
+    VIR_FREE(new_dom_name);
+    testObjectEventQueue(driver, event_old);
+    testObjectEventQueue(driver, event_new);
+    return ret;
+}
+
+static int
+testDomainRename(virDomainPtr dom,
+                 const char *new_name,
+                 unsigned int flags)
+{
+    testDriverPtr driver = dom->conn->privateData;
+    virDomainObjPtr privdom = NULL;
+    int ret = -1;
+
+    virCheckFlags(0, ret);
+
+    if (!(privdom = testDomObjFromDomain(dom)))
+        goto cleanup;
+
+    if (virDomainObjIsActive(privdom)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot rename active domain"));
+        goto cleanup;
+    }
+
+    if (!privdom->persistent) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot rename a transient domain"));
+        goto cleanup;
+    }
+
+    if (virDomainObjGetState(privdom, NULL) != VIR_DOMAIN_SHUTOFF) {
+        virReportError(VIR_ERR_OPERATION_INVALID,
+                       "%s", _("domain has to be shutoff before renaming"));
+        goto cleanup;
+    }
+
+    if (virDomainObjListRename(driver->domains, privdom, new_name, flags,
+                               testDomainRenameCallback, driver) < 0)
+        goto cleanup;
+
+    /* Success, domain has been renamed. */
+    ret = 0;
+
+ cleanup:
+    virDomainObjEndAPI(&privdom);
+    return ret;
+}
+
 static char *testDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
 {
     testDriverPtr privconn = domain->conn->privateData;
@@ -6822,6 +6906,7 @@ static virHypervisorDriver testHypervisorDriver = {
     .connectDomainEventDeregisterAny = testConnectDomainEventDeregisterAny, /* 0.8.0 */
     .connectIsAlive = testConnectIsAlive, /* 0.9.8 */
     .nodeGetCPUMap = testNodeGetCPUMap, /* 1.0.0 */
+    .domainRename = testDomainRename, /* 4.1.0 */
     .domainScreenshot = testDomainScreenshot, /* 1.0.5 */
     .domainGetMetadata = testDomainGetMetadata, /* 1.1.3 */
     .domainSetMetadata = testDomainSetMetadata, /* 1.1.3 */