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

hongming zhang honzhang at redhat.com
Tue Jul 16 09:38:13 UTC 2013


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




More information about the libvir-list mailing list