1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2025-07-31 12:41:08 +00:00

Python3 & Django 2.2 Migration - Fix & Updates

This commit is contained in:
catborise 2020-03-16 16:59:45 +03:00
parent fc8612c604
commit 4d40de1b55
98 changed files with 1525 additions and 6658 deletions

View file

@ -80,7 +80,7 @@ class wvmConnection(object):
elif self.type == CONN_SOCKET:
self.__connect_socket()
else:
raise ValueError('"{type}" is not a valid connection type'.format(type=self.type))
raise ValueError(f'"{self.type}" is not a valid connection type')
if self.connected:
# do some preprocessing of the connection:
@ -135,14 +135,14 @@ class wvmConnection(object):
def __connect_tcp(self):
flags = [libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_PASSPHRASE]
auth = [flags, self.__libvirt_auth_credentials_callback, None]
uri = 'qemu+tcp://%s/system' % self.host
uri = f'qemu+tcp://{self.host}/system'
try:
self.connection = libvirt.openAuth(uri, auth, 0)
self.last_error = None
except libvirtError as e:
self.last_error = 'Connection Failed: ' + str(e)
self.last_error = f'Connection Failed: {str(e)}'
self.connection = None
def __connect_ssh(self):
@ -153,7 +153,7 @@ class wvmConnection(object):
self.last_error = None
except libvirtError as e:
self.last_error = 'Connection Failed: ' + str(e) + ' --- ' + repr(libvirt.virGetLastError())
self.last_error = f'Connection Failed: {str(e)} --- ' + repr(libvirt.virGetLastError())
self.connection = None
def __connect_tls(self):
@ -166,7 +166,7 @@ class wvmConnection(object):
self.last_error = None
except libvirtError as e:
self.last_error = 'Connection Failed: ' + str(e)
self.last_error = f'Connection Failed: {str(e)}'
self.connection = None
def __connect_socket(self):
@ -177,7 +177,7 @@ class wvmConnection(object):
self.last_error = None
except libvirtError as e:
self.last_error = 'Connection Failed: ' + str(e)
self.last_error = f'Connection Failed: {str(e)}'
self.connection = None
def close(self):
@ -208,18 +208,18 @@ class wvmConnection(object):
def __unicode__(self):
if self.type == CONN_TCP:
type_str = u'tcp'
type_str = 'tcp'
elif self.type == CONN_SSH:
type_str = u'ssh'
type_str = 'ssh'
elif self.type == CONN_TLS:
type_str = u'tls'
type_str = 'tls'
else:
type_str = u'invalid_type'
type_str = 'invalid_type'
return u'qemu+{type}://{user}@{host}/system'.format(type=type_str, user=self.login, host=self.host)
return f'qemu+{type_str}://{self.login}@{self.host}/system'
def __repr__(self):
return '<wvmConnection {connection_str}>'.format(connection_str=unicode(self))
return f'<wvmConnection {str(self)}>'
class wvmConnectionManager(object):
@ -264,9 +264,9 @@ class wvmConnectionManager(object):
raises libvirtError if (re)connecting fails
"""
# force all string values to unicode
host = unicode(host)
login = unicode(login)
passwd = unicode(passwd) if passwd is not None else None
host = str(host)
login = str(login)
passwd = str(passwd) if passwd is not None else None
connection = self._search_connection(host, login, passwd, conn)
@ -432,21 +432,21 @@ class wvmConnect(object):
def get_version(self):
ver = self.wvm.getVersion()
major = ver / 1000000
major = ver // 1000000
ver = ver % 1000000
minor = ver / 1000
minor = ver // 1000
ver = ver % 1000
release = ver
return "%s.%s.%s" % (major, minor, release)
return f"{major}.{minor}.{release}"
def get_lib_version(self):
ver = self.wvm.getLibVersion()
major = ver / 1000000
major = ver // 1000000
ver %= 1000000
minor = ver / 1000
minor = ver // 1000
ver %= 1000
release = ver
return "%s.%s.%s" % (major,minor,release)
return f"{major}.{minor}.{release}"
def is_kvm_supported(self):
"""Return KVM capabilities."""

View file

@ -6,9 +6,6 @@ from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_FORMAT
from webvirtcloud.settings import INSTANCE_VOLUME_DEFAULT_SCSI_CONTROLLER
def get_rbd_storage_data(stg):
xml = stg.XMLDesc(0)
ceph_user = util.get_xml_path(xml, "/pool/source/auth/@username")
@ -236,10 +233,10 @@ class wvmCreate(wvmConnect):
"""
xml += """<devices>"""
vd_disk_letters = list(string.lowercase)
fd_disk_letters = list(string.lowercase)
hd_disk_letters = list(string.lowercase)
sd_disk_letters = list(string.lowercase)
vd_disk_letters = list(string.ascii_lowercase)
fd_disk_letters = list(string.ascii_lowercase)
hd_disk_letters = list(string.ascii_lowercase)
sd_disk_letters = list(string.ascii_lowercase)
add_cd = True
disk_opts = ''

