[libvirt] [test-API][PATCH V2] Modify repos/network/network_list.py and add network_list case to conf
Guannan Ren
gren at redhat.com
Mon Jul 22 03:54:13 UTC 2013
On 07/17/2013 04:46 PM, hongming zhang wrote:
> Modify the old network_list.py. The new network_list.py covers all
> flags of listAllNetworks and the following api. and add network_list to
> basic_network.conf.
> virNetwork:
> name()
> bridgeName()
> isActive()
> isPersistent()
> virConnect:
> listAllNetworks()
> Changes from V2 to V1 as follows
> 1.Change the flag in conf from digit to string
> 2.Remove the checking method using the result of virsh with flags
> 3.Add checking method via checking network autostart dir
> 4.Modify the basic_network.conf
> ---
> cases/basic_network.conf | 35 ++++-
> repos/network/network_list.py | 277 ++++++++++++++++++-----------------------
> 2 files changed, 148 insertions(+), 164 deletions(-)
>
> diff --git a/cases/basic_network.conf b/cases/basic_network.conf
> index 991ad99..91d7f21 100644
> --- a/cases/basic_network.conf
> +++ b/cases/basic_network.conf
> @@ -14,10 +14,18 @@ network:define
> netmode
> nat
>
> +network:network_list
> + flags
> + inactive
> +
> network:start
> networkname
> $defaultnetname
>
> +network:network_list
> + flags
> + active
> +
> network:autostart
> networkname
> $defaultnetname
> @@ -28,6 +36,10 @@ network:destroy
> networkname
> $defaultnetname
>
> +network:network_list
> + flags
> + default
> +
> network:undefine
> networkname
> $defaultnetname
> @@ -48,6 +60,10 @@ network:create
> netmode
> nat
>
> +network:network_list
> + flags
> + transient
> +
> network:destroy
> networkname
> $defaultnetname
> @@ -68,6 +84,10 @@ network:define
> netmode
> route
>
> +network:network_list
> + flags
> + persistent
> +
> network:start
> networkname
> $defaultnetname
> @@ -106,7 +126,6 @@ network:destroy
> networkname
> $defaultnetname
>
> -
> network:define
> networkname
> $defaultnetname
> @@ -127,12 +146,20 @@ network:start
> networkname
> $defaultnetname
>
> +network:network_list
> + flags
> + noautostart
> +
> network:autostart
> networkname
> $defaultnetname
> autostart
> enable
>
> +network:network_list
> + flags
> + autostart
> +
> network:destroy
> networkname
> $defaultnetname
> @@ -141,7 +168,6 @@ network:undefine
> networkname
> $defaultnetname
>
> -
> network:create
> networkname
> $defaultnetname
> @@ -162,8 +188,3 @@ network:destroy
> networkname
> $defaultnetname
>
> -
> -
> -
> -
> -
> diff --git a/repos/network/network_list.py b/repos/network/network_list.py
> index 7c34f69..175d6fa 100644
> --- a/repos/network/network_list.py
> +++ b/repos/network/network_list.py
> @@ -1,184 +1,147 @@
> #!/usr/bin/env python
> # To test "virsh net-list" command
>
> -import os
> -import sys
> -import re
> -import commands
> -
> import libvirt
> from libvirt import libvirtError
>
> from src import sharedmod
> from utils import utils
>
> -required_params = ('netlistopt',)
> +required_params = ('flags',)
> optional_params = {}
>
> -VIRSH_QUIET_NETLIST = "virsh --quiet net-list %s|awk '{print $1}'"
> -VIRSH_NETLIST = "virsh net-list %s"
> -GET_BRIDGE_IP = "/sbin/ifconfig %s | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'"
> -CONFIG_DIR = "/etc/libvirt/qemu/networks/"
> -
> -def get_option_list(params):
> - """return options we need to test
> - """
> - logger = params['logger']
> - option_list=[]
> -
> - value = params['netlistopt']
> -
> - if value == 'all':
> - option_list = [' ', '--all', '--inactive']
> - elif value == '--all' or value == '--inactive':
> - option_list.append(value)
> +VIRSH_NETWORK_LIST = "virsh net-list %s|sed -n '3,$'p|awk '{print $1}'"
> +GET_BRIDGE_IP = "/sbin/ifconfig %s | grep 'inet addr:' | cut -d: -f2 | awk \
> + '{print $1}'"
> +LS_NETWORK_DIR = "ls /etc/libvirt/qemu/networks/"
> +LS_AUTOSTART_NET = "ls /etc/libvirt/qemu/networks/autostart/"
> +
> +def check_bridge_ip(bridgename):
> + """ Check if the bridge has ip """
> +
> + (status, output) = utils.exec_cmd(GET_BRIDGE_IP % bridgename,\
> + shell=True)
> + if not status and utils.do_ping(output[0], 50):
> + logger.info("Bridge %s is active" % bridgename)
> + logger.info("%s has ip: %s" % (bridgename, output[0]))
GET_BRIDGE_IP is not a common solution to extract ip
In fedora, it is inet xxx.xxx.xxx.xxx which is not the same as inet addr: xxx.xxx.xxx.xxx on RHEL
> + return True
> else:
> - logger.error("value %s is not supported" % value)
> - return 1, option_list
> -
> - return 0, option_list
> + logger.error("Bridge %s has no ip or fails to ping" % bridgename)
> + return False
>
> -def get_output(logger, command, flag):
> - """execute shell command
> +def check_persistent_netxml(networkname):
> """
> - status, ret = commands.getstatusoutput(command)
> - if not flag and status:
> - logger.error("executing "+ "\"" + command + "\"" + " failed")
> - logger.error(ret)
> - return status, ret
> -
> -def check_all_option(conn, logger):
> - """check the output of virsh net-list with --all option
> + Check if the network is persistent via checking network xml dir
> + if the network is persistent, return True, or return False
> """
> - all_network = []
> - entries = os.listdir(CONFIG_DIR)
> - logger.debug("%s in %s" % (entries, CONFIG_DIR))
> - status, network_names = get_output(logger, VIRSH_QUIET_NETLIST % '--all', 0)
> - if not status:
> - all_network = network_names.split('\n')
> - logger.info("all network is %s" % all_network)
> - else:
> - return 1
>
> - if all_network == ['']:
> - return 0
> -
> - for entry in entries:
> - if not entry.endswith('.xml'):
> - continue
> + (status, output) = utils.exec_cmd(LS_NETWORK_DIR, shell=True)
> + network_list_dir = []
> + if status:
> + logger.error("Executing " + LS_NETWORK_DIR + " failed")
> + logger.error(output)
> + return False
> + else:
> + for i in range(len(output)):
> + network_list_dir.append(output[i][:-4])
> + del network_list_dir[0]
> + logger.info("Get persistent network name list under dir: %s" \
> + % network_list_dir)
> + if networkname in network_list_dir:
> + return True
> else:
> - network = entry[:-4]
> - if network not in all_network:
> - logger.error("network %s not in the output of virsh net-list" % network)
> - return 1
> - return 0
> + return False
>
> -def check_inactive_option(conn, logger):
> - """check the output of virsh net-list with --inactive option
> +def check_autostart_netxml(networkname):
> """
> - inactive_network = []
> - status, network_names = get_output(logger, VIRSH_QUIET_NETLIST % '--inactive', 0)
> - if not status:
> - inactive_network = network_names.split('\n')
> - logger.info("inactive network: %s" % inactive_network)
> - else:
> - return 1
> -
> - if inactive_network == ['']:
> - return 0
> -
> - for network in inactive_network:
> - try:
> - netobj = conn.networkLookupByName(network)
> - bridgename = netobj.bridgeName()
> - status, ip = get_output(logger, GET_BRIDGE_IP % bridgename, 1)
> -
> - if not status:
> - logger.info("network %s is inactive as we expected" % network)
> - else:
> - logger.error("network %s is not inactive, wrong" % network)
> - return 1
> - except libvirtError, e:
> - logger.error("API error message: %s, error code is %s" \
> - % (e.message, e.get_error_code()))
> - return 1
> -
> - return 0
> -
> -def check_default_option(conn, logger):
> - """check the output of virsh net-list
> + Check if the network is autostart via checking network autostart dir
> + if the network is autostart , return True, or return False.
> """
> - active_network = []
> - status, network_names = get_output(logger, VIRSH_QUIET_NETLIST % '', 0)
> - if not status:
> - active_network = network_names.split('\n')
> - logger.info("running network: %s" % active_network)
> - else:
> - return 1
>
> - if active_network == ['']:
> - return 0
> -
> - for network in active_network:
> - try:
> - netobj = conn.networkLookupByName(network)
> - bridgename = netobj.bridgeName()
> - status, ip = get_output(logger, GET_BRIDGE_IP % bridgename, 0)
> - if not status and utils.do_ping(ip, 0):
> - logger.info("network %s is active as we expected" % network)
> - logger.debug("%s has ip: %s" % (bridgename, ip))
> - else:
> - logger.error("network %s has no ip or fails to ping" % network)
> - return 1
> - except libvirtError, e:
> - logger.error("API error message: %s, error code is %s" \
> - % (e.message, e.get_error_code()))
> - return 1
> -
> - return 0
> -
> -def execute_virsh_netlist(option, logger):
> - """execute virsh net-list command with appropriate option given
> - """
> - status, ret = get_output(logger, VIRSH_NETLIST % option, 0)
> - if not status:
> - logger.info(ret)
> + (status, output) = utils.exec_cmd(LS_AUTOSTART_NET, shell=True)
> + autostart_list_dir = []
> + if status:
> + logger.error("Executing " + LS_AUTOSTART_NET + " failed")
> + logger.error(output)
> + return False
> + else:
> + for i in range(len(output)):
> + autostart_list_dir.append(output[i][:-4])
> + logger.info("Get persistent network name list under dir: %s" \
> + % autostart_list_dir)
s/Get persistent/Get autostart
> + if networkname in autostart_list_dir:
> + return True
> + else:
> + return False
>
> def network_list(params):
> - """test net-list command to virsh with default, --all, --inactive
> - """
> - logger = params['logger']
> - ret, option_list = get_option_list(params)
> -
> - if ret:
> - return 1
> + """ List network with flag """
>
> + global logger
> + logger = params['logger']
> conn = sharedmod.libvirtobj['conn']
> -
> - for option in option_list:
> - if option == ' ':
> - logger.info("check the output of virsh net-list")
> - if not check_default_option(conn, logger):
> - logger.info("virsh net-list checking succeeded")
> - execute_virsh_netlist(option, logger)
> - else:
> - logger.error("virsh net-list checking failed")
> - return 1
> - elif option == '--inactive':
> - logger.info("check the output of virsh net-list --inactive")
> - if not check_inactive_option(conn, logger):
> - logger.info("virsh net-list --inactive checking succeeded")
> - execute_virsh_netlist(option, logger)
> - else:
> - logger.error("virsh net-list --inactive checking failed")
> - return 1
> - elif option == '--all':
> - logger.info("check the output of virsh net-list --all")
> - if not check_all_option(conn, logger):
> - logger.info("virsh net-list --all checking succeeded")
> - execute_virsh_netlist(option, logger)
> - else:
> - logger.error("virsh net-list --all checking failed")
> - return 1
> + flags = params['flags']
> + logger.info("The given flags are %s " % flags)
> + flag = -1
> + if flags == "default":
> + flag = 0
> + elif flags == "inactive":
> + flag = 1
> + elif flags == "active":
> + flag = 2
> + elif flags == "persistent":
> + flag = 4
> + elif flags == "transient":
> + flag = 8
> + elif flags == "autostart":
> + flag = 16
> + elif flags == "noautostart":
> + flag = 32
> + try:
> + network_list_api = conn.listAllNetworks(flag)
> + network_namelist_api = []
> + logger.debug("Traverse the network object list %s" % \
> + network_list_api)
> + for network in network_list_api:
> + networkname = network.name()
> + bridgename = network.bridgeName()
Not all of virtual network have bridge name like using macvtap direct
connection
<network>
<name>virtualnet</name>
<forward dev='eth1' mode='bridge'>
<interface dev='eth1'/>
</forward>
</network>
Guannan
More information about the libvir-list
mailing list