[Kimchi-devel] [PATCH v2] Supress error messages while checking vm metadata

Aline Manera alinefm at linux.vnet.ibm.com
Wed May 27 17:05:13 UTC 2015



On 05/05/2015 10:02, Ramon Medeiros wrote:
> Changes:
>
> v2:
> Improve coding to avoid code duplication
>
>
> The function FeatureTests.disable_libvirt_error_logging only removes the
> error message that will be displayed on the console. Libvirt also logs
> errors on messages log. To avoid flood messages log with metadata
> errors, it will be verified manually if the xml has the tag.
>
> Signed-off-by: Ramon Medeiros <ramonn at linux.vnet.ibm.com>
> ---
>   src/kimchi/model/utils.py | 38 ++++++++++++++++++++------------------
>   1 file changed, 20 insertions(+), 18 deletions(-)
>
> diff --git a/src/kimchi/model/utils.py b/src/kimchi/model/utils.py
> index 0c9d519..50b0578 100644
> --- a/src/kimchi/model/utils.py
> +++ b/src/kimchi/model/utils.py
> @@ -84,7 +84,6 @@ def _kimchi_set_metadata_node(dom, node):
>
>
>   def libvirt_get_kimchi_metadata_node(dom, mode="current"):
> -    FeatureTests.disable_libvirt_error_logging()
>       try:
>           xml = dom.metadata(libvirt.VIR_DOMAIN_METADATA_ELEMENT,
>                              KIMCHI_META_URL,
> @@ -115,36 +114,39 @@ def set_metadata_node(dom, node, metadata_support, mode="all"):
>           _kimchi_set_metadata_node(dom, node)
>
>
> -def _kimchi_get_metadata_node(dom, tag):
> +def _kimchi_get_metadata_node(xml, tag):
>       # some other tools will not let libvirt create a persistent
>       # configuration, just return empty
> +    # remove the "kimchi" prefix of xml
> +    for elem in xml.getiterator():
> +        if not hasattr(elem.tag, 'find'):
> +            continue
> +        i = elem.tag.find('}')
> +        if i >= 0:
> +            elem.tag = elem.tag[i+1:]
> +
> +    objectify.deannotate(xml)
> +    etree.cleanup_namespaces(xml)
> +    return xml
> +
> +
> +def get_metadata_node(dom, tag, metadata_support, mode="current"):
>       if not dom.isPersistent():
> -        return None
> +        return ""
>       xml = dom.XMLDesc(libvirt.VIR_DOMAIN_XML_INACTIVE)
>       root = etree.fromstring(xml)


>       kimchi = root.find("metadata/{%s}kimchi" % KIMCHI_META_URL)

The tests are failing because of the above check.

When libvirt has .metadata() support the guest XML will not have the tag 
"{%s}kimchi % KIMCHI_META_URL".

I suggest create a new function, _get_metadata(dom)

def _get_metadata(dom):
     if not dom.isPersistent():
         return None

     xml = dom.XMLDesc(libvirt.VIR_DOMAIN_XML_INACTIVE)
     root = etree.fromstring(xml)
     metadata = root.find("metadata")

     if metadata is None:
         return None

     return metadata

Then in get_metadata_node():

metadata = _get_metadata(dom)
if metadata is None:
     return ""

if metadata_support:
     kimchi = libvirt_get_kimchi_metadata_node(dom, mode)
else:
     kimchi = _kimchi_get_metadata_node(metadata, tag)

And in _kimchi_get_metadata_node(metadata, tag) add:

kimchi = metadata.find("{%s}kimchi" % KIMCHI_META_URL)

Note that libvirt_get_kimchi_metadata_node() is also called by 
set_metadata_node() so we need to do the metadata check there too to 
avoid the libvirt errors on logs.

> -    # remove the "kimchi" prefix of xml
> -    if kimchi is not None:
> -        for elem in kimchi.getiterator():
> -            if not hasattr(elem.tag, 'find'):
> -                continue
> -            i = elem.tag.find('}')
> -            if i >= 0:
> -                elem.tag = elem.tag[i+1:]
> -
> -        objectify.deannotate(kimchi)
> -        etree.cleanup_namespaces(kimchi)
> -        return kimchi
> -    return None
>
> +    # remove the "kimchi" prefix of xml
> +    if kimchi is None:
> +        return ""
>
> -def get_metadata_node(dom, tag, metadata_support, mode="current"):
>       if metadata_support:
>           kimchi = libvirt_get_kimchi_metadata_node(dom, mode)
>       else:
>           # FIXME remove this code when all distro libvirt supports metadata
>           # element
> -        kimchi = _kimchi_get_metadata_node(dom, tag)
> +        kimchi = _kimchi_get_metadata_node(kimchi, tag)
>
>       if kimchi is not None:
>           node = kimchi.find(tag)




More information about the Kimchi-devel mailing list