]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Added new option to virsh net-dumpxml called --inactive
authorShradha Shah <sshah@solarflare.com>
Wed, 14 Dec 2011 10:50:40 +0000 (10:50 +0000)
committerEric Blake <eblake@redhat.com>
Wed, 11 Jan 2012 20:15:09 +0000 (13:15 -0700)
The above option helps to differentiate between implicit and explicit
interface pools.

include/libvirt/libvirt.h.in
src/conf/network_conf.c
src/conf/network_conf.h
src/libvirt.c
src/network/bridge_driver.c
src/test/test_driver.c
src/vbox/vbox_tmpl.c
tests/networkxml2xmltest.c
tools/virsh.c
tools/virsh.pod

index 0b564cf8f9db7ee969eb9022647d27d818311141..e436f3c5338ca2408f8de7538765d3350e6b43a6 100644 (file)
@@ -1882,6 +1882,10 @@ int                      virNodeGetCellsFreeMemory(virConnectPtr conn,
  * Virtual Networks API
  */
 
+typedef enum {
+    VIR_NETWORK_XML_INACTIVE = (1 << 0), /* dump inactive network information */
+} virNetworkXMLFlags;
+
 /**
  * virNetwork:
  *
index c3c70052d4a996a2f1c99efcf30773c409721f5d..c03ceafce18c7cdee5bd70f11b90829148fa8f2d 100644 (file)
@@ -1448,7 +1448,7 @@ virPortGroupDefFormat(virBufferPtr buf,
     return 0;
 }
 
-char *virNetworkDefFormat(const virNetworkDefPtr def)
+char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     unsigned char *uuid;
@@ -1484,7 +1484,8 @@ char *virNetworkDefFormat(const virNetworkDefPtr def)
             virBufferEscapeString(&buf, "    <pf dev='%s'/>\n",
                                   def->forwardPfs[0].dev);
 
-        if (def->nForwardIfs) {
+        if (def->nForwardIfs &&
+            (!def->nForwardPfs || !(flags & VIR_NETWORK_XML_INACTIVE))) {
             for (ii = 0; ii < def->nForwardIfs; ii++) {
                 virBufferEscapeString(&buf, "    <interface dev='%s'/>\n",
                                       def->forwardIfs[ii].dev);
@@ -1601,7 +1602,7 @@ int virNetworkSaveConfig(const char *configDir,
     int ret = -1;
     char *xml;
 
-    if (!(xml = virNetworkDefFormat(def)))
+    if (!(xml = virNetworkDefFormat(def, 0)))
         goto cleanup;
 
     if (virNetworkSaveXML(configDir, def, xml))
index 0bcd3bf4694e12ae769bd89900c3447e50fbc479..5cb396c424cafd6c7f0d6cdb0886a6f048813cca 100644 (file)
@@ -227,7 +227,7 @@ virNetworkDefPtr virNetworkDefParseFile(const char *filename);
 virNetworkDefPtr virNetworkDefParseNode(xmlDocPtr xml,
                                         xmlNodePtr root);
 
-char *virNetworkDefFormat(const virNetworkDefPtr def);
+char *virNetworkDefFormat(const virNetworkDefPtr def, unsigned int flags);
 
 static inline const char *
 virNetworkDefForwardIf(const virNetworkDefPtr def, size_t n)
index dbf02963caa3fe9f46c47ad4c37bde7e16fbd02d..a540424837800762d5232ce0cbcadd45b23dbb25 100644 (file)
@@ -9835,11 +9835,16 @@ error:
 /**
  * virNetworkGetXMLDesc:
  * @network: a network object
- * @flags: extra flags; not used yet, so callers should always pass 0
+ * @flags: bitwise-OR of virNetworkXMLFlags
  *
  * Provide an XML description of the network. The description may be reused
  * later to relaunch the network with virNetworkCreateXML().
  *
+ * Normally, if a network included a physical function, the output includes
+ * all virtual functions tied to that physical interface.  If @flags includes
+ * VIR_NETWORK_XML_INACTIVE, then the expansion of virtual interfaces is
+ * not performed.
+ *
  * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
  *         the caller must free() the returned value.
  */
index 91ef229dbe4a4dabd8dd5b6a3fb49e92887caf37..5d0d52874018b9337a194bca7ee3258c1d7bf7f2 100644 (file)
@@ -2533,7 +2533,7 @@ static char *networkGetXMLDesc(virNetworkPtr net,
     virNetworkObjPtr network;
     char *ret = NULL;
 
-    virCheckFlags(0, NULL);
+    virCheckFlags(VIR_NETWORK_XML_INACTIVE, NULL);
 
     networkDriverLock(driver);
     network = virNetworkFindByUUID(&driver->networks, net->uuid);
@@ -2545,7 +2545,7 @@ static char *networkGetXMLDesc(virNetworkPtr net,
         goto cleanup;
     }
 
-    ret = virNetworkDefFormat(network->def);
+    ret = virNetworkDefFormat(network->def, flags);
 
 cleanup:
     if (network)
index 0c88bcfc29766a7ac1e28e203bbcd4dcaffbd126..2a98e7ed3400527d53b0345f9b07f679a04b668c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * test.c: A "mock" hypervisor for use by application unit tests
  *
- * Copyright (C) 2006-2011 Red Hat, Inc.
+ * Copyright (C) 2006-2012 Red Hat, Inc.
  * Copyright (C) 2006 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -3233,7 +3233,7 @@ static char *testNetworkGetXMLDesc(virNetworkPtr network,
         goto cleanup;
     }
 
-    ret = virNetworkDefFormat(privnet->def);
+    ret = virNetworkDefFormat(privnet->def, flags);
 
 cleanup:
     if (privnet)
index b3267a901002d5d7ecb9be24e09ce8d0c83b54e9..22712d578b3951818f6c379839af973868e573b2 100644 (file)
@@ -8098,7 +8098,7 @@ static char *vboxNetworkGetXMLDesc(virNetworkPtr network,
     VBOX_UTF16_FREE(networkInterfaceNameUtf16);
     VBOX_RELEASE(host);
 
-    ret = virNetworkDefFormat(def);
+    ret = virNetworkDefFormat(def, 0);
 
 cleanup:
     virNetworkDefFree(def);
index 5cdbedb690e4625a0d705c3f9470deed4a9f8de4..6cb9d900a602765419969af56cb01ece4cb555c2 100644 (file)
@@ -14,7 +14,8 @@
 #include "testutilsqemu.h"
 
 static int
-testCompareXMLToXMLFiles(const char *inxml, const char *outxml)
+testCompareXMLToXMLFiles(const char *inxml, const char *outxml,
+                         unsigned int flags)
 {
     char *inXmlData = NULL;
     char *outXmlData = NULL;
@@ -30,7 +31,7 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml)
     if (!(dev = virNetworkDefParseString(inXmlData)))
         goto fail;
 
-    if (!(actual = virNetworkDefFormat(dev)))
+    if (!(actual = virNetworkDefFormat(dev, flags)))
         goto fail;
 
     if (STRNEQ(outXmlData, actual)) {
@@ -48,21 +49,27 @@ testCompareXMLToXMLFiles(const char *inxml, const char *outxml)
     return ret;
 }
 
+struct testInfo {
+    const char *name;
+    unsigned int flags;
+};
+
 static int
 testCompareXMLToXMLHelper(const void *data)
 {
+    const struct testInfo *info = data;
     int result = -1;
     char *inxml = NULL;
     char *outxml = NULL;
 
     if (virAsprintf(&inxml, "%s/networkxml2xmlin/%s.xml",
-                    abs_srcdir, (const char*)data) < 0 ||
+                    abs_srcdir, info->name) < 0 ||
         virAsprintf(&outxml, "%s/networkxml2xmlout/%s.xml",
-                    abs_srcdir, (const char*)data) < 0) {
+                    abs_srcdir, info->name) < 0) {
         goto cleanup;
     }
 
-    result = testCompareXMLToXMLFiles(inxml, outxml);
+    result = testCompareXMLToXMLFiles(inxml, outxml, info->flags);
 
 cleanup:
     free(inxml);
@@ -76,10 +83,14 @@ mymain(void)
 {
     int ret = 0;
 
-#define DO_TEST(name) \
-    if (virtTestRun("Network XML-2-XML " name, \
-                    1, testCompareXMLToXMLHelper, (name)) < 0) \
-        ret = -1
+#define DO_TEST_FULL(name, flags)                                       \
+    do {                                                                \
+        const struct testInfo info = {name, flags};                     \
+        if (virtTestRun("Network XML-2-XML " name,                      \
+                        1, testCompareXMLToXMLHelper, &info) < 0)       \
+            ret = -1;                                                   \
+    } while (0)
+#define DO_TEST(name) DO_TEST_FULL(name, 0)
 
     DO_TEST("isolated-network");
     DO_TEST("routed-network");
@@ -93,6 +104,7 @@ mymain(void)
     DO_TEST("host-bridge-net");
     DO_TEST("vepa-net");
     DO_TEST("bandwidth-network");
+    DO_TEST_FULL("passthrough-pf", VIR_NETWORK_XML_INACTIVE);
 
     return (ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }
index f4c0063d94e3b1d395fff4a04ba670d257e9f437..3869d9d33a1ef1a61587914b73a28126c16444d3 100644 (file)
@@ -7286,6 +7286,7 @@ static const vshCmdInfo info_network_dumpxml[] = {
 
 static const vshCmdOptDef opts_network_dumpxml[] = {
     {"network", VSH_OT_DATA, VSH_OFLAG_REQ, N_("network name or uuid")},
+    {"inactive", VSH_OT_BOOL, VSH_OFLAG_NONE, N_("network information of an inactive domain")},
     {NULL, 0, 0, NULL}
 };
 
@@ -7295,6 +7296,8 @@ cmdNetworkDumpXML(vshControl *ctl, const vshCmd *cmd)
     virNetworkPtr network;
     bool ret = true;
     char *dump;
+    unsigned int flags = 0;
+    int inactive;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return false;
@@ -7302,7 +7305,12 @@ cmdNetworkDumpXML(vshControl *ctl, const vshCmd *cmd)
     if (!(network = vshCommandOptNetwork(ctl, cmd, NULL)))
         return false;
 
-    dump = virNetworkGetXMLDesc(network, 0);
+    inactive = vshCommandOptBool (cmd, "inactive");
+    if (inactive)
+        flags |= VIR_NETWORK_XML_INACTIVE;
+
+    dump = virNetworkGetXMLDesc(network, flags);
+
     if (dump != NULL) {
         vshPrint(ctl, "%s", dump);
         VIR_FREE(dump);
index 1abf4489672e2c2a3a0932d4b1284a9f9018259d..f2793cdb14d8c8f7570f679ef64f16f75c3f9b4d 100644 (file)
@@ -1523,9 +1523,11 @@ not instantiated.
 Destroy (stop) a given virtual network specified by its name or UUID. This
 takes effect immediately.
 
-=item B<net-dumpxml> I<network>
+=item B<net-dumpxml> I<network> [I<--inactive>]
 
 Output the virtual network information as an XML dump to stdout.
+If I<--inactive> is specified, then physical functions are not
+expanded into their associated virtual functions.
 
 =item B<net-edit> I<network>