Patch improve code which execute external OpenVZ tools.
? src/test.xml
Index: src/openvz_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/openvz_driver.c,v
retrieving revision 1.28
diff -u -p -r1.28 openvz_driver.c
--- src/openvz_driver.c 11 Jul 2008 11:09:44 -0000 1.28
+++ src/openvz_driver.c 11 Jul 2008 15:50:22 -0000
@@ -125,6 +125,61 @@ static void cmdExecFree(char *cmdExec[])
}
}
+/* generate arguments to create OpenVZ container
+ return -1 - error
+ 0 - OK
+*/
+static int openvzDomainDefineCmd(const char *args[], int maxarg, struct openvz_vm_def *vmdef)
+{
+ int narg;
+
+ if (vmdef == NULL)
+ return -1;
+
+ for (narg = 0; narg < maxarg; narg++)
+ args[narg] = NULL;
+
+ narg = 0;
+ if (narg + 4 < maxarg) {
+ args[narg++] = VZCTL;
+ args[narg++] = "--quiet";
+ args[narg++] = "create";
+ args[narg++] = vmdef->name;
+ } else
+ return -1;
+
+ if ((vmdef->fs.tmpl && *(vmdef->fs.tmpl))) {
+ if (narg + 2 >= maxarg)
+ return -1;
+ args[narg++] = "--ostemplate";
+ args[narg++] = vmdef->fs.tmpl;
+ }
+ if ((vmdef->profile && *(vmdef->profile))) {
+ if (narg + 2 >= maxarg)
+ return -1;
+ args[narg++] = "--config";
+ args[narg++] = vmdef->profile;
+ }
+ if ((vmdef->net.ips->ip && *(vmdef->net.ips->ip))) {
+ if (narg + 2 >= maxarg)
+ return -1;
+ args[narg++] = "--ipadd";
+ args[narg++] = vmdef->net.ips->ip;
+ }
+ if ((vmdef->net.hostname && *(vmdef->net.hostname))) {
+ if (narg + 2 >= maxarg)
+ return -1;
+ args[narg++] = "--hostname";
+ args[narg++] = vmdef->net.hostname;
+ }
+
+ if (args[maxarg-1] != NULL) //for sure
+ return -1;
+
+ return 0;
+}
+
+
static virDomainPtr openvzDomainLookupByID(virConnectPtr conn,
int id) {
struct openvz_driver *driver = (struct openvz_driver *)conn->privateData;
@@ -217,12 +272,9 @@ static int openvzDomainGetInfo(virDomain
}
static int openvzDomainShutdown(virDomainPtr dom) {
- char cmdbuf[CMDBUF_LEN];
- int ret;
- char *cmdExec[OPENVZ_MAX_ARG];
- int pid, outfd, errfd;
struct openvz_driver *driver = (struct openvz_driver *)dom->conn->privateData;
struct openvz_vm *vm = openvzFindVMByID(driver, dom->id);
+ const char *prog[] = {VZCTL, "--quiet", "stop", vm->vmdef->name, NULL};
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
@@ -235,16 +287,8 @@ static int openvzDomainShutdown(virDomai
_("domain is not in running state"));
return -1;
}
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " stop %d ", dom->id);
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out;
- }
-
- ret = virExec(dom->conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(dom->conn, (char **)prog, NULL) < 0) {
openvzError(dom->conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return -1;
@@ -255,20 +299,14 @@ static int openvzDomainShutdown(virDomai
ovz_driver.num_inactive ++;
ovz_driver.num_active --;
-bail_out:
- cmdExecFree(cmdExec);
-
- return ret;
+ return 0;
}
static int openvzDomainReboot(virDomainPtr dom,
unsigned int flags ATTRIBUTE_UNUSED) {
- char cmdbuf[CMDBUF_LEN];
- int ret;
- char *cmdExec[OPENVZ_MAX_ARG];
- int pid, outfd, errfd;
struct openvz_driver *driver = (struct openvz_driver *)dom->conn->privateData;
struct openvz_vm *vm = openvzFindVMByID(driver, dom->id);
+ const char *prog[] = {VZCTL, "--quiet", "restart", vm->vmdef->name, NULL};
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
@@ -281,24 +319,14 @@ static int openvzDomainReboot(virDomainP
_("domain is not in running state"));
return -1;
}
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " restart %d ", dom->id);
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out1;
- }
- ret = virExec(dom->conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(dom->conn, (char **)prog, NULL) < 0) {
openvzError(dom->conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return -1;
}
-bail_out1:
- cmdExecFree(cmdExec);
-
- return ret;
+ return 0;
}
static virDomainPtr
@@ -308,63 +336,39 @@ openvzDomainDefineXML(virConnectPtr conn
struct openvz_vm_def *vmdef = NULL;
struct openvz_vm *vm = NULL;
virDomainPtr dom;
- char cmdbuf[CMDBUF_LEN], cmdOption[CMDOP_LEN], *cmdExec[OPENVZ_MAX_ARG];
- int ret, pid, outfd, errfd;
+ const char *prog[OPENVZ_MAX_ARG];
- if (!(vmdef = openvzParseVMDef(conn, xml, NULL)))
- goto bail_out2;
+
+ if ((vmdef = openvzParseVMDef(conn, xml, NULL)) == NULL)
+ return NULL;
vm = openvzFindVMByID(driver, strtoI(vmdef->name));
if (vm) {
openvzLog(OPENVZ_ERR, _("Already an OPENVZ VM active with the id '%s'"),
vmdef->name);
- goto bail_out2;
+ return NULL;
}
if (!(vm = openvzAssignVMDef(conn, driver, vmdef))) {
openvzFreeVMDef(vmdef);
openvzLog(OPENVZ_ERR, "%s", _("Error creating OPENVZ VM"));
}
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " create %s", vmdef->name);
- if ((vmdef->fs.tmpl && *(vmdef->fs.tmpl))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --ostemplate %s", vmdef->fs.tmpl);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->profile && *(vmdef->profile))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --config %s", vmdef->profile);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->net.ips->ip && *(vmdef->net.ips->ip))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --ipadd %s", vmdef->net.ips->ip);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->net.hostname && *(vmdef->net.hostname))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --hostname %s", vmdef->net.hostname);
- strcat(cmdbuf, cmdOption);
+ if (openvzDomainDefineCmd(prog, OPENVZ_MAX_ARG, vmdef) < 0) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Error creating command for container"));
+ return NULL;
}
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out2;
- }
- ret = virExec(conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(conn, (char **)prog, NULL) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
- goto bail_out2;
+ return NULL;
}
- waitpid(pid, NULL, 0);
- cmdExecFree(cmdExec);
-
dom = virGetDomain(conn, vm->vmdef->name, vm->vmdef->uuid);
if (dom)
dom->id = vm->vpsid;
return dom;
-bail_out2:
- cmdExecFree(cmdExec);
- return NULL;
}
static virDomainPtr
@@ -375,8 +379,8 @@ openvzDomainCreateLinux(virConnectPtr co
struct openvz_vm *vm = NULL;
virDomainPtr dom;
struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
- char cmdbuf[CMDBUF_LEN], cmdOption[CMDOP_LEN], *cmdExec[OPENVZ_MAX_ARG];
- int ret, pid, outfd, errfd;
+ const char *progcreate[OPENVZ_MAX_ARG];
+ const char *progstart[] = {VZCTL, "--quiet", "start", NULL, NULL};
if (!(vmdef = openvzParseVMDef(conn, xml, NULL)))
return NULL;
@@ -394,48 +398,21 @@ openvzDomainCreateLinux(virConnectPtr co
return NULL;
}
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " create %s", vmdef->name);
- if ((vmdef->fs.tmpl && *(vmdef->fs.tmpl))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --ostemplate %s", vmdef->fs.tmpl);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->profile && *(vmdef->profile))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --config %s", vmdef->profile);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->net.ips->ip && *(vmdef->net.ips->ip))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --ipadd %s", vmdef->net.ips->ip);
- strcat(cmdbuf, cmdOption);
- }
- if ((vmdef->net.hostname && *(vmdef->net.hostname))) {
- snprintf(cmdOption, CMDOP_LEN - 1, " --hostname %s", vmdef->net.hostname);
- strcat(cmdbuf, cmdOption);
+ if (openvzDomainDefineCmd(progcreate, OPENVZ_MAX_ARG, vmdef) < 0) {
+ openvzError(conn, VIR_ERR_INTERNAL_ERROR,
+ _("Error creating command for container"));
+ return NULL;
}
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out3;
- }
- ret = virExec(conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(conn, (char **)progcreate, NULL) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return NULL;
}
- waitpid(pid, NULL, 0);
- cmdExecFree(cmdExec);
-
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " start %s ", vmdef->name);
+ progstart[3] = vmdef->name;
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out3;
- }
- ret = virExec(conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(conn, (char **)progstart, NULL) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return NULL;
@@ -446,28 +423,18 @@ openvzDomainCreateLinux(virConnectPtr co
ovz_driver.num_inactive--;
ovz_driver.num_active++;
- waitpid(pid, NULL, 0);
- cmdExecFree(cmdExec);
-
dom = virGetDomain(conn, vm->vmdef->name, vm->vmdef->uuid);
if (dom)
dom->id = vm->vpsid;
return dom;
-bail_out3:
- cmdExecFree(cmdExec);
- return NULL;
}
static int
openvzDomainCreate(virDomainPtr dom)
{
- char cmdbuf[CMDBUF_LEN];
- int ret;
- char *cmdExec[OPENVZ_MAX_ARG] ;
- int pid, outfd, errfd;
struct openvz_driver *driver = (struct openvz_driver *)dom->conn->privateData;
struct openvz_vm *vm = openvzFindVMByName(driver, dom->name);
- struct openvz_vm_def *vmdef;
+ const char *prog[] = {VZCTL, "--quiet", "start", vm->vmdef->name, NULL };
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
@@ -481,41 +448,27 @@ openvzDomainCreate(virDomainPtr dom)
return -1;
}
- vmdef = vm->vmdef;
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " start %s ", vmdef->name);
-
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out4;
- }
- ret = virExec(dom->conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(dom->conn, (char **)prog, NULL) < 0) {
openvzError(dom->conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return -1;
}
- sscanf(vmdef->name, "%d", &vm->vpsid);
+ sscanf(vm->vmdef->name, "%d", &vm->vpsid);
vm->status = VIR_DOMAIN_RUNNING;
ovz_driver.num_inactive --;
ovz_driver.num_active ++;
- waitpid(pid, NULL, 0);
-bail_out4:
- cmdExecFree(cmdExec);
-
- return ret;
+ return 0;
}
static int
openvzDomainUndefine(virDomainPtr dom)
{
- char cmdbuf[CMDBUF_LEN], *cmdExec[OPENVZ_MAX_ARG];
- int ret, pid, outfd, errfd;
virConnectPtr conn= dom->conn;
struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
struct openvz_vm *vm = openvzFindVMByUUID(driver, dom->uuid);
+ const char *prog[] = { VZCTL, "--quiet", "destroy", vm->vmdef->name, NULL };
if (!vm) {
openvzError(conn, VIR_ERR_INVALID_DOMAIN, _("no domain with matching uuid"));
@@ -526,25 +479,15 @@ openvzDomainUndefine(virDomainPtr dom)
openvzError(conn, VIR_ERR_INTERNAL_ERROR, _("cannot delete active domain"));
return -1;
}
- snprintf(cmdbuf, CMDBUF_LEN - 1, VZCTL " destroy %s ", vm->vmdef->name);
- if((ret = convCmdbufExec(cmdbuf, cmdExec)) == -1)
- {
- openvzLog(OPENVZ_ERR, "%s", _("Error in parsing Options to OPENVZ"));
- goto bail_out5;
- }
- ret = virExec(conn, (char **)cmdExec, &pid, -1, &outfd, &errfd);
- if(ret == -1) {
+ if (virRun(conn, (char **)prog, NULL) < 0) {
openvzError(conn, VIR_ERR_INTERNAL_ERROR,
_("Could not exec %s"), VZCTL);
return -1;
}
- waitpid(pid, NULL, 0);
openvzRemoveInactiveVM(driver, vm);
-bail_out5:
- cmdExecFree(cmdExec);
- return ret;
+ return 0;
}
static int
@@ -553,7 +496,7 @@ openvzDomainSetAutostart(virDomainPtr do
virConnectPtr conn= dom->conn;
struct openvz_driver *driver = (struct openvz_driver *) conn->privateData;
struct openvz_vm *vm = openvzFindVMByUUID(driver, dom->uuid);
- const char *prog[] = { VZCTL, "set", vm->vmdef->name,
+ const char *prog[] = { VZCTL, "--quiet", "set", vm->vmdef->name,
"--onboot", autostart ? "yes" : "no",
"--save", NULL };
--
Libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list