[libvirt] [libvirt-test-API][PATCH V2 00/11] Add network_dhcp_leases test case

For checking IPv6 address, libvirt need a IPv6 testing environment, so modified some cases and configuration files, also there are some small changes for other requirements. There are 9 new commits after comparing with the V1: Add global IPv6 default values to network part Add IPv6 section into network template xml Add IPv6 section into related network case Add xml file for <host> of IPv6 family Remove extra space from xml Change bridge name as a variable in functions Obtain a IPv6 addr on interface Change bridge name as a variable in XML Support brige name argument in cases According to those new commits in V2, updated its conf. Add network_dhcp_leases test case to conf jiahu (11): Add network_dhcp_leases test case Add global IPv6 default values to network part Add IPv6 section into network template xml Add IPv6 section into related network case Add xml file for <host> of IPv6 family Remove extra space from xml Change bridge name as a variable in functions Obtain a IPv6 addr on interface Change bridge name as a variable in XML Support brige name argument in cases Add network_dhcp_leases test case to conf cases/basic_network.conf | 100 ++++++++ global.cfg | 9 + kickstart.cfg | 2 +- repos/domain/destroy.py | 5 +- repos/domain/install_linux_cdrom.py | 5 +- .../domain/xmls/kvm_linux_guest_install_cdrom.xml | 2 +- repos/network/define.py | 7 +- repos/network/network_dhcp_leases.py | 277 +++++++++++++++++++++ repos/network/xmls/ip-dhcp-host.xml | 2 +- repos/network/xmls/ipv6-dhcp-host.xml | 1 + repos/network/xmls/network.xml | 5 + utils/ipget.sh | 7 +- utils/utils.py | 7 +- 13 files changed, 419 insertions(+), 10 deletions(-) create mode 100644 repos/network/network_dhcp_leases.py create mode 100644 repos/network/xmls/ipv6-dhcp-host.xml -- 1.8.3.1

