2016-05-26 18 views
1

libvirtで管理されている仮想マシンのメモリ使用量を確認するためのこの簡単なスクリプトがあります。libvirt:状態の整数から文字列へ?

stateの整数をdom.info()から人間が読める文字列に変換するにはどうすればよいですか?

import libvirt 
import re 

import sys 


def mem_total_kb(): 
    meminfo = open('/proc/meminfo').read() 
    matched = re.search(r'^MemTotal:\s+(\d+)', meminfo) 
    return int(matched.groups()[0]) 


def main(): 
    conn = libvirt.openReadOnly(None) 

    if conn == None: 
     print 'Failed to open connection to the hypervisor' 
     sys.exit(1) 
    used_mem_sum = 0 
    for domain_id in conn.listDomainsID(): 
     dom = conn.lookupByID(domain_id) 
     state, max_mem, used_mem, vcpus, cpu_time_used = dom.info() 
     print(
     'name=%s state=%s max_mem=%s used_mem=%s vcpus=%s cpu_time_used=%s' % (dom.name(), state, max_mem, used_mem, vcpus, cpu_time_used)) 
     used_mem_sum += used_mem 
    print('Sum of used mem: %s KiB' % used_mem_sum) 
    mem_total = mem_total_kb() 
    print('Sum of physical mem: %s KiB' % mem_total) 
    if used_mem_sum > mem_total: 
     print('########## VMs use more RAM than available!') 
     return 
    mem_left=mem_total - used_mem_sum 
    print('Memory left: %s KiB' % (mem_left)) 
    mem_left_should=4000000 
    if mem_left<mem_left_should: 
     print('less than mem_left_should=%sKiB left!' % mem_left_should) 


if __name__ == '__main__': 
    main() 

ドキュメント:https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainInfo

状態:実行中の状態、virDomainState

enum virDomainState { 

VIR_DOMAIN_NOSTATE = 0 
no state 
VIR_DOMAIN_RUNNING = 1 
the domain is running 
VIR_DOMAIN_BLOCKED = 2 
the domain is blocked on resource 
VIR_DOMAIN_PAUSED = 3 
the domain is paused by user 
VIR_DOMAIN_SHUTDOWN = 4 
the domain is being shut down 
VIR_DOMAIN_SHUTOFF = 5 
the domain is shut off 
VIR_DOMAIN_CRASHED = 6 
the domain is crashed 
VIR_DOMAIN_PMSUSPENDED = 7 
the domain is suspended by guest power management 
VIR_DOMAIN_LAST = 8 
NB: this enum value will increase over time as new events are added to the libvirt API. It reflects the last state supported by this version of the libvirt API. 

} 
+0

あなたは、あなたが意味するものの例を挙げることができますか? 「1 - > 1」? – jcfollower

+0

@jcfollower質問を更新しました。 – guettli

+0

小さいので、独自の辞書を作成するだけでいいのですか? 'state_descr = {0: '状態なし'、1: 'ドメインが実行中です'、...}' – jcfollower

答えて

2

少なくとも、列挙定数名はlibvirtモジュールで公開されているようです。可能性のある以下の私のために働く...

import libvirt 
import pprint 
import re 

d = {} 
for k, v in libvirt.__dict__.iteritems(): 
    if re.match('VIR_DOMAIN_[A-Z]+$', k): 
     d[v] = k 

pprint.pprint(d) 

...とプリント...

{0: 'VIR_DOMAIN_NOSTATE', 
1: 'VIR_DOMAIN_RUNNING', 
2: 'VIR_DOMAIN_BLOCKED', 
3: 'VIR_DOMAIN_PAUSED', 
4: 'VIR_DOMAIN_SHUTDOWN', 
5: 'VIR_DOMAIN_SHUTOFF', 
6: 'VIR_DOMAIN_CRASHED', 
7: 'VIR_DOMAIN_PMSUSPENDED'} 

説明は、単に元のソースコード内のコメント、おそらく公開されていません。例の一つはline 106 ...

state_names = { libvirt.VIR_DOMAIN_RUNNING : "running", 
       libvirt.VIR_DOMAIN_BLOCKED : "idle", 
       libvirt.VIR_DOMAIN_PAUSED : "paused", 
       libvirt.VIR_DOMAIN_SHUTDOWN : "in shutdown", 
       libvirt.VIR_DOMAIN_SHUTOFF : "shut off", 
       libvirt.VIR_DOMAIN_CRASHED : "crashed", 
       libvirt.VIR_DOMAIN_NOSTATE : "no state" } 

に独自の辞書を定義して...不完全のようですが、あなただけの、そこからそれを取ることができます。

+0

整数からVIR_DOMAIN_ *へのマッピングは必要なものです。どうもありがとうございました。 – guettli

0

の1このbashスクリプトはvirDomainState値(VIR_DOMAIN_LASTを除く)とのリストを取得します彼らJSON形式の説明:

#!/bin/bash 

HEADER=include/libvirt/libvirt-domain.h 

get_header_file() 
{ 
    curl -s https://raw.githubusercontent.com/libvirt/libvirt/master/"$HEADER" 
} 

select_virDomainState_block() 
{ 
    sed -n '/virDomainState:/,/^\} virDomainState;/ p' 
} 

join_multiline_comments() 
{ 
    sed -n '\%/\*[^*]*$% N; \%/\*.*\*/$% { s/\s*\n\s*/ /; p; }' 
} 

enum_values_to_json_map() 
{ 
    echo '{' 
    sed "s/\s*VIR_DOMAIN\S\+\s*=\s*//; s^,\s*/\*\s*^ : '^; s^\s*\*/^',^;" 
    echo '}' 
} 

get_header_file     \ 
| select_virDomainState_block \ 
| join_multiline_comments  \ 
| grep 'VIR_DOMAIN\S\+\s*='  \ 
| enum_values_to_json_map 

使用例:スクリプトは、GitHubのでlibvirtのミラーリポジトリから〜150キロバイトのファイルをダウンロードすること

$ ./get_libvirt_domain_states 
{ 
0 : 'no state', 
1 : 'the domain is running', 
2 : 'the domain is blocked on resource', 
3 : 'the domain is paused by user', 
4 : 'the domain is being shut down', 
5 : 'the domain is shut off', 
6 : 'the domain is crashed', 
7 : 'the domain is suspended by guest power management', 
} 

注意。これは、libvirtコードを最新に保つためのものです。もちろん、Pythonコードから呼び出すことはできますが、個人的にはそうしません。

+0

これはインターネット接続に依存しています.... libvirtを介して整数から文字列を取得する方法はありませんか? – guettli

+1

libvirtはそのような機能を提供していないようです。少なくとも私はそれを見つけることができませんでした。コード内に独自の辞書を維持する必要があります(@jcfollowerが提案したように)。その辞書をlibvirtコードと同期させておくほうが簡単です。 – Leon

関連する問題