[libvirt] [PATCH v3 3/3] virsh: add support for domain XML validation

Daniel P. Berrange berrange at redhat.com
Thu Jan 15 10:43:56 UTC 2015


On Thu, Jan 15, 2015 at 11:14:37AM +0100, Jiri Denemark wrote:
> On Tue, Jan 13, 2015 at 17:00:16 +0000, Daniel Berrange wrote:
> > The 'virsh edit' command gets XML validation enabled by default,
> > with a --skip-validate option to disable it. The 'virsh define'
> > and 'virsh create' commands get a --validate option to enable
> > it, to avoid regressions for existing scripts.
> > 
> > The quality of error reporting from libxml2 varies depending
> > on the type of XML error made. Sometimes it is quite clear
> > and useful, other times it is obscure & inaccurate. At least
> > the user will see an error now, rather than having their
> > XML modification silently disappear.
> > ---
> >  tools/virsh-domain.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++------
> >  1 file changed, 78 insertions(+), 9 deletions(-)
> > 
> > diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> > index 6733cfa..fe8f4ba 100644
> > --- a/tools/virsh-domain.c
> > +++ b/tools/virsh-domain.c
> > @@ -133,6 +133,56 @@ vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd,
> >      return vshLookupDomainInternal(ctl, cmd->def->name, n, flags);
> >  }
> >  
> > +static virDomainPtr
> > +vshDomainDefine(virConnectPtr conn, const char *xml, unsigned int flags)
> > +{
> > +    virDomainPtr dom;
> > +    if (flags) {
> > +        dom = virDomainDefineXMLFlags(conn, xml, flags);
> > +        /* If validate is the only flag, just drop it and
> > +         * try again.
> > +         */
> 
> This behavior is fine for virsh edit, where we enable validation by
> default but if it is enabled explicitly by a user for virsh define, I
> think we should propagate the error back instead of silently ignoring
> the --validate option.
> 
> > +        if (!dom) {
> > +            virErrorPtr err = virGetLastError();
> > +            if (err &&
> > +                (err->code == VIR_ERR_NO_SUPPORT) &&
> > +                (flags == VIR_DOMAIN_DEFINE_VALIDATE))
> > +                dom = virDomainDefineXML(conn, xml);
> > +        }
> > +    } else {
> > +        dom = virDomainDefineXML(conn, xml);
> > +    }
> > +    return dom;
> > +}
> > +
> > +
> > +static virDomainPtr
> > +vshDomainCreateXML(virConnectPtr conn, const char *xml,
> > +                   size_t nfds, int *fds, unsigned int flags)
> > +{
> > +    virDomainPtr dom;
> > +    if (nfds)
> > +        dom = virDomainCreateXMLWithFiles(conn, xml,
> > +                                          nfds, fds, flags);
> > +    else
> > +        dom = virDomainCreateXML(conn, xml, flags);
> > +    /* If validate is set, just drop it and try again */
> > +    if (!dom) {
> > +        virErrorPtr err = virGetLastError();
> > +        if (err &&
> > +            (err->code == VIR_ERR_INVALID_ARG) &&
> > +            (flags & VIR_DOMAIN_START_VALIDATE)) {
> > +            flags &= ~VIR_DOMAIN_START_VALIDATE;
> > +            if (nfds)
> > +                dom = virDomainCreateXMLWithFiles(conn, xml,
> > +                                                  nfds, fds, flags);
> > +            else
> > +                dom = virDomainCreateXML(conn, xml, flags);
> > +        }
> > +    }
> 
> We shouldn't need anything clever here since vshDomainCreateXML is
> called with VIR_DOMAIN_START_VALIDATE iff it was explicitly requested.

True, I forgot about that.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list