On 11/22/2012 11:56 AM, hongming wrote:
The managedsave test cases and test suite cover test include
verifying virsh commands managedsave(include all flags and their
combination)/managedsave-remove and managedSaveRemove/ManagedSave/
hasManagedSaveImage python APIs.
The following new files be created.
new file: cases/managedsave.conf
- Test all test cases
new file: repos/managedsave/__init__.py
new file: repos/managedsave/managedsave.py
- Test mangaedsave command/API and all flags
new file: repos/managedsave/managedsave_remove.py
- Test managedsave-remove command/API
new file: repos/managedsave/managedsave_start.py
- Verfiy managedsave'flags and start from managedsave image
---
cases/managedsave.conf | 63 ++++++++++++
repos/managedsave/managedsave.py | 162 +++++++++++++++++++++++++++++++
repos/managedsave/managedsave_remove.py | 61 ++++++++++++
repos/managedsave/managedsave_start.py | 152 +++++++++++++++++++++++++++++
4 files changed, 438 insertions(+), 0 deletions(-)
create mode 100644 cases/managedsave.conf
create mode 100644 repos/managedsave/__init__.py
create mode 100644 repos/managedsave/managedsave.py
create mode 100644 repos/managedsave/managedsave_remove.py
create mode 100644 repos/managedsave/managedsave_start.py
diff --git a/cases/managedsave.conf b/cases/managedsave.conf
new file mode 100644
index 0000000..8dcafe2
--- /dev/null
+++ b/cases/managedsave.conf
@@ -0,0 +1,63 @@
+domain:install_linux_cdrom
+ guestname
+ $defaultname
+ guestos
+ $defaultos
+ guestarch
+ $defaultarch
+ vcpu
+ $defaultvcpu
+ memory
+ $defaultmem
+ hddriver
+ $defaulthd
+ nicdriver
+ $defaultnic
+ imageformat
+ qcow2
+ macaddr
+ 54:52:00:4a:16:30
+
+#VIR_DOMAIN_SAVE_BYPASS_CACHE = 1
+#VIR_DOMAIN_SAVE_RUNNING = 2
+#VIR_DOMAIN_SAVE_PAUSED = 4
+#No_FLAGS = 0
+managedsave:managedsave
+ guestname
+ $defaultname
+ flags
+ 1|2
+
+managedsave:managedsave_start
+ guestname
+ $defaultname
+ flags
+ noping
+
+managedsave:managedsave
+ guestname
+ $defaultname
+ flags
+ 1|4
+
+managedsave:managedsave_start
+ guestname
+ $defaultname
+ flags
+ noping
+
+managedsave:managedsave
+ guestname
+ $defaultname
+ flags
+ 0
+
+managedsave:managedsave_remove
+ guestname
+ $defaultname
+
+managedsave:managedsave_start
+ guestname
+ $defaultname
+ flags
+ noping
diff --git a/repos/managedsave/__init__.py b/repos/managedsave/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/repos/managedsave/managedsave.py b/repos/managedsave/managedsave.py
new file mode 100644
index 0000000..5e7c105
--- /dev/null
+++ b/repos/managedsave/managedsave.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+import os
+import math
+
+import libvirt
+from libvirt import libvirtError
+
+from src import sharedmod
+from utils import utils
+
+required_params = ('guestname', 'flags',)
+optional_params = {}
+
+def check_guest_status(*args):
+ """Check guest current status"""
+ (domobj, logger) = args
+ state = domobj.info()[0]
+ logger.debug("current guest status: %s" % state)
+
+ if state == libvirt.VIR_DOMAIN_SHUTOFF or \
+ state == libvirt.VIR_DOMAIN_SHUTDOWN or \
+ state == libvirt.VIR_DOMAIN_BLOCKED:
+ return False
+ else:
+ return True
+
+def check_savefile_create(*args):
+ """Check guest's managed save file be created"""
+
+ (guestname) = args
+ cmds = "ls /var/lib/libvirt/qemu/save/%s" % guestname + ".save
-lh"
+ logger.info("Execute cmd %s" % cmds)
+ (status, output) = utils.exec_cmd(cmds, shell=True)
+ if status != 0:
+ logger.error("No managed save file")
+ return False
+ else :
+ logger.info("managed save file exists")
+ return True
+
+def compare_cachedfile(cachebefore, cacheafter):
+ """Compare cached value before managed save and its value after
+ managed save """
+
+ diff = cacheafter - cachebefore
+ logger.info("diff is %s " % diff)
+ percent = math.fabs(diff)/cachebefore
+ logger.info("diff percent is %s " % percent)
+ if math.fabs(diff)/cachebefore < 0.05:
We get the variable 'percent', we can use it here instead
of computing it twice.
+ return True
+ else:
+ return False
+
+def get_cachevalue():
+ """Get the file system cached value """
+
+ cmds = "head -n4 /proc/meminfo|grep Cached|awk '{print $2}'"
+ (status, output) = utils.exec_cmd(cmds, shell=True)
+ if status != 0:
+ logger.error("failed to run cmd line to get cache")
+ return 1
+ else:
+ logger.debug(output[0])
+ cachevalue= int(output[0])
+ return cachevalue
+
+def managedsave(params):
+ """Managed save a running domain"""
+
+ global logger
+ logger = params['logger']
+ guestname = params['guestname']
+ flags = params ['flags']
+ #Save given flags to sharedmod.data
+ sharedmod.data['flagsave'] = flags
+
+ logger.info("The given flags are %s " % flags)
+ if not '|' in flags:
+ flagn = int(flags)
+ else:
+ flagstr = flags.split('|')
+ flagcont = ''.join(flagstr)
+ length = len(flagcont)
+ # bitwise-OR of flags of managedsave
+ flagn = int(flagcont[0])
+ for i in range(0,length-1):
+ flagn = flagn |int(flagcont[i+1])
The else branch codes are a little more complicated.
The following is better I think.
flaglist = flags.split('|');
flagn = 0;
for flag in flaglist:
flagn |= int(flag)
+
+ conn = sharedmod.libvirtobj['conn']
+ domobj = conn.lookupByName(guestname)
+
+ if not check_guest_status(domobj, logger):
+ logger.error("Error: current guest status is shutoff")
We can omit the "Error" string in the logger.error("...")
+ return 1
+
+ try:
+
+ logger.info("bitwise OR value of flags is %s" % flagn)
+
+ if flagn == 0:
+ logger.info("managedsave %s domain with no flag" % guestname)
+ elif flagn == 1:
+ logger.info("managedsave %s domain --bypass-cache" % guestname)
+ elif flagn == 2:
+ logger.info("managedsave %s domain --running" % guestname)
+ elif flagn == 3:
+ logger.info("managedsave %s domain --running --bypass-cache"\
+ % guestname)
+ elif flagn == 4:
+ logger.info("managedsave %s domain --paused" % guestname)
+ elif flagn == 5:
+ logger.info("managedsave %s domain --paused --bypass-cache"\
+ % guestname)
+ elif flagn == 6:
+ logger.error("Error:--running and --paused are mutually
exclusive")
The same.
+ return 1
+ elif flagn == 7:
+ logger.error("Error:--running and --paused are mutually
exclusive")
The same.
+ return 1
+ else:
+ logger.error("Error:Wrong flags be given and fail to \
+ managedsave domain")
The same.
+ return 1
+
+ #If given flags include bypass-cache,check if bypass file system cache
+ if flagn %2 == 1:
Add a space between "%": if flagn % 2 == 1
+ logger.info("Given flags include
--bypass-cache")
+ os.system('echo 3 > /proc/sys/vm/drop_caches')
+ cache_before = get_cachevalue()
+ logger.info("Cached value before managedsave is %s" %
cache_before)
+
+ domobj.managedSave(flagn)
+
+ cache_after = get_cachevalue()
+ logger.info("Cached value after managedsave is %s" % cache_after)
+
+ if compare_cachedfile(cache_before, cache_after):
+ logger.info("Bypass file system cache successfully")
+ else:
+ logger.error("Bypass file system cache failed")
+ return 1
+ else:
+ domobj.managedSave(flagn)
+
+ #Check if domain has managedsave image
+ if domobj.hasManagedSaveImage(0) and \
+ domobj.info()[0]==libvirt.VIR_DOMAIN_SHUTOFF and \
+ check_savefile_create(guestname):
+ logger.info("Domain %s managedsave successfully " % guestname)
+ else:
+ logger.error("Error: fail to managedsave domain")
The same
+ return 1
+
+ except libvirtError, e:
+ logger.error("API error message: %s, error code is %s" \
+ % e.message)
+ logger.error("Error: fail to managedsave %s domain" % guestname)
+ return 1
+
+ return 0
+
diff --git a/repos/managedsave/managedsave_remove.py
b/repos/managedsave/managedsave_remove.py
new file mode 100644
index 0000000..143312f
--- /dev/null
+++ b/repos/managedsave/managedsave_remove.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+# Save domain as a statefile
+
+import libvirt
+from libvirt import libvirtError
+
+from src import sharedmod
+from utils import utils
+
+required_params = ('guestname',)
+optional_params = {}
+
+def check_savefile_remove(*args):
+ """Check if guest's managedsave file be removed
"""
+
+ (guestname) = args
+ cmds = "ls /var/lib/libvirt/qemu/save/%s" % guestname + ".save
-lh"
+ logger.info("Execute cmd %s" % cmds)
+ (status, output) = utils.exec_cmd(cmds, shell=True)
+ if status != 0:
+ logger.info("No managed save file")
+ return True
+ else :
+ logger.error("managed save file exits")
+ return False
+
+
+def managedsave_remove(params):
+ """Remove an existing managed save state file from a
domain"""
+
+ global logger
+ logger = params['logger']
+ guestname = params['guestname']
+
+ conn = sharedmod.libvirtobj['conn']
+ domobj = conn.lookupByName(guestname)
+
+ if not domobj.hasManagedSaveImage(0) and check_savefile_remove(guestname):
+ logger.info("Domain %s hasn't managedsave image" % guestname)
logger.error("...")
+ return 1
+ else:
+ logger.info("Domain %s has managedsave image" % guestname)
+
+ try:
+ domobj.managedSaveRemove(0)
+ #Check if domain has managedsave image
+ if not domobj.hasManagedSaveImage(0) and \
+ check_savefile_remove(guestname):
+ logger.info("Domain %s's managedsave image has been removed"\
+ % guestname)
+ else:
+ logger.error("Error: fail to remove managedsave domain")
+ return 1
+
+ except libvirtError, e:
+ logger.error("API error message: %s, error code is %s" % e.message)
+ logger.error("Error: fail to managedsave %s domain" % guestname)
+ return 1
+
+ return 0
+
diff --git a/repos/managedsave/managedsave_start.py
b/repos/managedsave/managedsave_start.py
new file mode 100644
index 0000000..f5da0b3
--- /dev/null
+++ b/repos/managedsave/managedsave_start.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python
+
+import time
+
+import libvirt
+from libvirt import libvirtError
+
+from src import sharedmod
+from utils import utils
+
+required_params = ('guestname',)
+optional_params = {'flags' : ''}
+
+NONE = 0
+START_PAUSED = 1
+START_BYPASS_CACHE = 4
+START_FORCE_BOOT = 8
+
+def check_savefile_remove(*args):
+ """Check guest managed save file"""
+ (guestname) = args
+ cmds = "ls /var/lib/libvirt/qemu/save/%s" % guestname + ".save
-lh"
+ logger.info("Execute cmd %s" % cmds)
+ (status, output) = utils.exec_cmd(cmds, shell=True)
+ if status != 0:
+ logger.info("No managed save file")
+ return True
+ else :
+ logger.error("managed save file exists")
+ return False
+
+def managedsave_start(params):
+ """ Start domain with managedsave image and check if its status is
rigth
s/rigth/right
+ according to given flags of running managedsave command.If
it is
+ correctly paused , resume it.
+
+ Argument is a dictionary with two keys:
+ {'logger': logger, 'guestname': guestname}
+
+ logger -- an object of utils/log.py
+ mandatory arguments : guestname -- same as the domain name
+ optional arguments : flags -- domain create flags <none|start_paused
+ |noping>.It allows only one flag be given.
+
+ Return 0 on SUCCESS or 1 on FAILURE
+ """
+ domname = params['guestname']
+ global logger
+ logger = params['logger']
+ flags = params.get('flags', '')
+ # Get given flags of managedsave
+ if sharedmod.data.has_key('flagsave'):
+ flagsave = sharedmod.data.get('flagsave')
+ else:
+ logger.error("Failed to get flags from managedsave")
+ # Clean sharedmod.data
+ sharedmod.data = {}
+
+ conn = sharedmod.libvirtobj['conn']
+ domobj = conn.lookupByName(domname)
+
+ timeout = 600
+ logger.info('start domain')
+ # Check if guest has managedsave image before start
+ if domobj.hasManagedSaveImage(0) :
+ logger.info("Domain has managedsave image")
+ else:
+ logger.info("Domain hasn't managedsave image")
+
+ try:
+ if "none" in flags:
+ domobj.createWithFlags(NONE)
+ elif "start_paused" in flags:
+ domobj.createWithFlags(START_PAUSED)
+ else:
+ # this covers flags = None as well as flags = 'noping'
+ domobj.create()
+ except libvirtError, e:
+ logger.error("API error message: %s, error code is %s" \
+ % e.message)
+ logger.error("start failed")
+ return 1
+
+ while timeout:
+ state = domobj.info()[0]
+ expect_states = [libvirt.VIR_DOMAIN_RUNNING,libvirt.VIR_DOMAIN_PAUSED,\
+ libvirt.VIR_DOMAIN_NOSTATE,libvirt.VIR_DOMAIN_BLOCKED]
+
+ if state in expect_states:
+ break
+
+ time.sleep(10)
+ timeout -= 10
+ logger.info(str(timeout) + "s left")
+
+ if timeout <= 0:
+ logger.error('The domain state is not as expected, state: ' + state)
+ return 1
+
+ logger.info("Guest started")
+
+ """If domain's current state is paused. Check if start command
has
+ --paused flag or managedsave has --paused flag (given flags in managedsave
+ include '4'). If yes, it means domain successfully paused , then resume it.
+ If not, throw error -guest state error."""
+
+ if state == libvirt.VIR_DOMAIN_PAUSED:
+ if "start_paused" in flags or "4" in flagsave:
+ logger.info("Guest paused successfully ")
+
+ try:
+ domobj.resume()
+
+ except libvirtError, e:
+ logger.error("API error message: %s, error code is %s" \
+ % e.message)
+ logger.error("resume failed")
+ return 1
+ stateresume = domobj.info()[0]
+ expect_states = [libvirt.VIR_DOMAIN_RUNNING, \
+ libvirt.VIR_DOMAIN_NOSTATE, \
+ libvirt.VIR_DOMAIN_BLOCKED]
+ if stateresume not in expect_states:
+ logger.error('The domain state is not equal to
"paused"')
+ return 1
+ else:
+ logger.info('Domain resume successfully')
+ return 0
+ else:
+ logger.error("guest state error")
+ return 1
+
+ # Get domain ip and ping ip to check domain's status
+ if not "noping" in flags:
+ mac = utils.get_dom_mac_addr(domname)
+ logger.info("get ip by mac address")
+ ip = utils.mac_to_ip(mac, 180)
+
+ logger.info('ping guest')
+ if not utils.do_ping(ip, 300):
+ logger.error('Failed on ping guest, IP: ' + str(ip))
+ return 1
+
+ # Check if domain' managedsave image exists,if not, return 0.
+ if not domobj.hasManagedSaveImage(0) and check_savefile_remove(domname):
+ logger.info("Domain %s with managedsave image successfully start" \
+ % domname)
+ return 0
+ else:
+ logger.info("Failed to start domain s% with managedsave image" \
+ % domname)
logger.error("...")
+ return 1
After I ran these testcases, they are good for me except spots
above I commented on.
Another thing you should note is to remove trailing spaces in
codes.
Appending the following two lines into /etc/vimrc could
highlights them, then remove them.
"highlight RedundantSpaces ctermbg=red guibg=red
match RedundantSpaces /\s\+$\| \+\ze\t/
"
Please send v2, thanks.
Guannan