unsigned int nvcpus);
static int openvzDomainSetMemoryInternal(virDomainObjPtr vm,
unsigned long memory);
+static int openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason);
static void openvzDriverLock(struct openvz_driver *driver)
{
virDomainInfoPtr info) {
struct openvz_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
+ int state;
int ret = -1;
openvzDriverLock(driver);
goto cleanup;
}
- info->state = virDomainObjGetState(vm, NULL);
+ if (openvzGetVEStatus(vm, &state, NULL) == -1)
+ goto cleanup;
+ info->state = state;
- if (!virDomainObjIsActive(vm)) {
+ if (info->state != VIR_DOMAIN_RUNNING) {
info->cpuTime = 0;
} else {
if (openvzGetProcessInfo(&(info->cpuTime), dom->id) < 0) {
goto cleanup;
}
- *state = virDomainObjGetState(vm, reason);
- ret = 0;
+ ret = openvzGetVEStatus(vm, state, reason);
cleanup:
if (vm)
virDomainObjPtr vm;
const char *prog[] = {VZCTL, "--quiet", "stop", PROGRAM_SENTINAL, NULL};
int ret = -1;
+ int status;
virCheckFlags(0, -1);
goto cleanup;
}
+ if (openvzGetVEStatus(vm, &status, NULL) == -1)
+ goto cleanup;
+
openvzSetProgramSentinal(prog, vm->def->name);
- if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING) {
+ if (status != VIR_DOMAIN_RUNNING) {
openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domain is not in running state"));
goto cleanup;
virDomainObjPtr vm;
const char *prog[] = {VZCTL, "--quiet", "restart", PROGRAM_SENTINAL, NULL};
int ret = -1;
+ int status;
virCheckFlags(0, -1);
goto cleanup;
}
+ if (openvzGetVEStatus(vm, &status, NULL) == -1)
+ goto cleanup;
+
openvzSetProgramSentinal(prog, vm->def->name);
- if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_RUNNING) {
+ if (status != VIR_DOMAIN_RUNNING) {
openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
_("domain is not in running state"));
goto cleanup;
virDomainObjPtr vm;
const char *prog[] = {VZCTL, "--quiet", "start", PROGRAM_SENTINAL, NULL };
int ret = -1;
+ int status;
virCheckFlags(0, -1);
goto cleanup;
}
- if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_SHUTOFF) {
+ if (openvzGetVEStatus(vm, &status, NULL) == -1)
+ goto cleanup;
+
+ if (status != VIR_DOMAIN_SHUTOFF) {
openvzError(VIR_ERR_OPERATION_DENIED, "%s",
_("domain is not in shutoff state"));
goto cleanup;
virDomainObjPtr vm;
const char *prog[] = { VZCTL, "--quiet", "destroy", PROGRAM_SENTINAL, NULL };
int ret = -1;
+ int status;
virCheckFlags(0, -1);
goto cleanup;
}
- if (virDomainObjIsActive(vm)) {
+ if (openvzGetVEStatus(vm, &status, NULL) == -1)
+ goto cleanup;
+
+ if (status != VIR_DOMAIN_SHUTOFF) {
openvzError(VIR_ERR_OPERATION_INVALID, "%s",
_("cannot delete active domain"));
goto cleanup;
return -1;
}
+static int
+openvzGetVEStatus(virDomainObjPtr vm, int *status, int *reason)
+{
+ virCommandPtr cmd;
+ char *outbuf;
+ char *line;
+ int state;
+ int ret = -1;
+
+ cmd = virCommandNewArgList(VZLIST, vm->def->name, "-ostatus", "-H", NULL);
+ virCommandSetOutputBuffer(cmd, &outbuf);
+ if (virCommandRun(cmd, NULL) < 0)
+ goto cleanup;
+
+ if ((line = strchr(outbuf, '\n')) == NULL) {
+ openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Failed to parse vzlist output"));
+ goto cleanup;
+ }
+ *line++ = '\0';
+
+ state = virDomainObjGetState(vm, reason);
+
+ if (STREQ(outbuf, "running")) {
+ /* There is no way to detect whether a domain is paused or not
+ * with vzlist */
+ if (state == VIR_DOMAIN_PAUSED)
+ *status = state;
+ else
+ *status = VIR_DOMAIN_RUNNING;
+ } else {
+ *status = VIR_DOMAIN_SHUTOFF;
+ }
+
+ ret = 0;
+
+cleanup:
+ virCommandFree(cmd);
+ VIR_FREE(outbuf);
+ return ret;
+}
+
static virDriver openvzDriver = {
.no = VIR_DRV_OPENVZ,
.name = "OPENVZ",