Convert openvzLocateConfFile to a replaceable callback to allow
testing the config file parsing without rewriting the whole OpenVZ
config parsing to a more testable structure.
Also ignore the openvzutilstest binary.
---
src/openvz/openvz_conf.c | 28 +++++++++++----
src/openvz/openvz_conf.h | 6 +++
tests/.gitignore | 1 +
tests/openvzutilstest.c | 78 ++++++++++++++++++++++++++++++++++++++++++++
tests/openvzutilstest.conf | 1 +
5 files changed, 106 insertions(+), 8 deletions(-)
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 6e32242..bba4e6f 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -60,6 +60,9 @@ static char *openvzLocateConfDir(void);
static int openvzGetVPSUUID(int vpsid, char *uuidstr, size_t len);
static int openvzLocateConfFile(int vpsid, char **conffile, const char *ext);
static int openvzAssignUUIDs(void);
+static int openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext);
+
+openvzLocateConfFileFunc openvzLocateConfFileCallback = openvzLocateConfFileDefault;
int
strtoI(const char *str)
@@ -171,7 +174,7 @@ no_memory:
}
-static int
+int
openvzReadNetworkConf(virDomainDefPtr def,
int veid) {
int ret;
@@ -473,6 +476,8 @@ int openvzLoadDomains(struct openvz_driver *driver) {
if (VIR_ALLOC(dom->def) < 0)
goto no_memory;
+ dom->def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
+
if (STREQ(status, "stopped")) {
virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_UNKNOWN);
@@ -793,12 +798,9 @@ cleanup:
return ret;
}
-/* Locate config file of container
-* return -1 - error
-* 0 - OK
-*/
+
static int
-openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
+openvzLocateConfFileDefault(int vpsid, char **conffile, const char *ext)
{
char * confdir;
int ret = 0;
@@ -817,8 +819,18 @@ openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
return ret;
}
-static char
-*openvzLocateConfDir(void)
+/* Locate config file of container
+ * return -1 - error
+ * 0 - OK
+ */
+static int
+openvzLocateConfFile(int vpsid, char **conffile, const char *ext)
+{
+ return openvzLocateConfFileCallback(vpsid, conffile, ext);
+}
+
+static char *
+openvzLocateConfDir(void)
{
const char *conf_dir_list[] = {"/etc/vz/conf",
"/usr/local/etc/conf", NULL};
int i=0;
diff --git a/src/openvz/openvz_conf.h b/src/openvz/openvz_conf.h
index d5a57a6..182ebae 100644
--- a/src/openvz/openvz_conf.h
+++ b/src/openvz/openvz_conf.h
@@ -53,6 +53,11 @@ struct openvz_driver {
int version;
};
+typedef int (*openvzLocateConfFileFunc)(int vpsid, char **conffile, const char *ext);
+
+/* this allows the testsuite to replace the conf file locator function */
+extern openvzLocateConfFileFunc openvzLocateConfFileCallback;
+
int openvz_readline(int fd, char *ptr, int maxlen);
int openvzExtractVersion(struct openvz_driver *driver);
int openvzReadVPSConfigParam(int vpsid, const char *param, char **value);
@@ -66,5 +71,6 @@ int strtoI(const char *str);
int openvzSetDefinedUUID(int vpsid, unsigned char *uuid);
unsigned int openvzGetNodeCPUs(void);
int openvzGetVEID(const char *name);
+int openvzReadNetworkConf(virDomainDefPtr def, int veid);
#endif /* OPENVZ_CONF_H */
diff --git a/tests/.gitignore b/tests/.gitignore
index e3906f0..749b5b9 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -16,6 +16,7 @@ object-locking
object-locking-files.txt
object-locking.cmi
object-locking.cmx
+openvzutilstest
qemuargv2xmltest
qemuhelptest
qemuxml2argvtest
diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c
index fe6a2ea..567131a 100644
--- a/tests/openvzutilstest.c
+++ b/tests/openvzutilstest.c
@@ -12,6 +12,13 @@
# include "util.h"
# include "openvz/openvz_conf.h"
+static int
+testLocateConfFile(int vpsid ATTRIBUTE_UNUSED, char **conffile,
+ const char *ext ATTRIBUTE_UNUSED)
+{
+ return virAsprintf(conffile, "%s/openvzutilstest.conf", abs_srcdir);
+}
+
struct testConfigParam {
const char *param;
const char *value;
@@ -62,10 +69,80 @@ cleanup:
}
static int
+testReadNetworkConf(const void *data ATTRIBUTE_UNUSED)
+{
+ int result = -1;
+ virDomainDefPtr def = NULL;
+ char *actual = NULL;
+ virErrorPtr err = NULL;
+ const char *expected =
+ "<domain type='openvz'>\n"
+ " <uuid>00000000-0000-0000-0000-000000000000</uuid>\n"
+ " <memory>0</memory>\n"
+ " <currentMemory>0</currentMemory>\n"
+ " <vcpu>0</vcpu>\n"
+ " <os>\n"
+ " <type>exe</type>\n"
+ " <init>/sbin/init</init>\n"
+ " </os>\n"
+ " <clock offset='utc'/>\n"
+ " <on_poweroff>destroy</on_poweroff>\n"
+ " <on_reboot>destroy</on_reboot>\n"
+ " <on_crash>destroy</on_crash>\n"
+ " <devices>\n"
+ " <interface type='ethernet'>\n"
+ " <mac address='00:00:00:00:00:00'/>\n"
+ " <ip address='194.44.18.88'/>\n"
+ " </interface>\n"
+ " <interface type='bridge'>\n"
+ " <mac address='00:18:51:c1:05:ee'/>\n"
+ " <target dev='veth105.10'/>\n"
+ " </interface>\n"
+ " </devices>\n"
+ "</domain>\n";
+
+ if (VIR_ALLOC(def) < 0 ||
+ !(def->os.type = strdup("exe")) ||
+ !(def->os.init = strdup("/sbin/init")))
+ goto cleanup;
+
+ def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
+
+ if (openvzReadNetworkConf(def, 1) < 0) {
+ err = virGetLastError();
+ fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message :
"<unknown>");
+ goto cleanup;
+ }
+
+ actual = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
+
+ if (actual == NULL) {
+ err = virGetLastError();
+ fprintf(stderr, "ERROR: %s\n", err != NULL ? err->message :
"<unknown>");
+ goto cleanup;
+ }
+
+ if (STRNEQ(expected, actual)) {
+ virtTestDifference(stderr, expected, actual);
+ goto cleanup;
+ }
+
+ result = 0;
+
+cleanup:
+ VIR_FREE(actual);
+ virDomainDefFree(def);
+
+ return result;
+}
+
+static int
mymain(void)
{
int result = 0;
+ openvzLocateConfFileCallback = testLocateConfFile;
+
# define DO_TEST(_name) \
do { \
if (virtTestRun("OpenVZ "#_name, 1, test##_name,
\
@@ -75,6 +152,7 @@ mymain(void)
} while (0)
DO_TEST(ReadConfigParam);
+ DO_TEST(ReadNetworkConf);
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
diff --git a/tests/openvzutilstest.conf b/tests/openvzutilstest.conf
index a1b93b7..c5d048c 100644
--- a/tests/openvzutilstest.conf
+++ b/tests/openvzutilstest.conf
@@ -39,3 +39,4 @@ QUOTATIME=""
DISK_QUOTA=no
OSTEMPLATE="rhel-5-lystor"
IP_ADDRESS="194.44.18.88"
+NETIF="ifname=eth10,mac=00:18:51:C1:05:EE,host_ifname=veth105.10,host_mac=00:18:51:8F:D9:F3
--
1.7.0.4