#!/usr/bin/env python """ Gathers availability data for the VM host it's running on. """ from subprocess import PIPE, Popen, call import sys import yaml import os def main(argv): """ Calculate the amount of memory available for new VMs The numbers returned by xm info and xm info -c are in MiB The numbers in /proc/xen/balloon are in KiB All math is done in kibibytes for consistency Output is in MiB Bail if /etc/invirt/nocreate exists """ try: os.stat('/etc/invirt/nocreate') print 0 return 0 except OSError: pass p = Popen(['/usr/sbin/xm', 'info'], stdout=PIPE) output = p.communicate()[0] if p.returncode != 0: raise RuntimeError("Command '%s' returned non-zero exit status %d" % ('/usr/sbin/xm info', p.returncode)) xminfo = yaml.load(output, yaml.CSafeLoader) free_memory = int(xminfo['free_memory']) * 1024 currentallocation = int(open('/sys/devices/system/xen_memory/xen_memory0/info/current_kb', 'r').read()) # this information seems to have vanished in recent linux - we _want_ min_target_kb, but it doesn't seem to be # exposed anymore. # minimumtarget = int(open('/sys/devices/system/xen_memory/xen_memory0/target_kb', 'r').read()) p = Popen(['/usr/sbin/xm', 'info', '-c'], stdout=PIPE) output = p.communicate()[0] if p.returncode != 0: raise RuntimeError("Command '%s' returned non-zero exit status %d" % ('/usr/sbin/xm info -c', p.returncode)) xminfoc = yaml.load(output, yaml.CSafeLoader) # In kibibytes dom0minmem = int(xminfoc['dom0-min-mem']) * 1024 # dom0_spare_memory = currentallocation - max(minimumtarget, dom0minmem) dom0_spare_memory = currentallocation - dom0minmem print int((free_memory + dom0_spare_memory)/1024) return 0 if __name__ == '__main__': sys.exit(main(sys.argv))