The network_dhcp_leases.py uses DHCPLeases() to validate new API virNetworkGetDHCPLeases of libvirt. --- repos/network/network_dhcp_leases.py | 277 +++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 repos/network/network_dhcp_leases.py diff --git a/repos/network/network_dhcp_leases.py b/repos/network/network_dhcp_leases.py new file mode 100644 index 0000000..4a39579 --- /dev/null +++ b/repos/network/network_dhcp_leases.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python +#test DHCPLeases() API for libvirt + +import os +import time +import libvirt +from libvirt import libvirtError +from utils import utils +from src import sharedmod + +required_params = ('networkname',) +optional_params = {'macaddr': ''} + +LEASE_FILE = "/var/lib/libvirt/dnsmasq/" + +def check_ip(ipaddr, logger): + """ + return a string according to ip address type, return 'ipv4' for ipv4, + return 'ipv6' for ipv6, return False for others + """ + addr4 = ipaddr.strip().split('.') + addr6 = ipaddr.strip().split(':') + if len(addr4) == 4: + iptype = "ipv4" + elif len(addr6) == 6: + iptype = "ipv6" + else: + return False + return iptype + +def get_network_type(ipaddr,logger): + """ + return 0 or 1 for ipv4/ipv6, this function will be used in + check_ipv4_values()/check_ipv6_values() + """ + if check_ip(ipaddr, logger) == "ipv4": + return 0 + elif check_ip(ipaddr, logger) == "ipv6": + return 1 + +def get_bridge_name(network,logger): + """ + get bridge name under specified network from specified network conf + """ + CONF_NETWORK = LEASE_FILE + network + ".conf" + GREP_BRIDGE = "grep \"^interface=\" %s | awk -F\"=\" '{print $2}'" + status, output = utils.exec_cmd(GREP_BRIDGE % CONF_NETWORK, shell=True) + if not status: + pass + else: + logger.error("\"" + GREP_BRIDGE + "\"" + "error") + logger.error(output) + return False + return output[0] + +def get_ip_prefix(network, iptype, logger): + """ + get ip prefix according to IP type + """ + br = get_bridge_name(network, logger) + PREFIX = "ip -4 -o ad show %s | awk '{print $4}'|awk -F\"/\" '{print $2}'" + PREFIX_6 = "ip -6 -o ad show %s|awk '{print $4}'|awk -F\"/\" '{print $2}'" + if iptype == "ipv4": + status, output = utils.exec_cmd(PREFIX % br, shell=True) + elif iptype == "ipv6": + status, output = utils.exec_cmd(PREFIX_6 % br, shell=True) + if not status: + pass + else: + logger.error("\"" + GREP_BRIDGE + "\"" + "error") + logger.error(output) + return False + return output[0] + +def get_info_from_dnsmasq(network,macaddr,logger): + """ + generate dict for lease info from virtual network's lease file + """ + title = ['expirytime','mac','ipaddr','hostname','clientid'] + output_list = [] + lease_dnsmasq = [] + temp = [] + remove_list = [] + GREP_MAC = "grep -w %s" + " " + LEASE_FILE_DNSMASQ + CAT_FILE = "cat" + " " + LEASE_FILE_DNSMASQ + + status, output = utils.exec_cmd(CAT_FILE, shell=True) + if not status: + for i in range(0, len(output)): + output_list = [] + output_str = output[i] + for item in output_str.split(" "): + output_list.append(item) + lease_dnsmasq.append(dict(zip(title,output_list))) + + #due to no mac field in IPv6 line, so do nothing here temporarily. + if macaddr != None: + pass + + #remove bridge duid line + for i in range(0, len(lease_dnsmasq)): + if lease_dnsmasq[i]['expirytime'] == 'duid': + remove_list.append(lease_dnsmasq[i]) + + for i in range(0, len(remove_list)): + lease_dnsmasq.remove(remove_list[i]) + + #remove expiry leases + for i in range(0, len(lease_dnsmasq)): + temp = int(lease_dnsmasq[i]['expirytime']) + lease_dnsmasq[i]['expirytime'] = temp + + remove_list = [] + for i in range(0, len(lease_dnsmasq)): + if time.time() >= int(lease_dnsmasq[i]['expirytime']): + remove_list.append(lease_dnsmasq[i]) + + for i in range(0, len(remove_list)): + lease_dnsmasq.remove(remove_list[i]) + + #replace * to None + for i in range(0, len(lease_dnsmasq)): + if lease_dnsmasq[i]['hostname'] == "*": + lease_dnsmasq[i]['hostname'] = None + if lease_dnsmasq[i]['clientid'] == "*": + lease_dnsmasq[i]['clientid'] = None + + return lease_dnsmasq + else: + logger.error("\"" + CAT_FILE + "\"" + "error") + logger.error(output) + return False + +def compare_values(op1, op2, network, iptype, logger): + """ + check all printed values from API + """ + dnsmasq = op1 + api = op2 + temp = int(api['expirytime']) + api['expirytime'] = temp + + for j in range(0,len(dnsmasq)): + if dnsmasq[j]['hostname'] == api['hostname'] and \ + dnsmasq[j]['expirytime'] == api['expirytime']: + if dnsmasq[j]['ipaddr'] == api['ipaddr'] and \ + dnsmasq[j]['clientid'] == api['clientid']: + + if iptype == "ipv4": + logger.debug("PASS: hostname:%s expirytime:%s ipaddr:%s" \ + % (api['hostname'],api['expirytime'],api['ipaddr'])) + logger.debug("Unsupported: clientid: %s in IPv4" \ + % (api['clientid'])) + elif iptype == "ipv6": + logger.debug("PASS: hostname: %s expirytime: %s ipaddr: %s \ +clientid: %s" % (api['hostname'],api['expirytime'],api['ipaddr'],\ +api['clientid'])) + + if iptype == "ipv4" and api['mac'] == dnsmasq[j]['mac']: + logger.debug("PASS: mac: %s" % api['mac']) + elif iptype == "ipv6" and api['iaid'] == dnsmasq[j]['mac']: + logger.debug("PASS: iaid: %s" % api['iaid']) + else: + logger.error("Fail: mac/iaid: %s/%s" % (api['mac'], \ + api['iaid'])) + return False + + break + else: + if j == len(dnsmasq) - 1: + logger.debug("Last loop %d, FAIL: %s" % (j,api)) + logger.debug("failed on ipaddr or clientid") + return False + else: + logger.debug("Skipped loop %d,Warning: ipaddr: %s \ +clientid: %s" % (j,api['ipaddr'],api['clientid'])) + continue + else: + if j == len(dnsmasq) - 1: + logger.error("Fail: hostname: %s expirytime: %s ipaddr: %s \ +clientid: %s" % (api['hostname'],api['expirytime'],api['ipaddr'], \ +api['clientid'])) + logger.error("Last loop %d, FAIL: %s" % (j,api)) + return False + else: + logger.debug("Skipped loop %d,Warning: hostname: \ +%s expirytime: %s" % (j,api['hostname'],api['expirytime'])) + continue + if not api['iface'] == get_bridge_name(network,logger): + logger.error("FAIL: iface: %s" % api['iface']) + return False + else: + logger.debug("PASS: iface: %s" % api['iface']) + if not api['type'] == get_network_type(api['ipaddr'],logger): + logger.error("FAIL: type: %s" % api['type']) + return False + else: + logger.debug("PASS: type: %s" % api['type']) + + if not api['prefix'] == int(get_ip_prefix(network, iptype ,logger)): + logger.error("FAIL: prefix: %s" % api['prefix']) + logger.error("FAIL: %s" % api) + return False + else: + logger.debug("PASS: prefix: %s" % api['prefix']) + if iptype == "ipv4": + if not api['iaid'] == None: + logger.error("FAIL: iaid: %s" % api['iaid']) + return False + else: + logger.debug("Unsupported: iaid: %s in IPv4" % api['iaid']) + logger.debug("PASS: %s" % api) + elif iptype == "ipv6": + logger.debug("Ignoring mac checking on IPv6 line %s" % api['mac']) + logger.debug("PASS: %s" % api) + + return True + +def check_values(op1, op2, network, logger): + """ + check each line accorting to ip type, if ipv4 go to check_ipv4_values + if ipv6, go to check_ipv6_values. + """ + networkname = network + dnsmasq = op1 + api = op2 + + for i in range(0, len(api)): + if check_ip(api[i]['ipaddr'],logger) == "ipv4": + if not compare_values(dnsmasq,api[i],networkname,"ipv4",logger): + return False + elif check_ip(api[i]['ipaddr'],logger) == "ipv6": + if not compare_values(dnsmasq,api[i],networkname,"ipv6",logger): + return False + else: + logger.error("invalid list element for ipv4 and ipv6") + return False + return True + +def network_dhcp_leases(params): + """ + test API for DHCPLeases in class virNetwork + """ + global LEASE_FILE_DNSMASQ + logger = params['logger'] + networkname = params['networkname'] + LEASE_FILE_DNSMASQ = "/var/lib/libvirt/dnsmasq/" + networkname + ".leases" + mac_value = params.get('macaddr', None) + conn = sharedmod.libvirtobj['conn'] + logger.info("The given mac is %s" % (mac_value)) + + if not os.path.exists(LEASE_FILE_DNSMASQ): + logger.error("leases file for %s is not exist" % networkname) + logger.error("%s" % LEASE_FILE_DNSMASQ) + return 1 + dhcp_lease_dns = get_info_from_dnsmasq(networkname, mac_value, logger) + logger.info("From dnsmasq: %s" % (dhcp_lease_dns)) + if not dhcp_lease_dns: + return 1 + + netobj = conn.networkLookupByName(networkname) + + try: + dhcp_lease_api = netobj.DHCPLeases(mac_value,0) + if not dhcp_lease_api and dhcp_lease_dns: + logger.info("From API: %s" % (dhcp_lease_api)) + return 1 + logger.info("From API: %s" % (dhcp_lease_api)) + if not check_values(dhcp_lease_dns,dhcp_lease_api,networkname,logger): + 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 -- 1.8.3.1

