[libvirt] [PATCH 2/3] Support reporting live interface IP/netmask.

Daniel P. Berrange berrange at redhat.com
Fri Oct 23 16:22:53 UTC 2009


On Fri, Oct 16, 2009 at 10:56:18AM -0400, laine at laine.org wrote:
> From: Laine Stump <laine at laine.org>
> 
> 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.
> 
> Note that after this patch is applied, netcf support will be omitted
> from the build unless you have netcf-devel-0.1.3 or better installed.
> ---
>  configure.in                 |    2 +-
>  include/libvirt/libvirt.h.in |    4 +++
>  libvirt.spec.in              |    2 +-
>  src/conf/interface_conf.c    |   53 +++++++++++++++++++-----------------------
>  src/interface/netcf_driver.c |    8 ++++-
>  src/libvirt.c                |   15 ++++++++---
>  tools/virsh.c                |   10 ++++++-
>  7 files changed, 55 insertions(+), 39 deletions(-)
> 
> diff --git a/configure.in b/configure.in
> index 2f9db72..3402b4f 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -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
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 6186d4e..7e75bee 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -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,
> diff --git a/libvirt.spec.in b/libvirt.spec.in
> index 6cd0888..32596d4 100644
> --- a/libvirt.spec.in
> +++ b/libvirt.spec.in
> @@ -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
> diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
> index 540c931..d46f7ac 100644
> --- a/src/conf/interface_conf.c
> +++ b/src/conf/interface_conf.c
> @@ -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);
> diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c
> index ca14fb0..b5c3664 100644
> --- a/src/interface/netcf_driver.c
> +++ b/src/interface/netcf_driver.c
> @@ -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);
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 92a1eaa..c7d6bcc 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -6198,10 +6198,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.
> @@ -6218,7 +6225,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;
>      }
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 47122d5..322de30 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -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);
> -- 

ACK

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list