[libvirt] [test-API][PATCH] Modify repos/network/network_list.py and add network_list case to conf

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() --- cases/basic_network.conf | 37 +++++- repos/network/network_list.py | 279 ++++++++++++++++++----------------------- 2 files changed, 151 insertions(+), 165 deletions(-) diff --git a/cases/basic_network.conf b/cases/basic_network.conf index 991ad99..805cfd0 100644 --- a/cases/basic_network.conf +++ b/cases/basic_network.conf @@ -14,6 +14,16 @@ network:define netmode nat +#VIR_CONNECT_LIST_NETWORKS_INACTIVE = 1 +#VIR_CONNECT_LIST_NETWORKS_ACTIVE = 2 +#VIR_CONNECT_LIST_NETWORKS_PERSISTENT = 4 +#VIR_CONNECT_LIST_NETWORKS_TRANSIENT = 8 +#VIR_CONNECT_LIST_NETWORKS_AUTOSTART = 16 +#VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART = 32 +network:network_list + flags + 1 + network:start networkname $defaultnetname @@ -24,10 +34,18 @@ network:autostart autostart enable +network:network_list + flags + 3 + network:destroy networkname $defaultnetname +network:network_list + flags + 4 + network:undefine networkname $defaultnetname @@ -48,6 +66,10 @@ network:create netmode nat +network:network_list + flags + 8 + network:destroy networkname $defaultnetname @@ -78,6 +100,10 @@ network:autostart autostart enable +network:network_list + flags + 16 + network:destroy networkname $defaultnetname @@ -102,11 +128,14 @@ network:create netmode route +network:network_list + flags + 32 + network:destroy networkname $defaultnetname - network:define networkname $defaultnetname @@ -141,7 +170,6 @@ network:undefine networkname $defaultnetname - network:create networkname $defaultnetname @@ -162,8 +190,3 @@ network:destroy networkname $defaultnetname - - - - - diff --git a/repos/network/network_list.py b/repos/network/network_list.py index 7c34f69..647da82 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}'" +FLAGDICT = {1:" --inactive", 2:"", 4:" --persistent",\ + 8:" --transient", 16:" --autostart", 32:" --no-autostart" } +CONFIG_DIR = "ls /etc/libvirt/qemu/networks/" + +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])) + return True else: - logger.error("value %s is not supported" % value) - return 1, option_list - - return 0, option_list - -def get_output(logger, command, flag): - """execute shell command - """ - 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 - """ - 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) + logger.error("Bridge %s has no ip or fails to ping" % bridgename) + return False + +def check_persistent_netxml(networkname): + """ Check if the network is persistent via checking network xml dir """ + + (status, output) = utils.exec_cmd(CONFIG_DIR, shell=True) + network_list_dir = [] + if status: + logger.error("Executing " + CONFIG_DIR + " failed") + logger.error(output) + return False else: - return 1 - - if all_network == ['']: - return 0 - - for entry in entries: - if not entry.endswith('.xml'): - continue + 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 - -def check_inactive_option(conn, logger): - """check the output of virsh net-list with --inactive option - """ - 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: + logger.error("Failed to get the persistent %s" % networkname) + return False + +def get_network_list_virsh(flaglist): + """ Get the network name list through virsh command """ + + flagstr = "" + # Convert the flags that be passed to API to VIRSH flags + for flag_key in flaglist: + if FLAGDICT.has_key(int(flag_key)): + flagstr += FLAGDICT.get(int(flag_key)) + logger.info("Execute virsh net-list" + flagstr) + + network_list_virsh = [] + (status, output) = utils.exec_cmd(VIRSH_NETWORK_LIST % flagstr,\ + shell=True) + if status: + logger.error("Executing " + VIRSH_NETWORK_LIST + " failed") 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 - """ - 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 + network_list_virsh = output[:-1] + logger.info("Get network name list via VIRSH: %s" \ + % network_list_virsh) + +def convert_flags(flags): + """ Bitwise-OR of flags in conf and convert them to the readable flags """ + + flaglist = [] + flagstr = "" + logger.info("The given flags are %s " % flags) + if not '|' in flags: + flagn = int(flags) + flaglist.append(flagn) + else: + # bitwise-OR of flags of net-list + flaglist = flags.split('|') + flagn = 0 + for flag in flaglist: + flagn |= int(flag) - return 0 + # Convert the flags in conf file to readable flag + for flag_key in flaglist: + if FLAGDICT.has_key(int(flag_key)): + flagstr += FLAGDICT.get(int(flag_key)) + logger.info("List network with flags:" + flagstr) -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) + return (flaglist, flagn) 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 all filters """ + 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) + flags = params['flags'] + (flaglist, flagn) = convert_flags(flags) + + try: + logger.info("Flag list %s " % flaglist) + logger.info("Bitwise OR value of flags is %s" % flagn) + + network_list_api = conn.listAllNetworks(flagn) + network_list_virsh = get_network_list_virsh(flaglist) + network_namelist_api = [] + for network in network_list_api: + + networkname = network.name() + network_namelist_api.append(networkname) + bridgename = network.bridgeName() + logger.info("Network name: %s " % networkname) + logger.info("Network %s 's bridge name: %s " % (networkname ,\ + bridgename)) + # Check if the network is active + if network.isActive() and check_bridge_ip(bridgename): + logger.info("The %s network is active" % networkname) 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) + logger.info("The %s network isn't active" % networkname) + + # Check if the network is persistent + if network.isPersistent() and check_persistent_netxml(networkname): + logger.info("The %s network is persistent" % networkname) else: - logger.error("virsh net-list --all checking failed") - return 1 + logger.info("The %s network isn't persistent" % networkname) + + logger.info("Network list through API: %s " % network_namelist_api) + if cmp(network_namelist_api,network_list_virsh): + logger.info("Successfully get network list through API") + else: + logger.error("Failed to get network list through API") + return 1 + + except libvirtError, e: + logger.error("API error message: %s" % e.message) + return 1 return 0 + -- 1.7.1