Added below variables into global.cfg. netip6addr/netip6prefix/netip6start/netip6end --- global.cfg | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/global.cfg b/global.cfg index db8f71e..56677a5 100644 --- a/global.cfg +++ b/global.cfg @@ -195,6 +195,15 @@ defaultnetstart = 192.168.111.2 # default the ending address ip defaultnetend = 192.168.111.254 +# default bridge ipv6 addr +netip6addr = 2001:db8:ca2:99::1 +# default bridge ipv6 prefix +netip6prefix = 64 +# default the starting ipv6 address +netip6start = 2001:db8:ca2:99::11 +# default the ending ipv6 address +netip6end = 2001:db8:ca2:99::ff + ################################################################ # # host interface -- 1.8.3.1

--- repos/network/xmls/network.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/repos/network/xmls/network.xml b/repos/network/xmls/network.xml index 220169b..97e3517 100644 --- a/repos/network/xmls/network.xml +++ b/repos/network/xmls/network.xml @@ -7,4 +7,9 @@ <range start="NETSTART" end="NETEND"/> </dhcp> </ip> + <ip family="ipv6" address="NETIP6ADDR" prefix="NETIP6PREFIX" > + <dhcp> + <range start="NETIP6START" end="NETIP6END" /> + </dhcp> + </ip> </network> -- 1.8.3.1

