]> xenbits.xensource.com Git - xenrt-citrix/xenrt.git/commitdiff
CA-188697 Fix checkGuestMemory and move guest memory logic to OS classes
authorAlex Brett <alex.brett@citrix.com>
Thu, 12 Nov 2015 14:24:03 +0000 (14:24 +0000)
committerAlex Brett <alex.brett@citrix.com>
Thu, 12 Nov 2015 14:24:03 +0000 (14:24 +0000)
This change creates a new property 'visibleMemory' on the OS interface, which returns the amount of memory visible to the guest in MB.
The existing method is now just a wrapper for the new method.
Also remove all concept of unit (and just define it to be in MB) from memory methods.

exec/testcases/benchmarks/workloads.py
exec/testcases/xenserver/tc/smoketest.py
exec/xenrt/interfaces.py
exec/xenrt/lib/opsys/linux.py
exec/xenrt/lib/opsys/windows.py
exec/xenrt/lib/xenserver/guest.py
exec/xenrt/lib/xenserver/host.py
exec/xenrt/objects.py

index d2878fd9e174370bd105bdadba6235f5a9c1346e..b6a27ec63bb86de5056d9da0b944e9e1a30f99c2 100755 (executable)
@@ -85,7 +85,7 @@ class Workload(object):
                                                             self.workdir))
         try:
             xenrt.TEC().logverbose("Memory details: %s" % 
-                                   (self.guest.getMyMemory(complete=True)))
+                                   (self.guest.getMyMemory()))
         except:
             pass
         time.sleep(5)
index af06bf34fb7eeefcba4fd506aab7ac0063316f86..b09d2a7df11d3b513df2f34e8941a4f4e5042525 100755 (executable)
@@ -142,18 +142,11 @@ class _TCSmokeTest(xenrt.TestCase):
         if expected is None:
             return
 
-        if not self.guest.windows:
-            guestMemory = self.guest.getGuestMemory()
-            # Take into account any kdump kernel
-            kdumpSize = self.guest.os.getKdumpSize()
-            if kdumpSize:
-                xenrt.TEC().logverbose("Taking into account %uMB of crash kernel" % (kdumpSize / xenrt.MEGA))
-                guestMemory += (kdumpSize / xenrt.MEGA)
-            difference = abs(expected - guestMemory)
-            diffpct = (float(difference) / float(expected)) * 100
-            if diffpct > 4:
-                raise xenrt.XRTFailure("Guest reports %uMB memory, expecting %uMB" % (guestMemory, expected))
-
+        guestMemory = self.guest.os.visibleMemory
+        difference = abs(expected - guestMemory)
+        diffpct = (float(difference) / float(expected)) * 100
+        if diffpct > 4:
+            raise xenrt.XRTFailure("Guest reports %uMB memory, expecting %uMB" % (guestMemory, expected))
 
     def setMemory(self):
         self.guest.shutdown()
index fa5e27f50cb7d2ffe0e3eefe0f66d12ad7167c75..983d49533a25a271343ae2c531cf7326a9ba811d 100644 (file)
@@ -130,6 +130,8 @@ class OS(Interface):
 
     tcpCommunicationPorts = Attribute("TCP Ports needed for inbound communication, of type {name:port}")
 
+    visibleMemory = Attribute("Memory visible to the guest OS in MB")
+
     def knownDistro(distro):
         """Determine if the given distro is known to this library"""
 
index d8ad73b742393ebf48289b94767af793466ff50d..0bf7412708d7b3f0f4eb38c5f5c20729e02966c7 100644 (file)
@@ -160,6 +160,14 @@ class LinuxOS(OS):
     def defaultMemory(self):
         return 256
 
+    @property
+    def visibleMemory(self):
+        """Memory visible on the guest in MB, including any used by a crash kernel"""
+        assert self.parent._osParent_getPowerState() == xenrt.PowerState.up, "OS not running"
+        data = self.execcmd("cat /proc/meminfo")
+        rc = re.search(r"MemTotal:\s+(\d+)\s+kB", data)
+        return (int(rc.group(1)) - self._getKdumpSize()) / xenrt.KILO
+
     def assertHealthy(self, quick=False):
         if self.parent._osParent_getPowerState() == xenrt.PowerState.up:
             # Wait for basic SSH access
@@ -185,8 +193,8 @@ class LinuxOS(OS):
         else:
             detectionState.password = obj.password
 
