On 12/02/2015 01:35 AM, Martin Kletzander wrote:
We always had to deal with new parsing errors in a weird way.  All of
them needed to go into functions starting the domains.  That messes up
the code, it's confusing to newcomers and so on.

I once had an idea that we can handle this stuff.  We know what
failed, we have the XML that failed parsing and if the problem is not
in the domain name nor UUID, we can create a domain object out of that
as well.  This way we are able to do something we weren't with this
series applied.  Example follows.

Assume "dummy" is a domain with invalid XML (I just modified the
file).  Now, just for the purpose of this silly example, let's say we
allowed domains with archtecture x86_*, but now we've realized that
x86_64 is the only one we want to allow, but there already is a domain
defined that has <type arch='x86_256' .../>.  With the current master,
the domain would be lost, so we would need to modify the funstion
starting the domain (e.g. qemuProcessStart for qemu domain).  However,
with this series, it behaves like this:

   # virsh list --all --reason
      Id    Name                           State      Reason
     ---------------------------------------------------------------
      -     dummy                          shut off   invalid XML

   # virsh domstate --reason dummy
     shut off (invalid XML)

   # virsh start dummy
   error: Failed to start domain dummy
   error: XML error: domain 'dummy' was not loaded due to an XML error
   (unsupported configuration: Unknown architecture x86_256), please
   redefine it

   # VISUAL='sed -i s/x86_256/x86_64/' virsh edit dummy
   Domain dummy XML configuration edited.

   # virsh domstate --reason dummy
   shut off (unknown)

   # virsh start dummy
   Domain dummy started

This is a logical next step for us to clean and separate parsing and
starting, getting rid of some old code without sacrifying compatibility
and maybe generating parser code in the future.

v2:
  - rebased on top of current master (with virdomainobjlist.c)
  - only disallow starting domains with invalid definitions (change
    done in v1), but allow re-defining them
  - add support for "virsh list --reason" to better excercise the
    feature added in this patchset

v1:
  - rebase
  - don't allow starting domains with invalid state
  - https://www.redhat.com/archives/libvir-list/2015-November/msg01127.html

RFC: https://www.redhat.com/archives/libvir-list/2015-September/msg00698.html


Martin Kletzander (10):
   conf, virsh: Add new domain shutoff reason
   virsh: Refactor the table output of the list command
   virsh: Add support for list -reason
   qemu: Few whitespace cleanups
   conf: Extract name-parsing into its own function
   conf: Extract UUID parsing into its own function
   conf: Optionally keep domains with invalid XML, but don't allow
     starting them
   qemu: Don't lookup invalid domains unless specified otherwise
   qemu: Prepare basic APIs to handle invalid defs
   qemu: Load domains with invalid XML on start

  include/libvirt/libvirt-domain.h |   2 +
  src/bhyve/bhyve_driver.c         |   2 +
  src/conf/domain_conf.c           | 121 +++++++++++++++++++++++++++++++--------
  src/conf/domain_conf.h           |   7 +++
  src/conf/virdomainobjlist.c      |  71 +++++++++++++++++++++--
  src/conf/virdomainobjlist.h      |   1 +
  src/libvirt_private.syms         |   1 +
  src/libxl/libxl_driver.c         |   3 +
  src/lxc/lxc_driver.c             |   3 +
  src/qemu/qemu_driver.c           |  64 +++++++++++++++++----
  src/uml/uml_driver.c             |   2 +
  tests/virshtest.c                |  30 +++++++---
  tools/virsh-domain-monitor.c     |  60 ++++++++++++-------
  tools/virsh.pod                  |   5 +-
  14 files changed, 303 insertions(+), 69 deletions(-)



I am glad to see these patches you told me before.

And i have test your patches and found some problem until now:

1. if guest xml have private info, libvirt will output it if xml is invalid:

# virsh list --all --reason
 Id    Name                           State      Reason
------------------------------------------------------------

 -     test3                          shut off   invalid XML

# virsh -r dumpxml test3
...
    <input type='keyboard' bus='ps3'/>   <----wrong place
<graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123'> <----show passwd

2. vcpucount command output looks strange (small problem :) ):

# virsh vcpucount test3


3. hit crash if the guest xml uuid is invalid (delete a number) during stop daemon:


Program terminated with signal 11, Segmentation fault.
#0 0x00007fcbe773af87 in virDomainDefFree (def=0x7fcbc423d980) at conf/domain_conf.c:2327
2327            virDomainGraphicsDefFree(def->graphics[i]);

Thread 1 (Thread 0x7fcbe835c8c0 (LWP 21589)):
#0 0x00007fcbe773af87 in virDomainDefFree (def=0x7fcbc423d980) at conf/domain_conf.c:2327 #1 0x00007fcbe773b903 in virDomainObjDispose (obj=0x7fcbc4235fe0) at conf/domain_conf.c:2487 #2 0x00007fcbe76f182b in virObjectUnref (anyobj=<optimized out>) at util/virobject.c:265 #3 0x00007fcbe76d0ac9 in virHashFree (table=0x7fcbc412eda0) at util/virhash.c:318 #4 0x00007fcbe76f182b in virObjectUnref (anyobj=<optimized out>) at util/virobject.c:265
#5  0x00007fcbce85f8cf in qemuStateCleanup () at qemu/qemu_driver.c:1126
#6  0x00007fcbe779a168 in virStateCleanup () at libvirt.c:815
#7 0x00007fcbe83f02b1 in main (argc=<optimized out>, argv=<optimized out>) at libvirtd.c:1619

Thanks,
Luyao

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to