Added 4 IPv6 required parameters to case. --- repos/network/define.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/repos/network/define.py b/repos/network/define.py index dd054f7..6e50eb7 100644 --- a/repos/network/define.py +++ b/repos/network/define.py @@ -17,7 +17,12 @@ required_params = ('networkname', 'bridgenetmask', 'netstart', 'netend', - 'netmode',) + 'netmode', + 'netip6addr', + 'netip6prefix', + 'netip6start', + 'netip6end', + ) optional_params = {'xml' : 'xmls/network.xml', } -- 1.8.3.1

On 01/28/2015 03:14 PM, jiahu wrote:
Added 4 IPv6 required parameters to case. --- repos/network/define.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/repos/network/define.py b/repos/network/define.py index dd054f7..6e50eb7 100644 --- a/repos/network/define.py +++ b/repos/network/define.py @@ -17,7 +17,12 @@ required_params = ('networkname', 'bridgenetmask', 'netstart', 'netend', - 'netmode',) + 'netmode', + 'netip6addr', + 'netip6prefix', + 'netip6start', + 'netip6end', + )
These ipv6 params should be optional . ACK and Pushed after modifying the patch as follows and getting the correct testing result --- repos/network/create.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/repos/network/create.py b/repos/network/create.py index 399328c..b1b3245 100644 --- a/repos/network/create.py +++ b/repos/network/create.py @@ -19,6 +19,10 @@ required_params = ('networkname', 'netend', 'netmode',) optional_params = {'xml' : 'xmls/network.xml', + 'netip6addr' : '2001b8:ca2:98::1', + 'netip6prefix' : '64', + 'netip6start' : '2001b8:ca2:98::11', + 'netip6end' : '2001b8:ca2:98::ff', } def check_network_status(*args): -- 1.8.3.1
optional_params = {'xml' : 'xmls/network.xml', }

Thanks for your correction. ----- Original Message ----- From: "hongming" <honzhang@redhat.com> To: "jiahu" <jiahu@redhat.com>, libvir-list@redhat.com Sent: Friday, January 30, 2015 1:17:12 PM Subject: Re: [libvirt] [libvirt-test-API][PATCH V2 04/11] Add IPv6 section into related network case On 01/28/2015 03:14 PM, jiahu wrote: Added 4 IPv6 required parameters to case. --- repos/network/define.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/repos/network/define.py b/repos/network/define.py index dd054f7..6e50eb7 100644 --- a/repos/network/define.py +++ b/repos/network/define.py @@ -17,7 +17,12 @@ required_params = ('networkname', 'bridgenetmask', 'netstart', 'netend', - 'netmode',) + 'netmode', + 'netip6addr', + 'netip6prefix', + 'netip6start', + 'netip6end', + ) These ipv6 params should be optional . ACK and Pushed after modifying the patch as follows and getting the correct testing result --- repos/network/create.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/repos/network/create.py b/repos/network/create.py index 399328c..b1b3245 100644 --- a/repos/network/create.py +++ b/repos/network/create.py @@ -19,6 +19,10 @@ required_params = ('networkname', 'netend', 'netmode',) optional_params = {'xml' : 'xmls/network.xml', + 'netip6addr' : '2001 b8:ca2:98::1', + 'netip6prefix' : '64', + 'netip6start' : '2001 b8:ca2:98::11', + 'netip6end' : '2001 b8:ca2:98::ff', } def check_network_status(*args): -- 1.8.3.1 optional_params = {'xml' : 'xmls/network.xml', } -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

