[libvirt] [PATCH 1/3] bhyve: add domain metadata support

Implement domainSetMetadata and domainGetMetadata driver calls. --- src/bhyve/bhyve_driver.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 461a070..f268de4 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -793,6 +793,59 @@ bhyveDomainOpenConsole(virDomainPtr dom, } static int +bhyveDomainSetMetadata(virDomainPtr dom, + int type, + const char *metadata, + const char *key, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + int ret = -1; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (!(vm = bhyveDomObjFromDomain(dom))) + return -1; + + if (virDomainSetMetadataEnsureACL(dom->conn, vm->def, flags) < 0) + goto cleanup; + + ret = virDomainObjSetMetadata(vm, type, metadata, key, uri, privconn->caps, + privconn->xmlopt, BHYVE_CONFIG_DIR, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static char * +bhyveDomainGetMetadata(virDomainPtr dom, + int type, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + char *ret = NULL; + + if (!(vm = bhyveDomObjFromDomain(dom))) + return NULL; + + if (virDomainGetMetadataEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + ret = virDomainObjGetMetadata(vm, type, uri, privconn->caps, + privconn->xmlopt, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static int bhyveNodeGetCPUStats(virConnectPtr conn, int cpuNum, virNodeCPUStatsPtr params, @@ -1009,6 +1062,8 @@ static virDriver bhyveDriver = { .domainGetAutostart = bhyveDomainGetAutostart, /* 1.2.4 */ .domainSetAutostart = bhyveDomainSetAutostart, /* 1.2.4 */ .domainOpenConsole = bhyveDomainOpenConsole, /* 1.2.4 */ + .domainSetMetadata = bhyveDomainSetMetadata, /* 1.2.4 */ + .domainGetMetadata = bhyveDomainGetMetadata, /* 1.2.4 */ .nodeGetCPUStats = bhyveNodeGetCPUStats, /* 1.2.2 */ .nodeGetMemoryStats = bhyveNodeGetMemoryStats, /* 1.2.2 */ .nodeGetInfo = bhyveNodeGetInfo, /* 1.2.3 */ -- 1.9.0

In preparation of adding more tests for bhyve, move common bhyve utils to testutilsbhyve --- tests/Makefile.am | 6 ++++-- tests/bhyvexml2argvtest.c | 28 +--------------------------- tests/testutilsbhyve.c | 34 ++++++++++++++++++++++++++++++++++ tests/testutilsbhyve.h | 7 +++++++ 4 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 tests/testutilsbhyve.c create mode 100644 tests/testutilsbhyve.h diff --git a/tests/Makefile.am b/tests/Makefile.am index 6e15af8..dfa0851 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -630,10 +630,12 @@ bhyve_LDADDS = ../src/libvirt_driver_bhyve_impl.la bhyve_LDADDS += $(LDADDS) bhyvexml2argvtest_SOURCES = \ bhyvexml2argvtest.c \ - testutils.c testutils.h + testutils.c testutils.h \ + testutilsbhyve.c testutilsbhyve.h bhyvexml2argvtest_LDADD = $(bhyve_LDADDS) else ! WITH_BHYVE -EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c +EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c \ + testutilsbhyve.c testutilsbhyve.h endif ! WITH_BHYVE networkxml2xmltest_SOURCES = \ diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index b37fbb0..c55de10 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -8,38 +8,12 @@ # include "bhyve/bhyve_utils.h" # include "bhyve/bhyve_command.h" +# include "testutilsbhyve.h" # define VIR_FROM_THIS VIR_FROM_BHYVE static bhyveConn driver; -static virCapsPtr -testBhyveBuildCapabilities(void) -{ - virCapsPtr caps; - virCapsGuestPtr guest; - - if ((caps = virCapabilitiesNew(virArchFromHost(), - 0, 0)) == NULL) - return NULL; - - if ((guest = virCapabilitiesAddGuest(caps, "hvm", - VIR_ARCH_X86_64, - "bhyve", - NULL, 0, NULL)) == NULL) - goto error; - - if (virCapabilitiesAddGuestDomain(guest, - "bhyve", NULL, NULL, 0, NULL) == NULL) - goto error; - - return caps; - - error: - virObjectUnref(caps); - return NULL; -} - static int testCompareXMLToArgvFiles(const char *xml, const char *cmdline) { diff --git a/tests/testutilsbhyve.c b/tests/testutilsbhyve.c new file mode 100644 index 0000000..1032523 --- /dev/null +++ b/tests/testutilsbhyve.c @@ -0,0 +1,34 @@ +#include <config.h> + +#ifdef WITH_BHYVE + +# include "testutilsbhyve.h" + +virCapsPtr +testBhyveBuildCapabilities(void) +{ + virCapsPtr caps; + virCapsGuestPtr guest; + + if ((caps = virCapabilitiesNew(virArchFromHost(), + 0, 0)) == NULL) + return NULL; + + if ((guest = virCapabilitiesAddGuest(caps, "hvm", + VIR_ARCH_X86_64, + "bhyve", + NULL, 0, NULL)) == NULL) + goto error; + + if (virCapabilitiesAddGuestDomain(guest, + "bhyve", NULL, NULL, 0, NULL) == NULL) + goto error; + + return caps; + + error: + virObjectUnref(caps); + return NULL; +} + +#endif /* WITH_BHYVE */ diff --git a/tests/testutilsbhyve.h b/tests/testutilsbhyve.h new file mode 100644 index 0000000..0407205 --- /dev/null +++ b/tests/testutilsbhyve.h @@ -0,0 +1,7 @@ +#ifdef WITH_BHYVE + +# include "capabilities.h" + +virCapsPtr testBhyveBuildCapabilities(void); + +#endif /* WITH_BHYVE */ -- 1.9.0

On 06.04.2014 11:52, Roman Bogorodskiy wrote:
In preparation of adding more tests for bhyve, move common bhyve utils to testutilsbhyve --- tests/Makefile.am | 6 ++++-- tests/bhyvexml2argvtest.c | 28 +--------------------------- tests/testutilsbhyve.c | 34 ++++++++++++++++++++++++++++++++++ tests/testutilsbhyve.h | 7 +++++++ 4 files changed, 46 insertions(+), 29 deletions(-) create mode 100644 tests/testutilsbhyve.c create mode 100644 tests/testutilsbhyve.h
diff --git a/tests/Makefile.am b/tests/Makefile.am index 6e15af8..dfa0851 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -630,10 +630,12 @@ bhyve_LDADDS = ../src/libvirt_driver_bhyve_impl.la bhyve_LDADDS += $(LDADDS) bhyvexml2argvtest_SOURCES = \ bhyvexml2argvtest.c \ - testutils.c testutils.h + testutils.c testutils.h \ + testutilsbhyve.c testutilsbhyve.h bhyvexml2argvtest_LDADD = $(bhyve_LDADDS) else ! WITH_BHYVE -EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c +EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c \ + testutilsbhyve.c testutilsbhyve.h endif ! WITH_BHYVE
networkxml2xmltest_SOURCES = \ diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index b37fbb0..c55de10 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -8,38 +8,12 @@
# include "bhyve/bhyve_utils.h" # include "bhyve/bhyve_command.h" +# include "testutilsbhyve.h"
# define VIR_FROM_THIS VIR_FROM_BHYVE
static bhyveConn driver;
-static virCapsPtr -testBhyveBuildCapabilities(void) -{ - virCapsPtr caps; - virCapsGuestPtr guest; - - if ((caps = virCapabilitiesNew(virArchFromHost(), - 0, 0)) == NULL) - return NULL; - - if ((guest = virCapabilitiesAddGuest(caps, "hvm", - VIR_ARCH_X86_64, - "bhyve", - NULL, 0, NULL)) == NULL) - goto error; - - if (virCapabilitiesAddGuestDomain(guest, - "bhyve", NULL, NULL, 0, NULL) == NULL) - goto error; - - return caps; - - error: - virObjectUnref(caps); - return NULL; -} - static int testCompareXMLToArgvFiles(const char *xml, const char *cmdline) { diff --git a/tests/testutilsbhyve.c b/tests/testutilsbhyve.c new file mode 100644 index 0000000..1032523 --- /dev/null +++ b/tests/testutilsbhyve.c @@ -0,0 +1,34 @@ +#include <config.h> + +#ifdef WITH_BHYVE + +# include "testutilsbhyve.h" + +virCapsPtr +testBhyveBuildCapabilities(void) +{ + virCapsPtr caps; + virCapsGuestPtr guest; + + if ((caps = virCapabilitiesNew(virArchFromHost(), + 0, 0)) == NULL) + return NULL; + + if ((guest = virCapabilitiesAddGuest(caps, "hvm", + VIR_ARCH_X86_64, + "bhyve", + NULL, 0, NULL)) == NULL) + goto error; + + if (virCapabilitiesAddGuestDomain(guest, + "bhyve", NULL, NULL, 0, NULL) == NULL) + goto error; + + return caps; + + error: + virObjectUnref(caps); + return NULL; +}
This is the same function as virBhyveCapsBuild in src/bhyve/bhyve_capabilities.c. I think we don't need this one then. Michal

The only implemented test for now is domain metadata test. --- tests/Makefile.am | 11 +- tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml | 26 +++++ .../bhyvexml2xmlout-metadata.xml | 33 ++++++ tests/bhyvexml2xmltest.c | 120 +++++++++++++++++++++ 4 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml create mode 100644 tests/bhyvexml2xmltest.c diff --git a/tests/Makefile.am b/tests/Makefile.am index dfa0851..3163bf0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -65,6 +65,7 @@ LDADDS = \ EXTRA_DIST = \ bhyvexml2argvdata \ + bhyvexml2xmloutdata \ capabilityschemadata \ capabilityschematest \ commanddata \ @@ -235,7 +236,7 @@ test_programs += vmwarevertest endif WITH_VMWARE if WITH_BHYVE -test_programs += bhyvexml2argvtest +test_programs += bhyvexml2argvtest bhyvexml2xmltest endif WITH_BHYVE if WITH_CIL @@ -633,8 +634,14 @@ bhyvexml2argvtest_SOURCES = \ testutils.c testutils.h \ testutilsbhyve.c testutilsbhyve.h bhyvexml2argvtest_LDADD = $(bhyve_LDADDS) + +bhyvexml2xmltest_SOURCES = \ + bhyvexml2xmltest.c \ + testutils.c testutils.h \ + testutilsbhyve.c testutilsbhyve.h +bhyvexml2xmltest_LDADD = $(bhyve_LDADDS) else ! WITH_BHYVE -EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c \ +EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2xmltest.c bhyvexml2argvmock.c \ testutilsbhyve.c testutilsbhyve.h endif ! WITH_BHYVE diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml new file mode 100644 index 0000000..6436301 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml @@ -0,0 +1,26 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + </disk> + <interface type='bridge'> + <mac address='52:54:00:ad:55:51'/> + <model type='virtio'/> + <source bridge="virbr0"/> + </interface> + </devices> + <!-- intentional mis-indentation --> + <metadata> + <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> + <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar> + </metadata> +</domain> diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml new file mode 100644 index 0000000..77e18d4 --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml @@ -0,0 +1,33 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <metadata> + <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> + <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar> + </metadata> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <disk type='file' device='disk'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='sata' index='0'/> + <interface type='bridge'> + <mac address='52:54:00:ad:55:51'/> + <source bridge='virbr0'/> + <model type='virtio'/> + </interface> + </devices> +</domain> diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c new file mode 100644 index 0000000..5f9bc65 --- /dev/null +++ b/tests/bhyvexml2xmltest.c @@ -0,0 +1,120 @@ +#include <config.h> + +#include "testutils.h" + +#ifdef WITH_BHYVE + +# include "bhyve/bhyve_utils.h" +# include "testutilsbhyve.h" + +# define VIR_FROM_THIS VIR_FROM_NONE + +static bhyveConn driver; + +static int +testCompareXMLToXMLFiles(const char *inxml, const char *outxml) +{ + char *inXmlData = NULL; + char *outXmlData = NULL; + char *actual = NULL; + virDomainDefPtr def = NULL; + int ret = -1; + + if (virtTestLoadFile(inxml, &inXmlData) < 0) + goto fail; + + if (virtTestLoadFile(outxml, &outXmlData) < 0) + goto fail; + + if (!(def = virDomainDefParseString(inXmlData, driver.caps, driver.xmlopt, + 1 << VIR_DOMAIN_VIRT_BHYVE, + VIR_DOMAIN_XML_INACTIVE))) + goto fail; + + if (!(actual = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE))) + goto fail; + + if (STRNEQ(outXmlData, actual)) { + virtTestDifference(stderr, outXmlData, actual); + goto fail; + } + + ret = 0; + + fail: + VIR_FREE(inXmlData); + VIR_FREE(outXmlData); + VIR_FREE(actual); + virDomainDefFree(def); + return ret; +} + +struct testInfo { + const char *name; + bool different; +}; + +static int +testCompareXMLToXMLHelper(const void *data) +{ + const struct testInfo *info = data; + char *xml_in = NULL; + char *xml_out = NULL; + int ret = -1; + + if (virAsprintf(&xml_in, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.xml", + abs_srcdir, info->name) < 0 || + virAsprintf(&xml_out, "%s/bhyvexml2xmloutdata/bhyvexml2xmlout-%s.xml", + abs_srcdir, info->name) < 0) + goto cleanup; + + ret = testCompareXMLToXMLFiles(xml_in, + info->different ? xml_out : xml_in); + + cleanup: + VIR_FREE(xml_in); + VIR_FREE(xml_out); + return ret; +} + +static int +mymain(void) +{ + int ret = 0; + + if ((driver.caps = testBhyveBuildCapabilities()) == NULL) + return EXIT_FAILURE; + + if ((driver.xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)) == NULL) + return EXIT_FAILURE; + +# define DO_TEST_FULL(name, is_different) \ + do { \ + const struct testInfo info = {name, is_different}; \ + if (virtTestRun("BHYVE XML-2-XML " name, \ + testCompareXMLToXMLHelper, &info) < 0) \ + ret = -1; \ + } while (0) + +# define DO_TEST_DIFFERENT(name) \ + DO_TEST_FULL(name, true) + + DO_TEST_DIFFERENT("metadata"); + + virObjectUnref(driver.caps); + virObjectUnref(driver.xmlopt); + + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIRT_TEST_MAIN(mymain) + +#else + +int +main(void) +{ + return EXIT_AM_SKIP; +} + +#endif /* WITH_BHYVE */ -- 1.9.0

On 06.04.2014 11:52, Roman Bogorodskiy wrote:
The only implemented test for now is domain metadata test. --- tests/Makefile.am | 11 +- tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml | 26 +++++ .../bhyvexml2xmlout-metadata.xml | 33 ++++++ tests/bhyvexml2xmltest.c | 120 +++++++++++++++++++++ 4 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml create mode 100644 tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml create mode 100644 tests/bhyvexml2xmltest.c
diff --git a/tests/Makefile.am b/tests/Makefile.am index dfa0851..3163bf0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -65,6 +65,7 @@ LDADDS = \
EXTRA_DIST = \ bhyvexml2argvdata \ + bhyvexml2xmloutdata \ capabilityschemadata \ capabilityschematest \ commanddata \ @@ -235,7 +236,7 @@ test_programs += vmwarevertest endif WITH_VMWARE
if WITH_BHYVE -test_programs += bhyvexml2argvtest +test_programs += bhyvexml2argvtest bhyvexml2xmltest endif WITH_BHYVE
if WITH_CIL @@ -633,8 +634,14 @@ bhyvexml2argvtest_SOURCES = \ testutils.c testutils.h \ testutilsbhyve.c testutilsbhyve.h bhyvexml2argvtest_LDADD = $(bhyve_LDADDS) + +bhyvexml2xmltest_SOURCES = \ + bhyvexml2xmltest.c \ + testutils.c testutils.h \ + testutilsbhyve.c testutilsbhyve.h +bhyvexml2xmltest_LDADD = $(bhyve_LDADDS) else ! WITH_BHYVE -EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2argvmock.c \ +EXTRA_DIST += bhyvexml2argvtest.c bhyvexml2xmltest.c bhyvexml2argvmock.c \ testutilsbhyve.c testutilsbhyve.h endif ! WITH_BHYVE
diff --git a/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml b/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml new file mode 100644 index 0000000..6436301 --- /dev/null +++ b/tests/bhyvexml2argvdata/bhyvexml2argv-metadata.xml @@ -0,0 +1,26 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + </disk> + <interface type='bridge'> + <mac address='52:54:00:ad:55:51'/> + <model type='virtio'/> + <source bridge="virbr0"/> + </interface> + </devices> + <!-- intentional mis-indentation --> + <metadata> + <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> + <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar> + </metadata> +</domain> diff --git a/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml new file mode 100644 index 0000000..77e18d4 --- /dev/null +++ b/tests/bhyvexml2xmloutdata/bhyvexml2xmlout-metadata.xml @@ -0,0 +1,33 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <metadata> + <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo> + <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar> + </metadata> + <memory unit='KiB'>219136</memory> + <currentMemory unit='KiB'>219136</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <disk type='file' device='disk'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='sata' index='0'/> + <interface type='bridge'> + <mac address='52:54:00:ad:55:51'/> + <source bridge='virbr0'/> + <model type='virtio'/> + </interface> + </devices> +</domain> diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c new file mode 100644 index 0000000..5f9bc65 --- /dev/null +++ b/tests/bhyvexml2xmltest.c @@ -0,0 +1,120 @@ +#include <config.h> + +#include "testutils.h" + +#ifdef WITH_BHYVE + +# include "bhyve/bhyve_utils.h" +# include "testutilsbhyve.h" + +# define VIR_FROM_THIS VIR_FROM_NONE + +static bhyveConn driver; + +static int +testCompareXMLToXMLFiles(const char *inxml, const char *outxml) +{ + char *inXmlData = NULL; + char *outXmlData = NULL; + char *actual = NULL; + virDomainDefPtr def = NULL; + int ret = -1; + + if (virtTestLoadFile(inxml, &inXmlData) < 0) + goto fail; + + if (virtTestLoadFile(outxml, &outXmlData) < 0) + goto fail; + + if (!(def = virDomainDefParseString(inXmlData, driver.caps, driver.xmlopt, + 1 << VIR_DOMAIN_VIRT_BHYVE, + VIR_DOMAIN_XML_INACTIVE))) + goto fail; + + if (!(actual = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE))) + goto fail; + + if (STRNEQ(outXmlData, actual)) { + virtTestDifference(stderr, outXmlData, actual); + goto fail; + } + + ret = 0; + + fail: + VIR_FREE(inXmlData); + VIR_FREE(outXmlData); + VIR_FREE(actual); + virDomainDefFree(def); + return ret; +} + +struct testInfo { + const char *name; + bool different; +}; + +static int +testCompareXMLToXMLHelper(const void *data) +{ + const struct testInfo *info = data; + char *xml_in = NULL; + char *xml_out = NULL; + int ret = -1; + + if (virAsprintf(&xml_in, "%s/bhyvexml2argvdata/bhyvexml2argv-%s.xml", + abs_srcdir, info->name) < 0 || + virAsprintf(&xml_out, "%s/bhyvexml2xmloutdata/bhyvexml2xmlout-%s.xml", + abs_srcdir, info->name) < 0) + goto cleanup; + + ret = testCompareXMLToXMLFiles(xml_in, + info->different ? xml_out : xml_in); + + cleanup: + VIR_FREE(xml_in); + VIR_FREE(xml_out); + return ret; +} + +static int +mymain(void) +{ + int ret = 0; + + if ((driver.caps = testBhyveBuildCapabilities()) == NULL)
Since I suggest dropping 2/3, this needs to be virBhyveCapsBuild() then.
+ return EXIT_FAILURE; + + if ((driver.xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)) == NULL) + return EXIT_FAILURE; + +# define DO_TEST_FULL(name, is_different) \ + do { \ + const struct testInfo info = {name, is_different}; \ + if (virtTestRun("BHYVE XML-2-XML " name, \ + testCompareXMLToXMLHelper, &info) < 0) \ + ret = -1; \ + } while (0) + +# define DO_TEST_DIFFERENT(name) \ + DO_TEST_FULL(name, true) + + DO_TEST_DIFFERENT("metadata"); + + virObjectUnref(driver.caps); + virObjectUnref(driver.xmlopt); + + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIRT_TEST_MAIN(mymain) + +#else + +int +main(void) +{ + return EXIT_AM_SKIP; +} + +#endif /* WITH_BHYVE */
ACK Michal

On 06.04.2014 11:52, Roman Bogorodskiy wrote:
Implement domainSetMetadata and domainGetMetadata driver calls. --- src/bhyve/bhyve_driver.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 461a070..f268de4 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -793,6 +793,59 @@ bhyveDomainOpenConsole(virDomainPtr dom, }
static int +bhyveDomainSetMetadata(virDomainPtr dom, + int type, + const char *metadata, + const char *key, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + int ret = -1; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (!(vm = bhyveDomObjFromDomain(dom))) + return -1; + + if (virDomainSetMetadataEnsureACL(dom->conn, vm->def, flags) < 0) + goto cleanup; + + ret = virDomainObjSetMetadata(vm, type, metadata, key, uri, privconn->caps, + privconn->xmlopt, BHYVE_CONFIG_DIR, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static char * +bhyveDomainGetMetadata(virDomainPtr dom, + int type, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + char *ret = NULL; + + if (!(vm = bhyveDomObjFromDomain(dom))) + return NULL; + + if (virDomainGetMetadataEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + ret = virDomainObjGetMetadata(vm, type, uri, privconn->caps, + privconn->xmlopt, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static int bhyveNodeGetCPUStats(virConnectPtr conn, int cpuNum, virNodeCPUStatsPtr params, @@ -1009,6 +1062,8 @@ static virDriver bhyveDriver = { .domainGetAutostart = bhyveDomainGetAutostart, /* 1.2.4 */ .domainSetAutostart = bhyveDomainSetAutostart, /* 1.2.4 */ .domainOpenConsole = bhyveDomainOpenConsole, /* 1.2.4 */ + .domainSetMetadata = bhyveDomainSetMetadata, /* 1.2.4 */ + .domainGetMetadata = bhyveDomainGetMetadata, /* 1.2.4 */ .nodeGetCPUStats = bhyveNodeGetCPUStats, /* 1.2.2 */ .nodeGetMemoryStats = bhyveNodeGetMemoryStats, /* 1.2.2 */ .nodeGetInfo = bhyveNodeGetInfo, /* 1.2.3 */
Now that I've pushed Wojciech's patches, we shouldn't be accessing privconn->caps directly. ACK if you do the obvious change. Michal

Michal Privoznik wrote:
On 06.04.2014 11:52, Roman Bogorodskiy wrote:
Implement domainSetMetadata and domainGetMetadata driver calls. --- src/bhyve/bhyve_driver.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+)
diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 461a070..f268de4 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -793,6 +793,59 @@ bhyveDomainOpenConsole(virDomainPtr dom, }
static int +bhyveDomainSetMetadata(virDomainPtr dom, + int type, + const char *metadata, + const char *key, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + int ret = -1; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG, -1); + + if (!(vm = bhyveDomObjFromDomain(dom))) + return -1; + + if (virDomainSetMetadataEnsureACL(dom->conn, vm->def, flags) < 0) + goto cleanup; + + ret = virDomainObjSetMetadata(vm, type, metadata, key, uri, privconn->caps, + privconn->xmlopt, BHYVE_CONFIG_DIR, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static char * +bhyveDomainGetMetadata(virDomainPtr dom, + int type, + const char *uri, + unsigned int flags) +{ + bhyveConnPtr privconn = dom->conn->privateData; + virDomainObjPtr vm; + char *ret = NULL; + + if (!(vm = bhyveDomObjFromDomain(dom))) + return NULL; + + if (virDomainGetMetadataEnsureACL(dom->conn, vm->def) < 0) + goto cleanup; + + ret = virDomainObjGetMetadata(vm, type, uri, privconn->caps, + privconn->xmlopt, flags); + + cleanup: + virObjectUnlock(vm); + return ret; +} + +static int bhyveNodeGetCPUStats(virConnectPtr conn, int cpuNum, virNodeCPUStatsPtr params, @@ -1009,6 +1062,8 @@ static virDriver bhyveDriver = { .domainGetAutostart = bhyveDomainGetAutostart, /* 1.2.4 */ .domainSetAutostart = bhyveDomainSetAutostart, /* 1.2.4 */ .domainOpenConsole = bhyveDomainOpenConsole, /* 1.2.4 */ + .domainSetMetadata = bhyveDomainSetMetadata, /* 1.2.4 */ + .domainGetMetadata = bhyveDomainGetMetadata, /* 1.2.4 */ .nodeGetCPUStats = bhyveNodeGetCPUStats, /* 1.2.2 */ .nodeGetMemoryStats = bhyveNodeGetMemoryStats, /* 1.2.2 */ .nodeGetInfo = bhyveNodeGetInfo, /* 1.2.3 */
Now that I've pushed Wojciech's patches, we shouldn't be accessing privconn->caps directly.
ACK if you do the obvious change.
Pushed with that fix. Also, dropped 2/2 and pushed 3/3 with using virBhyveCapsBuild(). Thanks for the review! Roman Bogorodskiy
participants (2)
-
Michal Privoznik
-
Roman Bogorodskiy