Alternative to virsh (libvirt)
Asked Answered
I

1

7

I am using virsh list to display the list of vms running on the computer. I want the information printed in the process in the form of a 2d array.

One way to go about this is to have the output, use tokenizer and store it in the array. But is there some other way where I can get directly this into the form of an array or something so that code is much more scalable. (Something that I could think of was using libvirt api in python)

Iwo answered 13/2, 2011 at 18:43 Comment(0)
R
14

There are indeed libvirt Python API bindings.

import libvirt

conn = libvirt.openReadOnly(None)  # $LIBVIRT_DEFAULT_URI, or give a URI here
assert conn, 'Failed to open connection'

names = conn.listDefinedDomains()
domains = map(conn.lookupByName, names)

ids = conn.listDomainsID()
running = map(conn.lookupByID, ids)

columns = 3

states = {
    libvirt.VIR_DOMAIN_NOSTATE: 'no state',
    libvirt.VIR_DOMAIN_RUNNING: 'running',
    libvirt.VIR_DOMAIN_BLOCKED: 'blocked on resource',
    libvirt.VIR_DOMAIN_PAUSED: 'paused by user',
    libvirt.VIR_DOMAIN_SHUTDOWN: 'being shut down',
    libvirt.VIR_DOMAIN_SHUTOFF: 'shut off',
    libvirt.VIR_DOMAIN_CRASHED: 'crashed',
}
def info(dom):
    [state, maxmem, mem, ncpu, cputime] = dom.info()
    return '%s is %s,' % (dom.name(), states.get(state, state))

print 'Defined domains:'
for row in map(None, *[iter(domains)] * columns):
    for domain in row:
        if domain:
            print info(domain),
    print
print

print 'Running domains:'
for row in map(None, *[iter(running)] * columns):
    for domain in row:
        if domain:
            print info(domain),
    print
Resume answered 13/2, 2011 at 20:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.