Added a new file to store static host of IPv6 --- repos/network/xmls/ipv6-dhcp-host.xml | 1 + 1 file changed, 1 insertion(+) create mode 100644 repos/network/xmls/ipv6-dhcp-host.xml diff --git a/repos/network/xmls/ipv6-dhcp-host.xml b/repos/network/xmls/ipv6-dhcp-host.xml new file mode 100644 index 0000000..6198815 --- /dev/null +++ b/repos/network/xmls/ipv6-dhcp-host.xml @@ -0,0 +1 @@ +<host id='00:04:58:fd:e4:15:1b:09:4c:0e:09:af:e4:d3:8c:b8:ca:1e' name="redhatipv6.redhat.com" ip='2001:db8:ca2:99::119'/> -- 1.8.3.1

--- repos/network/xmls/ip-dhcp-host.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/network/xmls/ip-dhcp-host.xml b/repos/network/xmls/ip-dhcp-host.xml index 50e7908..b323218 100644 --- a/repos/network/xmls/ip-dhcp-host.xml +++ b/repos/network/xmls/ip-dhcp-host.xml @@ -1 +1 @@ -<host mac="00:16:3e:77:e2:ed" name="foo.example.com" ip="192.168.122.10" /> +<host mac="00:16:3e:77:e2:ed" name="foo.example.com" ip="192.168.122.10"/> -- 1.8.3.1

The function can get ip when domain has a non-default virual network --- utils/ipget.sh | 7 ++++++- utils/utils.py | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/utils/ipget.sh b/utils/ipget.sh index 8d44b14..c2e0983 100755 --- a/utils/ipget.sh +++ b/utils/ipget.sh @@ -1,17 +1,22 @@ #!/bin/sh mac=$1 +br=$2 if [[ -z $mac ]]; then echo "mac address is null." exit 1 fi +if [[ -z $br ]]; then + echo "bridge name is null." + exit 1 +fi if ! type nmap >/dev/null 2>&1; then echo "nmap package needs to be installed." exit 1 fi -ipaddr=`ip route |grep virbr0 |sed -n 1p|awk {'print $1'}` +ipaddr=`ip route |grep $br |sed -n 1p|awk {'print $1'}` #if lsmod | grep kvm > /dev/null ;then # ipaddr=`ip route |grep switch |sed -n 1p|awk {'print $1'}` diff --git a/utils/utils.py b/utils/utils.py index 147c1ef..f841c27 100644 --- a/utils/utils.py +++ b/utils/utils.py @@ -349,7 +349,7 @@ def locate_utils(): result = re.search('(.*)libvirt-test-API(.*)', pwd) return result.group(0) + "/utils" -def mac_to_ip(mac, timeout): +def mac_to_ip(mac,br,timeout): """Map mac address to ip Return None on FAILURE and the mac address on SUCCESS @@ -357,10 +357,13 @@ def mac_to_ip(mac, timeout): if not mac: return None + if not br: + return None + if timeout < 10: timeout = 10 - cmd = "sh " + locate_utils() + "/ipget.sh " + mac + cmd = "sh " + locate_utils() + "/ipget.sh " + mac + " " + br while timeout > 0: (ret, out) = commands.getstatusoutput(cmd) -- 1.8.3.1

--- kickstart.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kickstart.cfg b/kickstart.cfg index 446adf0..d4b40a8 100644 --- a/kickstart.cfg +++ b/kickstart.cfg @@ -6,7 +6,7 @@ url --url=http://fileshare.englab.nay.redhat.com/pub/redhat/rhel/released/RHEL-6 lang en_US.UTF-8 keyboard us -network --device eth0 --bootproto dhcp +network --device eth0 --bootproto dhcp --ipv6 dhcp rootpw --iscrypted $6$45lFuCoyFZwpy3Gn$kvCuoEVXyK0q6ow7qBmo9vaEyajunJ62LR5HlmAKRAOpK/Z2ZyrSSbaPsSHnhZU2P1MF5e.QDu2wkOOo661It. zerombr clearpart --all --initlabel -- 1.8.3.1

--- repos/domain/xmls/kvm_linux_guest_install_cdrom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/domain/xmls/kvm_linux_guest_install_cdrom.xml b/repos/domain/xmls/kvm_linux_guest_install_cdrom.xml index cb59e76..1e7999b 100644 --- a/repos/domain/xmls/kvm_linux_guest_install_cdrom.xml +++ b/repos/domain/xmls/kvm_linux_guest_install_cdrom.xml @@ -28,7 +28,7 @@ <readonly/> </disk> <interface type="network"> - <source network="default"/> + <source network="NETWORKSOURCE"/> <mac address='MACADDR'/> <model type='NICDRIVER'/> </interface> -- 1.8.3.1

