import random import libxml2 import libvirt def is_kvm_available(xml): kvm_domains = get_xml_path(xml, "//domain/@type='kvm'") if kvm_domains > 0: return True else: return False def randomMAC(): """Generate a random MAC address.""" # qemu MAC oui = [0x52, 0x54, 0x00] mac = oui + [random.randint(0x00, 0xff), random.randint(0x00, 0xff), random.randint(0x00, 0xff)] return ':'.join(map(lambda x: "%02x" % x, mac)) def randomUUID(): """Generate a random UUID.""" u = [random.randint(0, 255) for dummy in range(0, 16)] return "-".join(["%02x" * 4, "%02x" * 2, "%02x" * 2, "%02x" * 2, "%02x" * 6]) % tuple(u) def get_max_vcpus(conn, type=None): """@param conn: libvirt connection to poll for max possible vcpus @type type: optional guest type (kvm, etc.)""" if type is None: type = conn.getType() try: m = conn.getMaxVcpus(type.lower()) except libvirt.libvirtError: m = 32 return m def xml_escape(str): """Replaces chars ' " < > & with xml safe counterparts""" if str is None: return None str = str.replace("&", "&") str = str.replace("'", "'") str = str.replace("\"", """) str = str.replace("<", "<") str = str.replace(">", ">") return str def compareMAC(p, q): """Compare two MAC addresses""" pa = p.split(":") qa = q.split(":") if len(pa) != len(qa): if p > q: return 1 else: return -1 for i in xrange(len(pa)): n = int(pa[i], 0x10) - int(qa[i], 0x10) if n > 0: return 1 elif n < 0: return -1 return 0 def get_xml_path(xml, path=None, func=None): """ Return the content from the passed xml xpath, or return the result of a passed function (receives xpathContext as its only arg) """ doc = None ctx = None result = None try: doc = libxml2.parseDoc(xml) ctx = doc.xpathNewContext() if path: ret = ctx.xpathEval(path) if ret is not None: if type(ret) == list: if len(ret) >= 1: result = ret[0].content else: result = ret elif func: result = func(ctx) else: raise ValueError("'path' or 'func' is required.") finally: if doc: doc.freeDoc() if ctx: ctx.xpathFreeContext() return result def pretty_mem(val): val = int(val) if val > (10 * 1024 * 1024): return "%2.2f GB" % (val / (1024.0 * 1024.0)) else: return "%2.0f MB" % (val / 1024.0) def pretty_bytes(val): val = int(val) if val > (1024 * 1024 * 1024): return "%2.2f GB" % (val / (1024.0 * 1024.0 * 1024.0)) else: return "%2.2f MB" % (val / (1024.0 * 1024.0))