]> xenbits.xensource.com Git - libvirt.git/commitdiff
Support reporting live interface IP/netmask
authorLaine Stump <laine@laine.org>
Wed, 28 Oct 2009 09:40:54 +0000 (10:40 +0100)
committerDaniel Veillard <veillard@redhat.com>
Tue, 3 Nov 2009 20:04:56 +0000 (21:04 +0100)
This patch adds the flag VIR_INTERFACE_XML_INACTIVE to
virInterfaceGetXMLDesc's flags. When it is*not* set (the default), the
live interface info will be returned in the XML (in particular, the IP
address(es) and netmask(s) will be retrieved by querying the interface
directly, rather than  reporting what's in the config file). The
backend of this is in netcf's ncf_if_xml_state() function.

* configure.in libvirt.spec.in: requires netcf >= 0.1.3
* include/libvirt/libvirt.h.in: adds flag VIR_INTERFACE_XML_INACTIVE
* src/conf/interface_conf.c src/interface/netcf_driver.c src/libvirt.c:
  update the parsing and backend routines accordingly
* tools/virsh.c: change interface edit to inactive definition and
  adds the inactive flag for interface dump

configure.in
include/libvirt/libvirt.h.in
libvirt.spec.in
src/conf/interface_conf.c
src/interface/netcf_driver.c
src/libvirt.c
tools/virsh.c

index 5987211b81f04b99704a69e217f884731d28eacf..b7d0d7b29e5dcba99b6c950daa5481c60fc3fc31 100644 (file)
@@ -33,7 +33,7 @@ GNUTLS_REQUIRED="1.0.25"
 AVAHI_REQUIRED="0.6.0"
 POLKIT_REQUIRED="0.6"
 PARTED_REQUIRED="1.8.0"
-NETCF_REQUIRED="0.0.1"
+NETCF_REQUIRED="0.1.3"
 
 dnl Checks for C compiler.
 AC_PROG_CC
index 6186d4e02fc9fd5e4be14a5d4a8bac83b38185fa..7e75bee3f38ce2963a25611e111cd4cd963cc676 100644 (file)
@@ -930,6 +930,10 @@ virInterfacePtr         virInterfaceLookupByMACString (virConnectPtr conn,
 const char*             virInterfaceGetName       (virInterfacePtr iface);
 const char*             virInterfaceGetMACString  (virInterfacePtr iface);
 
+typedef enum {
+    VIR_INTERFACE_XML_INACTIVE = 1 /* dump inactive interface information */
+} virInterfaceXMLFlags;
+
 char *                  virInterfaceGetXMLDesc    (virInterfacePtr iface,
                                                    unsigned int flags);
 virInterfacePtr         virInterfaceDefineXML     (virConnectPtr conn,
index 7e1550e75e99fe5bd520b4000bd052270ea5caf0..9238bdd7e811ff290eadaca97b50f4af8b6fc4cc 100644 (file)
@@ -308,7 +308,7 @@ BuildRequires: libcap-ng-devel >= 0.5.0
 BuildRequires: libssh2-devel
 %endif
 %if %{with_netcf}
-BuildRequires: netcf-devel
+BuildRequires: netcf-devel >= 0.1.3
 %endif
 
 # Fedora build root suckage
index 540c9319f8563c767d9853b7877fb80e714a95c4..d46f7ac28adcf529dc750751c5a43239f6ee057d 100644 (file)
@@ -279,22 +279,19 @@ virInterfaceDefParseIp(virConnectPtr conn, virInterfaceDefPtr def,
 static int
 virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceDefPtr def,
                               xmlXPathContextPtr ctxt) {
-    xmlNodePtr cur;
-    int ret;
+    xmlNodePtr dhcp, ip;
+    int ret = 0;
 
-    cur = virXPathNode(conn, "./dhcp", ctxt);
-    if (cur != NULL)
-        ret = virInterfaceDefParseDhcp(conn, def, cur, ctxt);
-    else {
-        cur = virXPathNode(conn, "./ip", ctxt);
-        if (cur != NULL)
-            ret = virInterfaceDefParseIp(conn, def, cur, ctxt);
-        else {
-            virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
-                                "%s", _("interface miss dhcp or ip adressing"));
-            ret = -1;
-        }
-    }
+    dhcp = virXPathNode(conn, "./dhcp", ctxt);
+    if (dhcp != NULL)
+        ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt);
+
+    if (ret != 0)
+        return(ret);
+
+    ip = virXPathNode(conn, "./ip", ctxt);
+    if (ip != NULL)
+        ret = virInterfaceDefParseIp(conn, def, ip, ctxt);
     return(ret);
 }
 
@@ -1012,20 +1009,18 @@ virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
             virBufferAddLit(buf, "    <dhcp peerdns='yes'/>\n");
         else
             virBufferAddLit(buf, "    <dhcp/>\n");
-    } else {
-        /* theorically if we don't have dhcp we should have an address */
-        if (def->proto.address != NULL) {
-            if (def->proto.prefix != 0)
-                virBufferVSprintf(buf, "    <ip address='%s' prefix='%d'/>\n",
-                                  def->proto.address, def->proto.prefix);
-            else
-                virBufferVSprintf(buf, "    <ip address='%s'/>\n",
-                                  def->proto.address);
-        }
-        if (def->proto.gateway != NULL) {
-            virBufferVSprintf(buf, "    <route gateway='%s'/>\n",
-                              def->proto.gateway);
-        }
+    }
+    if (def->proto.address != NULL) {
+        if (def->proto.prefix != 0)
+            virBufferVSprintf(buf, "    <ip address='%s' prefix='%d'/>\n",
+                              def->proto.address, def->proto.prefix);
+        else
+            virBufferVSprintf(buf, "    <ip address='%s'/>\n",
+                              def->proto.address);
+    }
+    if (def->proto.gateway != NULL) {
+        virBufferVSprintf(buf, "    <route gateway='%s'/>\n",
+                          def->proto.gateway);
     }
     virBufferAddLit(buf, "  </protocol>\n");
     return(0);