On 07/16/2013 05:38 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() --- cases/basic_network.conf | 37 +++++- repos/network/network_list.py | 279 ++++++++++++++++++----------------------- 2 files changed, 151 insertions(+), 165 deletions(-)
diff --git a/cases/basic_network.conf b/cases/basic_network.conf index 991ad99..805cfd0 100644 --- a/cases/basic_network.conf +++ b/cases/basic_network.conf @@ -14,6 +14,16 @@ network:define netmode nat
+#VIR_CONNECT_LIST_NETWORKS_INACTIVE = 1 +#VIR_CONNECT_LIST_NETWORKS_ACTIVE = 2 +#VIR_CONNECT_LIST_NETWORKS_PERSISTENT = 4 +#VIR_CONNECT_LIST_NETWORKS_TRANSIENT = 8 +#VIR_CONNECT_LIST_NETWORKS_AUTOSTART = 16 +#VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART = 32
About the list all networks testcase, we can divide the about six flags into three groups 1 inactive/active 2 persistent/transistent 3 autostart/non-autostart we just test the result with these three flags Currently, the case compares the results of 'virsh network-list' to the results of calling python APIs it is not so necessary because both virsh and python bindings calls the same libvirt shared library. we can test the virsh tool by using shell scripts in other tests place. After getting the result from python API, checking its validation in /etc/libvirt/qemu/networks/ make the testcase looks good.
+network:network_list + flags + 1 +
using string here is better than digit. The conversion between digit to string is a little complicated. The simpler, the better. So finally it comes to four tesecases. 1 list all network(default flags == 0) 2 list inactive/active networks 3,list persistent/transistent networks 4,list autostart/non-autostart networks. Or, go further, we can pick up one of networks to change its state, then see the changes in the output of this list. Guannan
participants (2)
-
Guannan Ren
-
hongming zhang