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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list