index ca14fb06eff985736177210f5249ece21db89630..b5c3664c9172861dfdd4b00ce2d9b5a8c3201191 100644 (file)
@@ -326,7 +326,7 @@ cleanup:
 }
 
 static char *interfaceGetXMLDesc(virInterfacePtr ifinfo,
-                                 unsigned int flags ATTRIBUTE_UNUSED)
+                                 unsigned int flags)
 {
     struct interface_driver *driver = ifinfo->conn->interfacePrivateData;
     struct netcf_if *iface = NULL;
@@ -342,7 +342,11 @@ static char *interfaceGetXMLDesc(virInterfacePtr ifinfo,
         goto cleanup;
     }
 
-    xmlstr = ncf_if_xml_desc(iface);
+    if ((flags & VIR_INTERFACE_XML_INACTIVE)) {
+        xmlstr = ncf_if_xml_desc(iface);
+    } else {
+        xmlstr = ncf_if_xml_state(iface);
+    }
     if (!xmlstr) {
         const char *errmsg, *details;
         int errcode = ncf_error(driver->netcf, &errmsg, &details);
index b0b67c2409aaee661dd51e1a02536de63b09f3ed..2c5079088ce5dccb81ba2cea215938a94dacfbbb 100644 (file)
@@ -6201,10 +6201,17 @@ virInterfaceGetMACString(virInterfacePtr iface)
 /**
  * virInterfaceGetXMLDesc:
  * @iface: an interface object
- * @flags: an OR'ed set of extraction flags, not used yet
+ * @flags: an OR'ed set of extraction flags. Current valid bits:
+ *
+ *      VIR_INTERFACE_XML_INACTIVE - return the static configuration,
+ *                                   suitable for use redefining the
+ *                                   interface via virInterfaceDefineXML()
  *
- * Provide an XML description of the interface. The description may be reused
- * later to redefine the interface with virInterfaceDefineXML().
+ * Provide an XML description of the interface. If
+ * VIR_INTERFACE_XML_INACTIVE is set, the description may be reused
+ * later to redefine the interface with virInterfaceDefineXML(). If it
+ * is not set, the ip address and netmask will be the current live
+ * setting of the interface, not the settings from the config files.
  *
  * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error.
  *         the caller must free() the returned value.
@@ -6221,7 +6228,7 @@ virInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags)
         virLibInterfaceError(NULL, VIR_ERR_INVALID_INTERFACE, __FUNCTION__);
         return (NULL);
     }
-    if (flags != 0) {
+    if ((flags & ~VIR_INTERFACE_XML_INACTIVE) != 0) {
         virLibInterfaceError(iface, VIR_ERR_INVALID_ARG, __FUNCTION__);
         goto error;
     }
index 6b93405ef0a35f8c993c3d64ae9f673b9dd7b258..5ddbcb9ca2ad4af1e7ccaffd65589006a965e26e 100644 (file)
@@ -2792,7 +2792,7 @@ cmdInterfaceEdit (vshControl *ctl, const vshCmd *cmd)
     char *doc = NULL;
     char *doc_edited = NULL;
     char *doc_reread = NULL;
-    int flags = 0;
+    int flags = VIR_INTERFACE_XML_INACTIVE;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         goto cleanup;
@@ -3326,6 +3326,7 @@ static const vshCmdInfo info_interface_dumpxml[] = {
 
 static const vshCmdOptDef opts_interface_dumpxml[] = {
     {"interface", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("interface name or MAC address")},
+    {"inactive", VSH_OT_BOOL, 0, gettext_noop("show inactive defined XML")},
     {NULL, 0, 0, NULL}
 };
 
@@ -3335,6 +3336,11 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd)
     virInterfacePtr iface;
     int ret = TRUE;
     char *dump;
+    int flags = 0;
+    int inactive = vshCommandOptBool(cmd, "inactive");
+
+    if (inactive)
+        flags |= VIR_INTERFACE_XML_INACTIVE;
 
     if (!vshConnectionUsability(ctl, ctl->conn, TRUE))
         return FALSE;
@@ -3342,7 +3348,7 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd)
     if (!(iface = vshCommandOptInterface(ctl, cmd, NULL)))
         return FALSE;
 
-    dump = virInterfaceGetXMLDesc(iface, 0);
+    dump = virInterfaceGetXMLDesc(iface, flags);
     if (dump != NULL) {
         printf("%s", dump);
         free(dump);