On 1/18/19 10:41 AM, Roman Bogorodskiy wrote:
Implement support for passing custom command line arguments
to bhyve using the 'bhyve:commandline' element:
<bhyve:commandline>
<bhyve:arg value='-newarg'/>
</bhyve:commandline>
* Define virDomainXMLNamespace for the bhyve driver, which
at this point supports only the 'commandline' element
described above,
* Update command generation code to inject these command line
arguments between driver-generated arguments and the vmname
positional argument.
Signed-off-by: Roman Bogorodskiy <bogorodskiy(a)gmail.com>
---
docs/schemas/domaincommon.rng | 17 +++
src/bhyve/bhyve_command.c | 9 ++
src/bhyve/bhyve_conf.c | 15 +++
src/bhyve/bhyve_conf.h | 9 ++
src/bhyve/bhyve_domain.c | 107 +++++++++++++++++-
src/bhyve/bhyve_domain.h | 1 +
.../bhyvexml2argv-commandline.args | 9 ++
.../bhyvexml2argv-commandline.ldargs | 3 +
.../bhyvexml2argv-commandline.xml | 27 +++++
tests/bhyvexml2argvtest.c | 1 +
.../bhyvexml2xmlout-commandline.xml | 37 ++++++
tests/bhyvexml2xmltest.c | 1 +
12 files changed, 235 insertions(+), 1 deletion(-)
create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-commandline.args
create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-commandline.ldargs
create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-commandline.xml
create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-commandline.xml
[...]
diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c
index 60baa2e848..75709801c7 100644
--- a/src/bhyve/bhyve_conf.c
+++ b/src/bhyve/bhyve_conf.c
@@ -25,6 +25,7 @@
#include "virlog.h"
#include "virstring.h"
#include "bhyve_conf.h"
+#include "bhyve_domain.h"
#include "configmake.h"
#define VIR_FROM_THIS VIR_FROM_BHYVE
@@ -107,3 +108,17 @@ virBhyveDriverConfigDispose(void *obj)
VIR_FREE(cfg->firmwareDir);
}
+
+void bhyveDomainCmdlineDefFree(bhyveDomainCmdlineDefPtr def)
NIT: for current conventions...
void
bhyveDomainCmdlineDefFree(bhyveDomainCmdlineDefPtr def)
+{
+ size_t i;
+
+ if (!def)
+ return;
+
+ for (i = 0; i < def->num_args; i++)
+ VIR_FREE(def->args[i]);
+
+ VIR_FREE(def->args);
+ VIR_FREE(def);
+}
[...]
diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
index e54af75f4d..554188ebeb 100644
--- a/src/bhyve/bhyve_domain.c
+++ b/src/bhyve/bhyve_domain.c
[...]
+static int
+bhyveDomainDefNamespaceParse(xmlDocPtr xml ATTRIBUTE_UNUSED,
+ xmlNodePtr root ATTRIBUTE_UNUSED,
+ xmlXPathContextPtr ctxt,
+ void **data)
+{
+ bhyveDomainCmdlineDefPtr cmd = NULL;
+ bool uses_bhyve_ns = false;
+ xmlNodePtr *nodes = NULL;
+ int n;
+ size_t i;
Alternative:
int ret = -1;
+
+ if (xmlXPathRegisterNs(ctxt, BAD_CAST "bhyve", BAD_CAST
BHYVE_NAMESPACE_HREF) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Failed to register xml namespace '%s'"),
+ BHYVE_NAMESPACE_HREF);
+ return -1;
+ }
+
+ if (VIR_ALLOC(cmd) < 0)
+ return -1;
+
+ n = virXPathNodeSet("./bhyve:commandline/bhyve:arg", ctxt, &nodes);
+ if (n < 0)
+ goto error;
+ uses_bhyve_ns = n > 0;
Alternative:
if (n == 0)
ret = 0;
if (n <= 0)
goto cleanup;
+
+ if (n && VIR_ALLOC_N(cmd->args, n) < 0)
+ goto error;
Alternative "goto cleanup;"
+
+ for (i = 0; i < n; i++) {
+ cmd->args[cmd->num_args] = virXMLPropString(nodes[i], "value");
+ if (cmd->args[cmd->num_args] == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("No bhyve command-line argument
specified"));
+ goto error;
Alternative "goto cleanup;"
+ }
+ cmd->num_args++;
+ }
+
+ VIR_FREE(nodes);
+
+ if (uses_bhyve_ns)
+ *data = cmd;
+ else
+ VIR_FREE(cmd);
Alternative:
VIR_STEAL_PTR(*data, cmd);
ret = 0;
cleanup:
VIR_FREE(nodes);
bhyveDomainCmdlineDefFree(cmd);
return ret;
+
+ return 0;
+
+ error:
+ VIR_FREE(nodes);
+ bhyveDomainDefNamespaceFree(cmd);
+ return -1;
+}
+
[...]
diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-commandline.args
b/tests/bhyvexml2argvdata/bhyvexml2argv-commandline.args
new file mode 100644
index 0000000000..cb21b99cd6
--- /dev/null
+++ b/tests/bhyvexml2argvdata/bhyvexml2argv-commandline.args
@@ -0,0 +1,9 @@
+/usr/sbin/bhyve \
+-c 1 \
+-m 214 \
+-u \
+-H \
+-P \
+-s 0:0,hostbridge \
+-s 2:0,ahci,hd:/tmp/freebsd.img \
+-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 ARGUMENT1 ARGUMENT2 bhyve
From the not that matters but viewpoint:
-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \
ARGUMENT1 ARGUMENT2 bhyve
Reviewed-by: John Ferlan <jferlan(a)redhat.com>
John
[...]