-    def getKdumpSize(self):
-        """Returns the size (in bytes) of any crashdump kernel present on the OS"""
+    def _getKdumpSize(self):
+        """Returns the size (in kB) of any crashdump kernel present on the OS"""
         size = int(self.execSSH("[ -e /sys/kernel/kexec_crash_size ] && cat /sys/kernel/kexec_crash_size || echo 0").strip())
-        return size or None
+        return size / xenrt.KILO
 
index 1fa8bdb2e84cb138e6b6b5b80e8144f3303b759d..6076d57bf9045cec0c1a48c0e887cccaeff55760 100644 (file)
@@ -1367,6 +1367,11 @@ $connections | % {$_.GetNetwork().SetCategory(1)}""", powershell=True)
             start = time.mktime(startTime)
         return time.time() - start
 
+    @property
+    def visibleMemory(self):
+        assert self.parent._osParent_getPowerState() == xenrt.PowerState.up, "OS not running"
+        return self.getMemory(False, xenrt.MEGA)
+
     @classmethod
     def detect(cls, parent, detectionState):
         obj = cls.testInit(parent)
index ddd65e31a8a4a36affc512f6a3e0612901f9d5e1..069468361c64b188dccec686354fff65c9afdfee 100755 (executable)
@@ -1153,8 +1153,8 @@ users:
             macs.append(vif[0])
         return macs 
 
-    def getDomainMemory(self, unit=xenrt.MEGA):
-        return self.getHost().getGuestMemory(self, unit=unit)
+    def getDomainMemory(self):
+        return self.getHost().getGuestMemory(self)
 
     def getDomainVCPUs(self):
         return self.getHost().getGuestVCPUs(self)
index d8abb14bdcd93b3578edc0c5525b77160e3b15e2..67cb8241e07a3e104ac88ad64174e87d638abe8d 100755 (executable)
@@ -4398,13 +4398,13 @@ fi
         cli = self.getCLIInstance()
         cli.execute("host-syslog-reconfigure host-uuid=%s" % (self.getMyHostUUID()))
             
-    def getGuestMemory(self, guest, unit = xenrt.MEGA):
+    def getGuestMemory(self, guest):
         # Sometimes it take a few seconds for xapi to notice a memory
         # change after a migration.
         for i in range(3):
             m = int(self.genParamGet("vm",
                                      guest.getUUID(),
-                                     "memory-actual"))/unit
+                                     "memory-actual"))/xenrt.MEGA
             if m > 0:
                 return m
             xenrt.sleep(3)
index a0938d90ec55606c2a290fb87a8a90459de7eb34..17e136c7416effef790eca29a00473f3a2f44051 100755 (executable)
@@ -259,27 +259,14 @@ class GenericPlace(object):
             barch = "x86-32"
         return barch
 
-    def getMyMemory(self, complete=False, unit=xenrt.MEGA):
+    def getMyMemory(self):
         """ This is how an OS inside a guest VM thinks about its physical
         memory. The figure is quite likely to be the same as the one used for
         VM creation (an integral metabytes) despite the actual memory (as
         obtained via "memory-actual") can be smaller.
         """
         try:
-            xenrt.TEC().logverbose("getMemory on %s" % (self.getIP()))
-            if self.windows:
-                if complete:
-                    rc = self._xmlrpc().getMemory(True,unit)
-                else:
-                    rc = self._xmlrpc().getMemory(False,unit)
-            elif re.search("solaris", self.distro):
-                rc = int(self.execcmd("prtconf | grep Mem|awk '{if ($1 == \"Memory\") {print $3}}'"))
-            else:
-                data = self.execcmd("cat /proc/meminfo")
-                rc = re.search(r"MemTotal:\s+(\d+)\s+kB", data)
-                rc = int(rc.group(1))/xenrt.KILO
-            xenrt.TEC().logverbose(" ... getMemory done")
-            return rc
+            return self.os.visibleMemory
         except Exception, e:
             self.checkHealth()
             raise
@@ -7303,8 +7290,8 @@ class GenericGuest(GenericPlace):
             memory = 0
         return [name, ip, vcpus, memory, distro, uuid]
 
-    def getGuestMemory(self, unit=xenrt.MEGA):
-        return self.getMyMemory(unit=unit)
+    def getGuestMemory(self):
+        return self.getMyMemory()
 
     def getGuestVCPUs(self):
         return self.getMyVCPUs()