Change in vdsm[master]: dump the core of a domain

shaohef at linux.vnet.ibm.com shaohef at linux.vnet.ibm.com
Mon Aug 20 08:01:48 UTC 2012


ShaoHe Feng has uploaded a new change for review.

Change subject: dump the core of a domain
......................................................................

dump the core of a domain

libvirt support an API to dump the core of a domain on a given file for
analysis when guest OS crash.

There are two kind of dump files. one is QEMU suspend to disk image.
the other is core file which like kdump file butcontains registers'
value.

It's helpful to support by VDSM to find root cause if a guest gets hang
and kdump isn't set up in it. This would be a good RAS feature.

Here's the definition of the new API:
coreDump:
    This method will dump the core of a domain on a given file for
    analysis.

    Input parameter:
        vmId  - VM UUID
        to    - the core file named by the user
        flags - defined in libvirt.py
                VIR_DUMP_CRASH
                VIR_DUMP_LIVE
                VIR_DUMP_BYPASS_CACHE
                VIR_DUMP_RESET
                VIR_DUMP_MEMORY_ONLY

    Return value:
        success: return doneCode
        failure: return errCode including underlying libvirt error message.

Change-Id: If4aac9e747dc7aa64a6ff5ef256a7a4375aa2bb5
Signed-off-by: ShaoHe Feng <shaohef at linux.vnet.ibm.com>
---
M vdsm/API.py
M vdsm/BindingXMLRPC.py
M vdsm/define.py
M vdsm/libvirtvm.py
M vdsm_cli/vdsClient.py
5 files changed, 80 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/29/7329/1

diff --git a/vdsm/API.py b/vdsm/API.py
index 19cbb42..e2b24cb 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -244,6 +244,12 @@
             self.log.debug("Error creating VM", exc_info=True)
             return errCode['unexpected']
 
+    def coreDump(self, to, flags):
+        v = self._cif.vmContainer.get(self._UUID)
+        if not v:
+            return errCode['noVM']
+        return v.coreDump(to, flags)
+
     def desktopLock(self):
         """
         Lock user session in guest operating system using guest agent.
diff --git a/vdsm/BindingXMLRPC.py b/vdsm/BindingXMLRPC.py
index cc5300f..be71e6a 100644
--- a/vdsm/BindingXMLRPC.py
+++ b/vdsm/BindingXMLRPC.py
@@ -208,6 +208,10 @@
         vm = API.VM(vmId)
         return vm.cont()
 
+    def vmCoreDump(self, vmId, to, flags):
+        vm = API.VM(vmId)
+        return vm.coreDump(to, flags)
+
     def vmReset(self, vmId):
         vm = API.VM(vmId)
         return vm.reset()
@@ -725,6 +729,7 @@
                 (self.getVMList, 'list'),
                 (self.vmPause, 'pause'),
                 (self.vmCont, 'cont'),
+                (self.vmCoreDump, 'coreDump'),
                 (self.vmSnapshot, 'snapshot'),
                 (self.vmMerge, 'merge'),
                 (self.vmMergeStatus, 'mergeStatus'),
diff --git a/vdsm/define.py b/vdsm/define.py
index 31deb4f..1fedac5 100644
--- a/vdsm/define.py
+++ b/vdsm/define.py
@@ -114,6 +114,10 @@
             'mergeErr':     {'status':
                              {'code': 52,
                               'message': 'Merge failed'}},
+            'coreDumpErr':  {'status':
+                             {'code': 54,
+                              'message':
+                              'Failed to get coreDump file'}},
             'recovery':     {'status':
                              {'code': 99,
                               'message':
diff --git a/vdsm/libvirtvm.py b/vdsm/libvirtvm.py
index 4554fee..cbd9f96 100644
--- a/vdsm/libvirtvm.py
+++ b/vdsm/libvirtvm.py
@@ -1904,6 +1904,27 @@
 
         self.saveState()
 
+    def coreDump(self, to, flags):
+
+        def reportError(key='coreDumpErr', msg=None):
+            self.log.error("get coreDump failed", exc_info=True)
+            if msg == None:
+                error = errCode[key]
+            else:
+                error = {'status' : {'code': errCode[key] \
+                         ['status']['code'], 'message': msg}}
+            return error
+
+        if self._dom == None:
+            return reportError()
+        try:
+            self._dom.coreDump(to, flags)
+        except libvirt.libvirtError, e:
+            if e.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN:
+                return reportError(key='noVM')
+            return reportError(msg=e.message)
+        return {'status': doneCode}
+
     def changeCD(self, drivespec):
         return self._changeBlockDev('cdrom', 'hdc', drivespec)
 
diff --git a/vdsm_cli/vdsClient.py b/vdsm_cli/vdsClient.py
index eeb7c95..cdcd3a8 100644
--- a/vdsm_cli/vdsClient.py
+++ b/vdsm_cli/vdsClient.py
@@ -1589,6 +1589,33 @@
 
         return status['status']['code'], status['status']['message']
 
+    def coreDump(self, args):
+        DUMPFLAGS = {'crash': 1 << 0,
+                     'live': 1 << 1,
+                     'bypass-cache': 1 << 2,
+                     'reset': 1 << 3,
+                     'memory-only': 1 << 4}
+        flags = 0
+        vmId = args[0]
+        coreFile = args[1]
+        params = {}
+        if len(args) > 2:
+            for arg in args[2:]:
+                kv = arg.split('=', 1)
+                if len(kv) < 2:
+                    params[kv[0]] = "True"
+                else:
+                    params[kv[0]] = kv[1]
+        for k, v in params.items():
+            if v.lower() == "true" or not v:
+                try:
+                    flags = flags + DUMPFLAGS[k]
+                except KeyError:
+                    print "unrecognized optoin %s for cormDump command" % k
+        response = self.s.coreDump(vmId, coreFile, flags)
+        return response['status']['code'], response['status']['message']
+
+
 if __name__ == '__main__':
     if _glusterEnabled:
         serv = ge.GlusterService()
@@ -2239,6 +2266,23 @@
                        ('<vmId> <sdUUID> <imgUUID> <baseVolUUID> <volUUID>',
                        "Take a live snapshot"
                       )),
+        'coreDump':  (serv.coreDump,
+                       ('<vmId> <file> [live=<True>] '
+                        '[crash=<True>] [bypass-cache=<True>] '
+                        '[reset=<True>] [memory-only=<True>]',
+                        "get memeory dump or migration file"
+                        'optional params:',
+                        'crash:        crash the domain after core dump'
+                              'default False',
+                        'live:         perform a live core dump if supported, '
+                              'default False',
+                        'bypass-cache: avoid file system cache when saving'
+                              'default False',
+                        'reset:        reset the domain after core dump'
+                              'default False',
+                        "memory-only:  dump domain's memory only"
+                              'default False'
+                      )),
     }
     if _glusterEnabled:
         commands.update(ge.getGlusterCmdDict(serv))


--
To view, visit http://gerrit.ovirt.org/7329
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If4aac9e747dc7aa64a6ff5ef256a7a4375aa2bb5
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: ShaoHe Feng <shaohef at linux.vnet.ibm.com>


More information about the vdsm-patches mailing list