Snippets

xchandan kvm_topo

Created by xchandan
#!/bin/bash

function get_ovs_br()
{
    port=$1
    ovs-vsctl port-to-br $port
}

function collect_br_data()
{
    all_br_intfs=$(ls -l /sys/class/net/*/master|awk '{print $9}')
    for br_intf in $all_br_intfs; do
        intf_name=$(echo $br_intf|awk -F/  '{print $5}')
        br_name=$(readlink $br_intf|awk -F/  '{print $NF}')
        if [[ "$br_name" == "ovs-system" ]]; then
    	br_name="ovs:$(get_ovs_br $intf_name)"
        fi
        echo "$intf_name@$br_name"
    done
}

function get_br_for_port()
{
    port=$1
    br_port_db=$2
    grep $port $br_port_db| awk -F@ '{print $2}'
}

function get_nic_info()
{
	nic=$1
        nic_host_info=$(echo $nic|awk -F@ '{print $1}')
	nic_vm_info=$(echo $nic|awk -F@ '{print $2}')
	nic_host_fd=$(echo $nic_host_info|tr ',' '\n'|awk -F'=' '/fd/{print $2}')
	nic_vm_mac=$(echo $nic_vm_info|tr ',' '\n'|awk -F'=' '/mac/{print $2}')
	nic_host_name=$(awk '/iff/{print $NF}' /proc/$pid/fdinfo/$nic_host_fd)
	nic_vm_name=$(echo $nic_vm_info|tr ',' '\n'|awk -F'=' '/id/{print $2}')
	nic_br=$(get_br_for_port $nic_host_name $br_port_db)
	echo "NIC: $nic_host_name $nic_vm_name $nic_vm_mac $nic_br"

}

br_port_db=$(mktemp /tmp/portdbXXXX)
collect_br_data > $br_port_db

all_kvm_names=$(virsh list --name)
for kvm_name in $all_kvm_names; do
    uuid=$(virsh dominfo $kvm_name|awk '/UUID/{print $NF}')
    proc=$(ps axww -o pid,cmd|grep kvm|grep $uuid)
    pid=$(echo $proc|awk '{print $1}')
    cmd=$(echo $proc|awk '{$1=""; print $0}')
    echo "VM: $uuid $pid $kvm_name"
    nics=$(python kvm_nic.py "$cmd")
    for nic in $nics; do
	get_nic_info $nic
    done
    echo "----"
done

rm  $br_port_db
import sys

try:
    cmdline = sys.argv[1]
except:
    print ""

terms = cmdline.split()
idx = 0
nics = []
for term in terms:
    if term.startswith('-netdev'):
        nics.append((terms[idx+1], terms[idx+3]))
    idx +=1

for nic in nics:
    print "%s@%s" %(nic[0], nic[1])

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.