[libvirt] [PATCH v3 5/5] qemu: Implement virDomainRename

Michal Privoznik mprivozn at redhat.com
Wed Aug 12 13:16:12 UTC 2015


On 10.08.2015 21:59, Tomas Meszaros wrote:
> Currently supports only renaming inactive domains without snapshots.
> 
> Signed-off-by: Tomas Meszaros <exo at tty.sk>
> ---
>  src/qemu/qemu_driver.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 145 insertions(+)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 6998e12..41e5fc4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -19853,6 +19853,150 @@ qemuDomainSetUserPassword(virDomainPtr dom,
>  }
> 
> 
> +static int qemuDomainRename(virDomainPtr dom,
> +                            const char *new_name,
> +                            unsigned int flags ATTRIBUTE_UNUSED)

Nope. They need to be checked via virCheckFlags().

> +{
> +    virQEMUDriverPtr driver = dom->conn->privateData;
> +    virQEMUDriverConfigPtr cfg = NULL;
> +    virDomainObjPtr vm;
> +    virObjectEventPtr event_new = NULL;
> +    virObjectEventPtr event_old = NULL;
> +    int ret = -1;
> +    int logfile = -1;
> +    char ebuf[1024];
> +    char *timestamp;
> +    char *rename_log_msg = NULL;
> +    char *new_dom_name = NULL;
> +    char *old_dom_name = NULL;
> +    char *old_dom_cfg_file = NULL;
> +
> +    if (VIR_STRDUP(new_dom_name, new_name) < 0)
> +        goto cleanup;
> +
> +    if (!(vm = qemuDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (virDomainRenameEnsureACL(dom->conn, vm->def) < 0)
> +        goto cleanup;
> +
> +    cfg = virQEMUDriverGetConfig(driver);
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
> +    if (virDomainObjIsActive(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                       _("cannot rename active domain"));
> +        goto endjob;
> +    }
> +
> +    if (!vm->persistent) {
> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                       _("cannot rename a transient domain"));
> +        goto endjob;
> +    }
> +
> +    if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_SHUTOFF) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("domain has to be shutoff before renaming"));
> +        goto endjob;
> +    }
> +
> +    if (virDomainSnapshotObjListNum(vm->snapshots, NULL, 0) > 0) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("cannot rename domain with snapshots"));
> +        goto endjob;
> +    }
> +
> +    if (virAsprintf(&rename_log_msg, ": domain %s has been renamed to %s\n",
> +                    vm->def->name, new_name) < 0) {
> +        goto endjob;
> +    }
> +
> +    if (!(old_dom_cfg_file = virDomainConfigFile(cfg->configDir,
> +                                                 vm->def->name))) {
> +        goto endjob;
> +    }
> +
> +    if (virDomainObjListRenameAddNew(driver->domains, vm, new_name) < 0)
> +        goto endjob;
> +
> +    if ((logfile = qemuDomainCreateLog(driver, vm, true)) < 0)
> +        goto rollback;
> +
> +    event_old = virDomainEventLifecycleNewFromObj(vm,
> +                                            VIR_DOMAIN_EVENT_UNDEFINED,
> +                                            VIR_DOMAIN_EVENT_UNDEFINED_RENAMED);
> +
> +    /* Switch name in domain definition. */
> +    old_dom_name = vm->def->name;
> +    vm->def->name = new_dom_name;
> +    new_dom_name = NULL;
> +
> +    if (virDomainSaveConfig(cfg->configDir, vm->def) < 0)
> +        goto rollback;
> +
> +    if (virFileExists(old_dom_cfg_file) &&
> +        unlink(old_dom_cfg_file) < 0) {
> +        virReportSystemError(errno,
> +                             _("cannot remove old domain config file %s"),
> +                             old_dom_cfg_file);
> +        goto rollback;
> +    }
> +
> +    /* Remove old domain name from table. */
> +    virDomainObjListRenameRemove(driver->domains, old_dom_name);
> +
> +    event_new = virDomainEventLifecycleNewFromObj(vm,
> +                                              VIR_DOMAIN_EVENT_DEFINED,
> +                                              VIR_DOMAIN_EVENT_DEFINED_RENAMED);
> +
> +    /* Write message to the log. */
> +    if ((timestamp = virTimeStringNow()) != NULL) {
> +        if (safewrite(logfile, timestamp, strlen(timestamp)) < 0 ||
> +            safewrite(logfile, rename_log_msg,
> +                      strlen(rename_log_msg)) < 0) {
> +            VIR_WARN("Unable to write timestamp to logfile: %s",
> +                     virStrerror(errno, ebuf, sizeof(ebuf)));
> +        }
> +        VIR_FREE(timestamp);
> +    }
> +
> +    /* Success, domain has been renamed. */
> +    ret = 0;
> +
> + endjob:
> +    qemuDomainObjEndJob(driver, vm);
> +
> + cleanup:
> +    if (VIR_CLOSE(logfile) < 0) {
> +        VIR_WARN("Unable to close logfile: %s",
> +                 virStrerror(errno, ebuf, sizeof(ebuf)));
> +    }
> +    virDomainObjEndAPI(&vm);
> +    VIR_FREE(old_dom_cfg_file);
> +    VIR_FREE(old_dom_name);
> +    VIR_FREE(new_dom_name);
> +    VIR_FREE(rename_log_msg);
> +    if (event_old)
> +        qemuDomainEventQueue(driver, event_old);
> +    if (event_new)
> +        qemuDomainEventQueue(driver, event_new);
> +    virObjectUnref(cfg);
> +    return ret;
> +
> + rollback:
> +    if (old_dom_name) {
> +        new_dom_name = vm->def->name;
> +        vm->def->name = old_dom_name;
> +        old_dom_name = NULL;
> +    }
> +
> +    virDomainObjListRenameRemove(driver->domains, new_name);
> +    goto endjob;
> +}
> +
>  static virHypervisorDriver qemuHypervisorDriver = {
>      .name = QEMU_DRIVER_NAME,
>      .connectOpen = qemuConnectOpen, /* 0.2.0 */
> @@ -20060,6 +20204,7 @@ static virHypervisorDriver qemuHypervisorDriver = {
>      .domainGetFSInfo = qemuDomainGetFSInfo, /* 1.2.11 */
>      .domainInterfaceAddresses = qemuDomainInterfaceAddresses, /* 1.2.14 */
>      .domainSetUserPassword = qemuDomainSetUserPassword, /* 1.2.16 */
> +    .domainRename = qemuDomainRename, /* 1.2.19 */
>  };
> 

Michal




More information about the libvir-list mailing list