static int bhyveDomainGetState(virDomainPtr domain, int *state, int *reason, unsigned int flags) { virDomainObjPtr vm; int ret = -1; virCheckFlags(0, -1); if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetStateEnsureACL(domain->conn, vm->def) < 0) goto cleanup; *state = virDomainObjGetState(vm, reason); ret = 0; cleanup: if (vm) virObjectUnlock(vm); return ret; }
static int bhyveDomainDestroy(virDomainPtr dom) { bhyveConnPtr privconn = dom->conn->privateData; virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; if (virDomainDestroyEnsureACL(dom->conn, vm->def) < 0) goto cleanup; if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not running")); goto cleanup; } ret = virBhyveProcessStop(privconn, vm, VIR_DOMAIN_SHUTOFF_DESTROYED); if (!vm->persistent) { virDomainObjListRemove(privconn->domains, vm); vm = NULL; } cleanup: if (vm) virObjectUnlock(vm); return ret; }
static int bhyveDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetInfoEnsureACL(domain->conn, vm->def) < 0) goto cleanup; if (virDomainObjIsActive(vm)) { if (virBhyveGetDomainTotalCpuStats(vm, &(info->cpuTime)) < 0) goto cleanup; } else { info->cpuTime = 0; } info->state = virDomainObjGetState(vm, NULL); info->maxMem = vm->def->mem.max_balloon; info->nrVirtCpu = vm->def->vcpus; ret = 0; cleanup: if (vm) virObjectUnlock(vm); return ret; }
static char * bhyveDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { bhyveConnPtr privconn = domain->conn->privateData; virDomainObjPtr vm; virCapsPtr caps = NULL; char *ret = NULL; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetXMLDescEnsureACL(domain->conn, vm->def, flags) < 0) goto cleanup; caps = bhyveDriverGetCapabilities(privconn); if (!caps) goto cleanup; ret = virDomainDefFormat(vm->def, caps, virDomainDefFormatConvertXMLFlags(flags)); virObjectUnref(caps); cleanup: if (vm) virObjectUnlock(vm); return ret; }
static int bhyveDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) { bhyveConnPtr privconn = dom->conn->privateData; virDomainObjPtr vm; unsigned int start_flags = 0; int ret = -1; virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, -1); if (flags & VIR_DOMAIN_START_AUTODESTROY) start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY; if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; if (virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is already running")); goto cleanup; } ret = virBhyveProcessStart(dom->conn, privconn, vm, VIR_DOMAIN_RUNNING_BOOTED, start_flags); cleanup: virObjectUnlock(vm); return ret; }
static int bhyveDomainUndefine(virDomainPtr domain) { bhyveConnPtr privconn = domain->conn->privateData; virObjectEventPtr event = NULL; virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainUndefineEnsureACL(domain->conn, vm->def) < 0) goto cleanup; if (!vm->persistent) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Cannot undefine transient domain")); goto cleanup; } if (virDomainDeleteConfig(BHYVE_CONFIG_DIR, BHYVE_AUTOSTART_DIR, vm) < 0) goto cleanup; event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_UNDEFINED, VIR_DOMAIN_EVENT_UNDEFINED_REMOVED); if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { virDomainObjListRemove(privconn->domains, vm); vm = NULL; } ret = 0; cleanup: if (vm) virObjectUnlock(vm); if (event) virObjectEventStateQueue(privconn->domainEventState, event); return ret; }
static char * bhyveDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { virDomainObjPtr vm; char *ret = NULL; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetXMLDescEnsureACL(domain->conn, vm->def, flags) < 0) goto cleanup; ret = virDomainDefFormat(vm->def, flags); cleanup: virObjectUnlock(vm); return ret; }
static int bhyveDomainIsPersistent(virDomainPtr domain) { virDomainObjPtr obj; int ret = -1; if (!(obj = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainIsPersistentEnsureACL(domain->conn, obj->def) < 0) goto cleanup; ret = obj->persistent; cleanup: virObjectUnlock(obj); return ret; }
static int bhyveDomainIsActive(virDomainPtr domain) { virDomainObjPtr obj; int ret = -1; if (!(obj = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainIsActiveEnsureACL(domain->conn, obj->def) < 0) goto cleanup; ret = virDomainObjIsActive(obj); cleanup: virObjectUnlock(obj); return ret; }
static int bhyveDomainGetAutostart(virDomainPtr domain, int *autostart) { virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetAutostartEnsureACL(domain->conn, vm->def) < 0) goto cleanup; *autostart = vm->autostart; ret = 0; cleanup: virObjectUnlock(vm); return ret; }
static char * bhyveDomainGetOSType(virDomainPtr dom) { virDomainObjPtr vm; char *ret = NULL; if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; if (virDomainGetOSTypeEnsureACL(dom->conn, vm->def) < 0) goto cleanup; if (VIR_STRDUP(ret, virDomainOSTypeToString(vm->def->os.type)) < 0) goto cleanup; cleanup: if (vm) virObjectUnlock(vm); return ret; }
static int bhyveDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info) { virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainGetInfoEnsureACL(domain->conn, vm->def) < 0) goto cleanup; info->state = virDomainObjGetState(vm, NULL); info->maxMem = vm->def->mem.max_balloon; info->nrVirtCpu = vm->def->vcpus; ret = 0; cleanup: virObjectUnlock(vm); return ret; }
static int bhyveDomainUndefine(virDomainPtr domain) { bhyveConnPtr privconn = domain->conn->privateData; virDomainObjPtr vm; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainUndefineEnsureACL(domain->conn, vm->def) < 0) goto cleanup; if (!vm->persistent) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Cannot undefine transient domain")); goto cleanup; } if (virDomainDeleteConfig(BHYVE_CONFIG_DIR, BHYVE_AUTOSTART_DIR, vm) < 0) goto cleanup; if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { virDomainObjListRemove(privconn->domains, vm); vm = NULL; } ret = 0; cleanup: virObjectUnlock(vm); return ret; }
static int bhyveDomainSetAutostart(virDomainPtr domain, int autostart) { virDomainObjPtr vm; char *configFile = NULL; char *autostartLink = NULL; int ret = -1; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; if (virDomainSetAutostartEnsureACL(domain->conn, vm->def) < 0) goto cleanup; if (!vm->persistent) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot set autostart for transient domain")); goto cleanup; } autostart = (autostart != 0); if (vm->autostart != autostart) { if ((configFile = virDomainConfigFile(BHYVE_CONFIG_DIR, vm->def->name)) == NULL) goto cleanup; if ((autostartLink = virDomainConfigFile(BHYVE_AUTOSTART_DIR, vm->def->name)) == NULL) goto cleanup; if (autostart) { if (virFileMakePath(BHYVE_AUTOSTART_DIR) < 0) { virReportSystemError(errno, _("cannot create autostart directory %s"), BHYVE_AUTOSTART_DIR); goto cleanup; } if (symlink(configFile, autostartLink) < 0) { virReportSystemError(errno, _("Failed to create symlink '%s' to '%s'"), autostartLink, configFile); goto cleanup; } } else { if (unlink(autostartLink) < 0 && errno != ENOENT && errno != ENOTDIR) { virReportSystemError(errno, _("Failed to delete symlink '%s'"), autostartLink); goto cleanup; } } vm->autostart = autostart; } ret = 0; cleanup: VIR_FREE(configFile); VIR_FREE(autostartLink); if (vm) virObjectUnlock(vm); return ret; }