--- repos/domain/destroy.py | 5 +++-- repos/domain/install_linux_cdrom.py | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/repos/domain/destroy.py b/repos/domain/destroy.py index 91e83ea..154ffaf 100644 --- a/repos/domain/destroy.py +++ b/repos/domain/destroy.py @@ -12,7 +12,7 @@ from src import sharedmod from utils import utils required_params = ('guestname',) -optional_params = {'flags' : 'noping'} +optional_params = {'flags' : 'noping','bridgename' : 'virbr0',} def destroy(params): """destroy domain @@ -32,6 +32,7 @@ def destroy(params): logger = params['logger'] params.pop('logger') guestname = params['guestname'] + br = params['bridgename'] flags = "" if params.has_key('flags'): flags = params['flags'] @@ -58,7 +59,7 @@ def destroy(params): # Get domain ip mac = utils.get_dom_mac_addr(guestname) logger.info("get ip by mac address") - ip = utils.mac_to_ip(mac, 180) + ip = utils.mac_to_ip(mac,br,180) logger.info("the ip address of guest is %s" % ip) # Destroy domain diff --git a/repos/domain/install_linux_cdrom.py b/repos/domain/install_linux_cdrom.py index 239f85e..9d3a7e9 100644 --- a/repos/domain/install_linux_cdrom.py +++ b/repos/domain/install_linux_cdrom.py @@ -30,6 +30,8 @@ optional_params = { 'type' : 'define', 'xml': 'xmls/kvm_linux_guest_install_cdrom.xml', 'guestmachine': 'pc', + 'networksource': 'default', + 'bridgename': 'virbr0', } VIRSH_QUIET_LIST = "virsh --quiet list --all|awk '{print $2}'|grep \"^%s$\"" @@ -145,6 +147,7 @@ def install_linux_cdrom(params): guestname = params.get('guestname') guestos = params.get('guestos') guestarch = params.get('guestarch') + br = params['bridgename'] xmlstr = params['xml'] logger.info("the name of guest is %s" % guestname) @@ -301,7 +304,7 @@ def install_linux_cdrom(params): time.sleep(10) timeout -= 10 - ip = utils.mac_to_ip(mac, 180) + ip = utils.mac_to_ip(mac,br,180) if not ip: logger.info(str(timeout) + "s left") -- 1.8.3.1

For running the case, should setup testing environment before the case, and clean up the environment after the case. --- cases/basic_network.conf | 100 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/cases/basic_network.conf b/cases/basic_network.conf index e9abd57..b617320 100644 --- a/cases/basic_network.conf +++ b/cases/basic_network.conf @@ -216,3 +216,103 @@ network:destroy networkname $defaultnetname +network:define + networkname + $defaultnetname + bridgename + $defaultbridgename + bridgeip + $defaultnetip + bridgenetmask + $defaultnetmask + netstart + $defaultnetstart + netend + $defaultnetend + netmode + nat + netip6addr + $netip6addr + netip6prefix + $netip6prefix + netip6start + $netip6start + netip6end + $netip6end + +network:start + networkname + $defaultnetname + +network:update + networkname + $defaultnetname + command + add-first + section + ip-dhcp-host + xml + xmls/ip-dhcp-host.xml + +network:update + networkname + $defaultnetname + command + add-first + section + ip-dhcp-host + parentIndex + 1 + xml + xmls/ipv6-dhcp-host.xml + +domain:install_linux_cdrom + guestname + $defaultname + guestos + rhel6 + guestarch + $defaultarch + vcpu + $defaultvcpu + memory + $defaultmem + hddriver + $defaulthd + nicdriver + $defaultnic + macaddr + 00:16:3e:77:e2:ed + networksource + $defaultnetname + bridgename + $defaultbridgename + +network:network_dhcp_leases + networkname + $defaultnetname + +network:network_dhcp_leases + networkname + $defaultnetname + macaddr + 00:16:3e:77:e2:ed + +domain:destroy + guestname + $defaultname + bridgename + $defaultbridgename + +domain:undefine + guestname + $defaultname + +network:destroy + networkname + $defaultnetname + +network:undefine + networkname + $defaultnetname + -- 1.8.3.1
participants (3)
-
hongming
-
jiahu
-
Jianwei Hu