首页 文章

替代virsh(libvirt)

提问于
浏览
7

我正在使用virsh列表显示计算机上运行的vms列表 . 我希望在过程中以2d数组的形式打印信息 .

解决此问题的一种方法是使用输出,使用标记生成器并将其存储在数组中 . 但是有没有其他方法可以直接将其转换为数组或其他形式,以便代码更具可伸缩性 . (我能想到的是在python中使用libvirt api)

1 回答

  • 14

    的确有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
    

相关问题