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.
self.workdir))
try:
xenrt.TEC().logverbose("Memory details: %s" %
- (self.guest.getMyMemory(complete=True)))
+ (self.guest.getMyMemory()))
except:
pass
time.sleep(5)
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()
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"""
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
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
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)
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)
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)
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
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()