Hi,

Some people appear to have autostart VMs residing on slow storage.  If
libvirtd starts too early, it'll simply fail trying to start those VMs.
It'd be nice to know when all the storage on which autostart containers
depend becomes available, so as to safely start libvirt.

The python script appended below is one approach.  It could be called as
something like

        for f in /etc/libvirt/qemu/autostart/* /etc/libvirt/lxc/autostart/*; do
                for d in `libvirt_list_storage.py $f`; do
                        if [ ! -r $d ]; then
                                echo "storage not yet ready"
                                exit 1
                        fi
                done
        done
        echo "starting libvirtd"
        libvirtd

(Realistically I would have this running in an upstart job which is
'start on mounted' and, if all storage available, emits a
'libvirt-storage-up' event).

Are there better ways to go about this?

thanks,
-serge

#!/usr/bin/python

import sys
from xml.dom.minidom import parse

dom = parse(sys.argv[1])

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

def print_domname(dom):
    #return
    print "Domain %s\n" % getText(dom.childNodes)

def liststorages(dom):
    print_domname(dom.getElementsByTagName("name")[0])
    disks = dom.getElementsByTagName("disk")
    list_disks(disks)
    filesystems = dom.getElementsByTagName('filesystem')
    list_filesystems(filesystems)

def list_filesystems(fslist):
    for fs in fslist:
        if not fs.hasAttribute('type'):
            continue
        if fs.getAttribute('type') != 'mount':
            continue
        dirs = fs.getElementsByTagName("source")
        if len(dirs) == 0:
            continue
        if not dirs[0].getAttribute('dir'):
            continue
        print "dir: %s\n" % dirs[0].getAttribute('dir')

def list_disks(disks):
    for disk in disks:
        if not disk.hasAttribute('type'):
            continue
        if disk.getAttribute('type') == 'file':
            list_disk_type_file(disk)
        elif disk.getAttribute('type') == 'block':
            list_disk_type_block(disk)
        else:
            # not supported
            continue

def list_disk_type_file(disk):
        disksrcs = disk.getElementsByTagName("source")
        if len(disksrcs) == 0:
            return
        if not disksrcs[0].hasAttribute('file'):
            return
        print "file: %s\n" % disksrcs[0].getAttribute('file')

def list_disk_type_block(disk):
        devsrscs = disk.getElementsByTagName("source")
        if len(devsrscs) == 0:
            return
        if not devsrscs[0].hasAttribute('dev'):
            return
        print "dev: %s\n" % devsrscs[0].getAttribute('dev')

liststorages(dom)

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

Reply via email to