mirror of
https://github.com/retspen/webvirtcloud
synced 2024-12-26 16:15:25 +00:00
127 lines
2.9 KiB
Python
127 lines
2.9 KiB
Python
|
import re
|
||
|
import random
|
||
|
import libxml2
|
||
|
import libvirt
|
||
|
|
||
|
|
||
|
def is_kvm_available(xml):
|
||
|
capabilites = re.search('kvm', xml)
|
||
|
if capabilites:
|
||
|
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))
|