View file

@ -19,10 +19,10 @@ class wvmHostDetails(wvmConnect):
all_mem = self.wvm.getInfo()[1] * 1048576
freemem = self.wvm.getMemoryStats(-1, 0)
if type(freemem) == dict:
free = (freemem.values()[0] +
freemem.values()[2] +
freemem.values()[3]) * 1024
percent = (100 - ((free * 100) / all_mem))
free = (freemem['buffers'] +
freemem['free'] +
freemem['cached']) * 1024
percent = abs(100 - ((free * 100) // all_mem))
usage = (all_mem - free)
mem_usage = {'total': all_mem, 'usage': usage, 'percent': percent}
else:
@ -38,7 +38,7 @@ class wvmHostDetails(wvmConnect):
cpu = self.wvm.getCPUStats(-1, 0)
if type(cpu) == dict:
for num in range(2):
idle = self.wvm.getCPUStats(-1, 0).values()[1]
idle = self.wvm.getCPUStats(-1, 0)['idle']
total = sum(self.wvm.getCPUStats(-1, 0).values())
diff_idle = idle - prev_idle
diff_total = total - prev_total

View file

@ -275,7 +275,7 @@ class wvmInstance(wvmConnect):
"""Get number of physical CPUs."""
hostinfo = self.wvm.getInfo()
pcpus = hostinfo[4] * hostinfo[5] * hostinfo[6] * hostinfo[7]
range_pcpus = xrange(1, int(pcpus + 1))
range_pcpus = range(1, int(pcpus + 1))
return range_pcpus
def get_interface_addresses(self, iface_mac):
@ -322,11 +322,11 @@ class wvmInstance(wvmConnect):
return None, None
def _get_interface_addresses(self, source):
#("Calling interfaceAddresses source=%s", source)
# ("Calling interfaceAddresses source=%s", source)
try:
return self.instance.interfaceAddresses(source)
except Exception as e:
#log.debug("interfaceAddresses failed: %s", str(e))
# log.debug("interfaceAddresses failed: %s", str(e))
pass
return {}
@ -340,7 +340,7 @@ class wvmInstance(wvmConnect):
self._ip_cache["qemuga"] = self._get_interface_addresses(
VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT)
arp_flag = 3 # libvirt."VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP"
arp_flag = 3 # libvirt."VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP"
self._ip_cache["arp"] = self._get_interface_addresses(arp_flag)
def get_net_devices(self):
@ -501,7 +501,7 @@ class wvmInstance(wvmConnect):
else:
raise Exception('Unknown boot menu option, please choose one of 0:disable, 1:enable, -1:remove')
xmldom = ElementTree.tostring(tree)
xmldom = ElementTree.tostring(tree).decode()
self._defineXML(xmldom)
def get_bootorder(self):
@ -592,7 +592,7 @@ class wvmInstance(wvmConnect):
d.append(order)
else:
raise Exception('Invalid Device Type for boot order')
self._defineXML(ElementTree.tostring(tree))
self._defineXML(ElementTree.tostring(tree).decode())
def mount_iso(self, dev, image):
def attach_iso(dev, disk, vol):
@ -618,11 +618,11 @@ class wvmInstance(wvmConnect):
if attach_iso(dev, disk, vol):
break
if self.get_status() == 1:
xml = ElementTree.tostring(disk)
xml = ElementTree.tostring(disk).decode()
self.instance.attachDevice(xml)
xmldom = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
if self.get_status() == 5:
xmldom = ElementTree.tostring(tree)
xmldom = ElementTree.tostring(tree).decode()
self._defineXML(xmldom)
def umount_iso(self, dev, image):
@ -637,14 +637,14 @@ class wvmInstance(wvmConnect):
if elm.get('dev') == dev:
disk.remove(src_media)
if self.get_status() == 1:
xml_disk = ElementTree.tostring(disk)
xml_disk = ElementTree.tostring(disk).decode()
self.instance.attachDevice(xml_disk)
xmldom = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
if self.get_status() == 5:
xmldom = ElementTree.tostring(tree)
xmldom = ElementTree.tostring(tree).decode()
self._defineXML(xmldom)
def attach_disk(self, source, target_dev, target_bus='ide', disk_type='file',
def attach_disk(self, target_dev, source, target_bus='ide', disk_type='file',
disk_device='disk', driver_name='qemu', driver_type='raw',
readonly=False, shareable=False, serial=None,
cache_mode=None, io_mode=None, discard_mode=None, detect_zeroes_mode=None):
@ -683,7 +683,7 @@ class wvmInstance(wvmConnect):
tree = etree.fromstring(self._XMLDesc(0))
disk_el = tree.xpath("./devices/disk/target[@dev='{}']".format(target_dev))[0].getparent()
xml_disk = etree.tostring(disk_el)
xml_disk = etree.tostring(disk_el).decode()
devices = tree.find('devices')
devices.remove(disk_el)
@ -699,6 +699,7 @@ class wvmInstance(wvmConnect):
old_disk_type = disk_el.get('type')
old_disk_device = disk_el.get('device')
old_driver_name = disk_el.xpath('driver/@name')[0]
old_target_bus = disk_el.xpath('target/@bus')[0]
additionals = ''
if cache_mode is not None and cache_mode != 'default':
@ -715,6 +716,7 @@ class wvmInstance(wvmConnect):
xml_disk += "<driver name='%s' type='%s'/>" % (old_driver_name, format)
elif old_disk_device == 'disk':
xml_disk += "<driver name='%s' type='%s' %s/>" % (old_driver_name, format, additionals)
xml_disk += """<source file='%s'/>
<target dev='%s' bus='%s'/>""" % (source, target_dev, target_bus)
if readonly:
@ -735,7 +737,7 @@ class wvmInstance(wvmConnect):
time.sleep(1)
cpu_use_now = self.instance.info()[4]
diff_usage = cpu_use_now - cpu_use_ago
cpu_usage['cpu'] = 100 * diff_usage / (1 * nbcore * 10 ** 9L)
cpu_usage['cpu'] = 100 * diff_usage / (1 * nbcore * 10 ** 9)
else:
cpu_usage['cpu'] = 0
return cpu_usage
@ -746,7 +748,7 @@ class wvmInstance(wvmConnect):
def set_vcpu_hotplug(self, status, vcpus_hotplug=0):
""" vcpus_hotplug = 0 make all vpus hotpluggable """
vcpus_hotplug = int(self.get_vcpu()) if vcpus_hotplug == 0 else vcpus_hotplug
if self.get_status() == 5: # shutoff
if self.get_status() == 5: # shutoff
if status:
xml = """ <vcpus>"""
xml += """<vcpu id='0' enabled='yes' hotpluggable='no' order='1'/>"""
@ -758,14 +760,14 @@ class wvmInstance(wvmConnect):
vcpus = tree.xpath("/domain/vcpus")
if not vcpus:
tree.append(etree.fromstring(xml))
self._defineXML(etree.tostring(tree))
self._defineXML(etree.tostring(tree).decode())
else:
tree = etree.fromstring(self._XMLDesc(0))
vcpus = tree.xpath("/domain/vcpus")
for vcpu in vcpus:
parent = vcpu.getparent()
parent.remove(vcpu)
self._defineXML(etree.tostring(tree))
self._defineXML(etree.tostring(tree).decode())
else:
raise libvirtError("Please shutdown the instance then try to enable vCPU hotplug")
@ -892,7 +894,7 @@ class wvmInstance(wvmConnect):
listen.attrib.pop("address")
except:
pass
newxml = ElementTree.tostring(root)
newxml = ElementTree.tostring(root).decode()
return self._defineXML(newxml)
def get_console_socket(self):
@ -917,7 +919,7 @@ class wvmInstance(wvmConnect):
# Little fix for old version ElementTree
graphic = root.find("devices/graphics")
graphic.set('type', console_type)
newxml = ElementTree.tostring(root)
newxml = ElementTree.tostring(root).decode()
self._defineXML(newxml)
def get_console_port(self, console_type=None):
@ -953,7 +955,7 @@ class wvmInstance(wvmConnect):
graphic.attrib.pop('passwd')
except:
pass
newxml = ElementTree.tostring(root)
newxml = ElementTree.tostring(root).decode()
return self._defineXML(newxml)
def set_console_keymap(self, keymap):
@ -972,7 +974,7 @@ class wvmInstance(wvmConnect):
graphic.attrib.pop('keymap')
except:
pass
newxml = ElementTree.tostring(root)
newxml = ElementTree.tostring(root).decode()
self._defineXML(newxml)
def get_console_keymap(self):
@ -998,7 +1000,7 @@ class wvmInstance(wvmConnect):
parent = model.getparent()
parent.remove(model)
parent.append(etree.fromstring(video_xml))
self._defineXML(etree.tostring(tree))
self._defineXML(etree.tostring(tree).decode())
def resize_cpu(self, cur_vcpu, vcpu):
"""
@ -1011,11 +1013,11 @@ class wvmInstance(wvmConnect):
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
tree = etree.fromstring(xml)
set_vcpu = tree.find('vcpu')
set_vcpu.text = vcpu
set_vcpu.set('current', cur_vcpu)
vcpu_elem = tree.find('vcpu')
vcpu_elem.text = vcpu
vcpu_elem.set('current', cur_vcpu)
new_xml = etree.tostring(tree)
new_xml = etree.tostring(tree).decode()
self._defineXML(new_xml)
if is_vcpus_enabled:
@ -1034,14 +1036,14 @@ class wvmInstance(wvmConnect):
return
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
tree = ElementTree.fromstring(xml)
tree = etree.fromstring(xml)
set_mem = tree.find('memory')
set_mem.text = str(memory)
set_cur_mem = tree.find('currentMemory')
set_cur_mem.text = str(cur_memory)
mem_elem = tree.find('memory')
mem_elem.text = str(memory)
cur_mem_elem = tree.find('currentMemory')
cur_mem_elem.text = str(cur_memory)
new_xml = ElementTree.tostring(tree)
new_xml = etree.tostring(tree).decode()
self._defineXML(new_xml)
def resize_disk(self, disks):
@ -1049,14 +1051,14 @@ class wvmInstance(wvmConnect):
Function change disks on vds.
"""
xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
tree = ElementTree.fromstring(xml)
tree = etree.fromstring(xml)
for disk in disks:
source_dev = disk['path']
vol = self.get_volume_by_path(source_dev)
vol.resize(disk['size_new'])
new_xml = ElementTree.tostring(tree)
new_xml = etree.tostring(tree).decode()
self._defineXML(new_xml)
def get_iso_media(self):
@ -1250,7 +1252,7 @@ class wvmInstance(wvmConnect):
'description': clone_data.get('clone-description', ''),
}
self._set_options(tree, options)
self._defineXML(ElementTree.tostring(tree))
self._defineXML(ElementTree.tostring(tree).decode())
return self.get_instance(clone_data['name']).UUIDString()
@ -1297,7 +1299,7 @@ class wvmInstance(wvmConnect):
for interface in tree.findall('devices/interface'):
source = interface.find('mac')
if source.get('address', '') == mac_address:
new_xml = ElementTree.tostring(interface)
new_xml = ElementTree.tostring(interface).decode()
if self.get_status() == 1:
self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_LIVE)
@ -1359,7 +1361,7 @@ class wvmInstance(wvmConnect):
else:
if source is not None: interface.remove(source)
new_xml = ElementTree.tostring(tree)
new_xml = ElementTree.tostring(tree).decode()
self._defineXML(new_xml)
def set_link_state(self, mac_address, state):
@ -1373,7 +1375,7 @@ class wvmInstance(wvmConnect):
link_el = etree.Element("link")
link_el.attrib["state"] = state
interface.append(link_el)
new_xml = etree.tostring(interface)
new_xml = etree.tostring(interface).decode()
if self.get_status() == 1:
self.instance.updateDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_LIVE)
self.instance.updateDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG)
@ -1400,7 +1402,7 @@ class wvmInstance(wvmConnect):
tree = ElementTree.fromstring(xml)
self._set_options(tree, options)
new_xml = ElementTree.tostring(tree)
new_xml = ElementTree.tostring(tree).decode()
self._defineXML(new_xml)
def set_memory(self, size, flags=0):
@ -1460,7 +1462,7 @@ class wvmInstance(wvmConnect):
parent.append(etree.fromstring(xml))
else:
band.append(etree.fromstring(xml))
new_xml = etree.tostring(tree)
new_xml = etree.tostring(tree).decode()
self.wvm.defineXML(new_xml)
def unset_qos(self, mac, direction):
@ -1472,7 +1474,7 @@ class wvmInstance(wvmConnect):
if parent_mac[0] == mac:
band_el.remove(direct)
self.wvm.defineXML(etree.tostring(tree))
self.wvm.defineXML(etree.tostring(tree).decode())
def add_guest_agent(self):
channel_xml = """
@ -1490,7 +1492,7 @@ class wvmInstance(wvmConnect):
tree = etree.fromstring(self._XMLDesc(0))
for target in tree.xpath("/domain/devices/channel[@type='unix']/target[@name='org.qemu.guest_agent.0']"):
parent = target.getparent()
channel_xml = etree.tostring(parent)
channel_xml = etree.tostring(parent).decode()
if self.get_status() == 1:
self.instance.detachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_LIVE)
self.instance.detachDeviceFlags(channel_xml, VIR_DOMAIN_AFFECT_CONFIG)

View file

@ -213,7 +213,7 @@ class wvmNetwork(wvmConnect):
for host in hosts:
ip = host.get('ip')
mac = host.get('mac')
name = host.get('name','')
name = host.get('name', '')
result.append({'ip': ip, 'mac': mac, 'name': name})
return result
else:
@ -223,7 +223,7 @@ class wvmNetwork(wvmConnect):
for host in hosts:
ip = host.get('ip')
id = host.get('id')
name = host.get('name','')
name = host.get('name', '')
result.append({'ip': ip, 'id': id, 'name': name})
return result
@ -236,7 +236,7 @@ class wvmNetwork(wvmConnect):
range = tree.xpath("./ip[@family='ipv6']/dhcp/range")
range[0].set('start', range_start)
range[0].set('end', range_end)
self.wvm.networkDefineXML(etree.tostring(tree))
self.wvm.networkDefineXML(etree.tostring(tree).decode())
def delete_fixed_address(self, ip, family='ipv4'):
tree = etree.fromstring(self._XMLDesc(0))
@ -335,7 +335,7 @@ class wvmNetwork(wvmConnect):
parent.append(etree.fromstring(xml))
else:
band[0].append(etree.fromstring(xml))
new_xml = etree.tostring(tree)
new_xml = etree.tostring(tree).decode()
self.wvm.networkDefineXML(new_xml)
def unset_qos(self, direction):
@ -344,7 +344,7 @@ class wvmNetwork(wvmConnect):
parent = direct.getparent()
parent.remove(direct)
self.wvm.networkDefineXML(etree.tostring(tree))
self.wvm.networkDefineXML(etree.tostring(tree).decode())
def edit_network(self, new_xml):
self.wvm.networkDefineXML(new_xml)
@ -354,7 +354,7 @@ class wvmNetwork(wvmConnect):
self.leases = self.net.DHCPLeases()
except Exception as e:
self.leases = []
raise "Error getting %s DHCP leases: %s" % self, str(e)
raise "Error getting %s DHCP leases: %s" % (self, e)
def get_dhcp_leases(self):
if self.leases is None:

View file

@ -19,7 +19,7 @@ class wvmNWFilters(wvmConnect):
tree.set('name', cln_name)
uuid = tree.find('uuid')
tree.remove(uuid)
self.create_nwfilter(ElementTree.tostring(tree))
self.create_nwfilter(ElementTree.tostring(tree).decode())
class wvmNWFilter(wvmConnect):
@ -43,7 +43,7 @@ class wvmNWFilter(wvmConnect):
tree = ElementTree.fromstring(self._XMLDesc(0))
uuid = tree.find('uuid')
tree.remove(uuid)
return ElementTree.tostring(tree)
return ElementTree.tostring(tree).decode()
def get_filter_refs(self):
refs = []
@ -64,7 +64,7 @@ class wvmNWFilter(wvmConnect):
rule_directives = r.find("./")
if rule_directives is not None:
rule_directives = ElementTree.tostring(rule_directives)
rule_directives = ElementTree.tostring(rule_directives).decode()
rule_info = {
"action": rule_action,
@ -84,7 +84,7 @@ class wvmNWFilter(wvmConnect):
if name == ref.get('filter'):
tree.remove(ref)
break
return ElementTree.tostring(tree)
return ElementTree.tostring(tree).decode()
def delete_rule(self, action, direction, priority):
tree = ElementTree.fromstring(self._XMLDesc(0))
@ -93,14 +93,14 @@ class wvmNWFilter(wvmConnect):
if rule_tree:
tree.remove(rule_tree[0])
return ElementTree.tostring(tree)
return ElementTree.tostring(tree).decode()
def add_ref(self, name):
tree = ElementTree.fromstring(self._XMLDesc(0))
element = ElementTree.Element("filterref")
element.attrib['filter'] = name
tree.append(element)
return ElementTree.tostring(tree)
return ElementTree.tostring(tree).decode()
def add_rule(self, xml):
tree = ElementTree.fromstring(self._XMLDesc(0))
@ -122,4 +122,4 @@ class wvmNWFilter(wvmConnect):
element.append(rule_directives)
tree.append(element)
return ElementTree.tostring(tree)
return ElementTree.tostring(tree).decode()

View file

@ -147,13 +147,13 @@ class wvmStorage(wvmConnect):
return util.get_xml_path(self._XMLDesc(0), "/pool/target/path")
def get_allocation(self):
return long(util.get_xml_path(self._XMLDesc(0), "/pool/allocation"))
return int(util.get_xml_path(self._XMLDesc(0), "/pool/allocation"))
def get_available(self):
return long(util.get_xml_path(self._XMLDesc(0), "/pool/available"))
return int(util.get_xml_path(self._XMLDesc(0), "/pool/available"))
def get_capacity(self):
return long(util.get_xml_path(self._XMLDesc(0), "/pool/capacity"))
return int(util.get_xml_path(self._XMLDesc(0), "/pool/capacity"))
def get_pretty_allocation(self):
return util.pretty_bytes(self.get_allocation())

View file

@ -34,9 +34,9 @@ def randomUUID():
"%02x" * 6]) % tuple(u)
def randomPasswd(length=12, alphabet=string.letters + string.digits):
def randomPasswd(length=12, alphabet=string.ascii_letters + string.digits):
"""Generate a random password"""
return ''.join([random.choice(alphabet) for i in xrange(length)])
return ''.join([random.choice(alphabet) for i in range(length)])
def get_max_vcpus(conn, type=None):
@ -75,7 +75,7 @@ def compareMAC(p, q):
else:
return -1
for i in xrange(len(pa)):
for i in range(len(pa)):
n = int(pa[i], 0x10) - int(qa[i], 0x10)
if n > 0:
return 1
@ -160,12 +160,12 @@ def validate_macaddr(val):
if val is None:
return
if not (isinstance(val, str) or isinstance(val, basestring)):
if not (isinstance(val, str) or isinstance(val, str)):
raise ValueError("MAC address must be a string.")
form = re.match("^([0-9a-fA-F]{1,2}:){5}[0-9a-fA-F]{1,2}$", val)
if form is None:
raise ValueError("MAC address must be of the format AA:BB:CC:DD:EE:FF, was '%s'" % val)
raise ValueError(f"MAC address must be of the format AA:BB:CC:DD:EE:FF, was {val}")
# Mapping of UEFI binary names to their associated architectures. We
@ -189,4 +189,4 @@ uefi_arch_patterns = {
"armv7l": [
r".*arm/QEMU_EFI.*", # fedora, gerd's firmware repo
],
}
}