Skip to content

Commit f72d0ef

Browse files
committed
Bug fix: Use encoding option of ET.tostring() to get XML as string
Signed-off-by: Aline Manera <[email protected]>
1 parent 0b09900 commit f72d0ef

20 files changed

+68
-75
lines changed

mockmodel.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ def domainXMLDesc(dom, flags=0):
208208
break
209209
if add:
210210
root.devices.append(dev)
211-
return ET.tostring(root, encoding='utf-8').decode('utf-8')
211+
return ET.tostring(root, encoding='unicode')
212212

213213
@staticmethod
214214
def undefineDomain(dom):
@@ -226,7 +226,7 @@ def attachDeviceFlags(dom, xml, flags=0):
226226
myxml.target.size._setText(
227227
str(int(convert_data_size(myxml.target.size.text, unit, 'KiB')))
228228
)
229-
xml = ET.tostring(myxml).decode('utf-8')
229+
xml = ET.tostring(myxml, encoding='unicode')
230230
dom.setMaxMemory(int(dom.maxMemory() + myxml.target.size))
231231
MockModel._mock_vms[dom.name()].append(xml)
232232

@@ -254,17 +254,14 @@ def _get_device_node(dom, xml):
254254
@staticmethod
255255
def detachDeviceFlags(dom, xml, flags=0):
256256
node = ET.fromstring(xml)
257-
xml = ET.tostring(node, encoding='utf-8',
258-
pretty_print=True).decode('utf-8')
257+
xml = ET.tostring(node, encoding='unicode', pretty_print=True)
259258
if xml in MockModel._mock_vms[dom.name()]:
260259
MockModel._mock_vms[dom.name()].remove(xml)
261260

262261
@staticmethod
263262
def updateDeviceFlags(dom, xml, flags=0):
264263
_, old_dev = MockModel._get_device_node(dom, xml)
265-
old_xml = ET.tostring(old_dev, encoding='utf-8', pretty_print=True).decode(
266-
'utf-8'
267-
)
264+
old_xml = ET.tostring(old_dev, encoding='unicode', pretty_print=True)
268265
if old_xml in MockModel._mock_vms[dom.name()]:
269266
MockModel._mock_vms[dom.name()].remove(old_xml)
270267
MockModel._mock_vms[dom.name()].append(xml)
@@ -329,7 +326,7 @@ def _update_lvm_disks(self, pool_name, disks):
329326
dev = E.device(path=d)
330327
source.append(dev)
331328

332-
conn.storagePoolDefineXML(ET.tostring(root).decode('utf-8'), 0)
329+
conn.storagePoolDefineXML(ET.tostring(root, encoding='unicode'), 0)
333330

334331
def _mock_storagevolumes_create(self, pool, params):
335332
vol_source = ['url', 'capacity']
@@ -562,7 +559,7 @@ def _get_pci_device_xml(self, dev_info, slot, is_multifunction):
562559
source, driver, mode='subsystem', type='pci', managed='yes'
563560
)
564561

565-
return ET.tostring(host_dev).decode('utf-8')
562+
return ET.tostring(host_dev, encoding='unicode')
566563

567564

568565
class MockStorageVolumes(object):

model/featuretests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def libvirt_supports_iso_stream(conn, protocol):
151151
def libvirt_support_nfs_probe(conn):
152152
def _get_xml():
153153
obj = E.source(E.host(name='127.0.0.1'), E.format(type='nfs'))
154-
xml = ET.tostring(obj).decode('utf-8')
154+
xml = ET.tostring(obj, encoding='unicode')
155155
return xml
156156

157157
try:

model/libvirtstoragepool.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def xml(self):
6767
pool = E.pool(type='dir')
6868
pool.append(E.name(self.poolArgs['name']))
6969
pool.append(E.target(E.path(self.poolArgs['path'])))
70-
return ET.tostring(pool, encoding='utf-8', pretty_print=True).decode('utf-8')
70+
return ET.tostring(pool, encoding='unicode', pretty_print=True)
7171

7272

7373
class NetfsPoolDef(StoragePoolDef):
@@ -217,7 +217,7 @@ def _prepare_auth(self, conn):
217217
usage = E.usage(type='iscsi')
218218
usage.append(E.target(self.poolArgs['name']))
219219
secret.append(usage)
220-
virSecret = conn.secretDefineXML(ET.tostring(secret))
220+
virSecret = conn.secretDefineXML(ET.tostring(secret, encoding='unicode'))
221221

222222
virSecret.setValue(auth['password'])
223223

model/storagepools.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def _check_default_pools(self):
118118
# Try to create the pool
119119
pool = E.pool(E.name(pool_name), type='dir')
120120
pool.append(E.target(E.path(pool_path)))
121-
xml = ET.tostring(pool)
121+
xml = ET.tostring(pool, encoding='unicode')
122122
try:
123123
pool = conn.storagePoolDefineXML(xml, 0)
124124
except libvirt.libvirtError as e:

model/storagetargets.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def _get_storage_server_spec(self, **kwargs):
106106
host_attr['port'] = server_port
107107

108108
obj = E.source(E.host(host_attr), *extra_args)
109-
xml = ET.tostring(obj)
109+
xml = ET.tostring(obj, encoding='unicode')
110110
return xml
111111

112112
def _parse_target_source_result(self, target_type, xml_str):

model/storagevolumes.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -520,8 +520,8 @@ def _clone_task(self, cb, params):
520520
target_elem.append(E.format(type=orig_vol['format']))
521521
root_elem.append(target_elem)
522522
new_vol_xml = ET.tostring(
523-
root_elem, encoding='utf-8', pretty_print=True
524-
).decode('utf-8')
523+
root_elem, encoding='unicode', pretty_print=True
524+
)
525525

526526
cb('cloning volume')
527527
new_vir_pool.createXMLFrom(new_vol_xml, orig_vir_vol, 0)

model/vmhostdevs.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ def _update_win_memory_size(self, dom, counter, wnd_size):
469469
line.remove(arg.getprevious())
470470
line.remove(arg)
471471

472-
return etree.tostring(root, encoding='utf-8', pretty_print=True)
472+
return etree.tostring(root, encoding='unicode', pretty_print=True)
473473

474474
return None
475475

@@ -484,7 +484,7 @@ def _add_win_memory_size(self, dom, wnd_size):
484484
args = {}
485485
args['-global'] = val
486486
root.append(etree.fromstring(get_qemucmdline_xml(args)))
487-
return etree.tostring(root, encoding='utf-8', pretty_print=True)
487+
return etree.tostring(root, encoding='unicode', pretty_print=True)
488488

489489
# <qemu:commandline> exists but there is no <qemu:arg value global>
490490
# so, we add those missing arguments inside the exising cmdline
@@ -493,7 +493,7 @@ def _add_win_memory_size(self, dom, wnd_size):
493493
cmdline.append(EM.arg(value='-global'))
494494
cmdline.append(EM.arg(value=val))
495495

496-
return etree.tostring(root, encoding='utf-8', pretty_print=True)
496+
return etree.tostring(root, encoding='unicode', pretty_print=True)
497497

498498
def _get_scsi_device_xml(self, dev_info):
499499
adapter = E.adapter(name=('scsi_host%s' % dev_info['host']))

model/vms.py

+23-21
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,9 @@ def update(self, name, params):
330330

331331
# You can only change <maxMemory> offline, updating guest XML
332332
if (
333-
('memory' in params) and
334-
('maxmemory' in params['memory']) and
335-
(DOM_STATE_MAP[dom.info()[0]] != 'shutoff')
333+
('memory' in params)
334+
and ('maxmemory' in params['memory'])
335+
and (DOM_STATE_MAP[dom.info()[0]] != 'shutoff')
336336
):
337337
raise InvalidParameter('KCHVM0080E')
338338

@@ -722,8 +722,8 @@ def _get_access_info(self, dom):
722722
access_info = dictize(access_xml)
723723
auth = config.get('authentication', 'method')
724724
if 'auth' in access_info['access'] and (
725-
'type' in access_info['access']['auth'] or
726-
len(access_info['access']['auth']) > 1
725+
'type' in access_info['access']['auth']
726+
or len(access_info['access']['auth']) > 1
727727
):
728728
users = xpath_get_text(
729729
access_xml, f"/access/auth[@type='{auth}']/user")
@@ -772,7 +772,7 @@ def _update_graphics(self, dom, params):
772772

773773
conn = self.conn.get()
774774
if not dom.isActive():
775-
return conn.defineXML(ET.tostring(root, encoding='utf-8').decode('utf-8'))
775+
return conn.defineXML(ET.tostring(root, encoding='unicode'))
776776

777777
xml = dom.XMLDesc(libvirt.VIR_DOMAIN_XML_SECURE)
778778
dom.updateDeviceFlags(
@@ -851,7 +851,7 @@ def _update_bootorder(self, xml, params):
851851
os.append(get_bootmenu_node())
852852

853853
# update <os>
854-
return ET.tostring(et)
854+
return ET.tostring(et, encoding='unicode')
855855

856856
def _update_s390x_console(self, xml, params):
857857
if xpath_get_text(xml, XPATH_DOMAIN_CONSOLE_TARGET):
@@ -865,7 +865,7 @@ def _update_s390x_console(self, xml, params):
865865
et = ET.fromstring(xml)
866866
devices = et.find('devices')
867867
devices.append(console)
868-
return ET.tostring(et)
868+
return ET.tostring(et, encoding='unicode')
869869

870870
def _update_title(self, new_xml, title):
871871
if len(xpath_get_text(new_xml, XPATH_TITLE)) > 0:
@@ -874,7 +874,7 @@ def _update_title(self, new_xml, title):
874874
else:
875875
et = ET.fromstring(new_xml)
876876
et.append(E.title(title))
877-
new_xml = ET.tostring(et)
877+
new_xml = ET.tostring(et, encoding='unicode')
878878

879879
return new_xml
880880

@@ -886,7 +886,7 @@ def _update_description(self, new_xml, description):
886886
else:
887887
et = ET.fromstring(new_xml)
888888
et.append(E.description(description))
889-
new_xml = ET.tostring(et)
889+
new_xml = ET.tostring(et, encoding='unicode')
890890

891891
return new_xml
892892

@@ -960,8 +960,8 @@ def _static_vm_update(self, vm_name, dom, params):
960960
if 'name' in params:
961961
lflags = libvirt.VIR_DOMAIN_SNAPSHOT_LIST_ROOTS
962962
dflags = (
963-
libvirt.VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN |
964-
libvirt.VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY
963+
libvirt.VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN
964+
| libvirt.VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY
965965
)
966966

967967
for virt_snap in dom.listAllSnapshots(lflags):
@@ -997,7 +997,8 @@ def _static_vm_update(self, vm_name, dom, params):
997997
return nonascii_name if nonascii_name is not None else vm_name, dom
998998

999999
def _get_new_memory(self, root, newMem, oldMem, memDevs):
1000-
memDevsAmount = self._get_mem_dev_total_size(ET.tostring(root))
1000+
memDevsAmount = self._get_mem_dev_total_size(
1001+
ET.tostring(root, encoding='unicode'))
10011002

10021003
if newMem > (oldMem << 10):
10031004
return newMem - memDevsAmount
@@ -1013,7 +1014,7 @@ def _get_new_memory(self, root, newMem, oldMem, memDevs):
10131014
root.find('./devices').remove(dev)
10141015
if ((oldMem << 10) - totRemoved) <= newMem:
10151016
return newMem - self._get_mem_dev_total_size(
1016-
ET.tostring(root)
1017+
ET.tostring(root, encoding='unicode')
10171018
)
10181019

10191020
if newMem == (oldMem << 10):
@@ -1034,7 +1035,7 @@ def _set_max_memory(self, root, newMem, newMaxMem, maxMemTag):
10341035
# Just update value in max memory tag
10351036
maxMemTag.text = str(newMaxMem)
10361037
elif (maxMemTag is not None) and (newMem == newMaxMem):
1037-
if self._get_mem_dev_total_size(ET.tostring(root)) == 0:
1038+
if self._get_mem_dev_total_size(ET.tostring(root, encoding='unicode')) == 0:
10381039
# Remove the tag
10391040
root.remove(maxMemTag)
10401041
else:
@@ -1104,7 +1105,8 @@ def _update_memory_config(self, xml, params, dom):
11041105

11051106
if (maxMemTag is not None) and (not hasMaxMem):
11061107
if newMem == newMaxMem and (
1107-
self._get_mem_dev_total_size(ET.tostring(root)) == 0
1108+
self._get_mem_dev_total_size(
1109+
ET.tostring(root, encoding='unicode')) == 0
11081110
):
11091111
root.remove(maxMemTag)
11101112

@@ -1116,7 +1118,7 @@ def _update_memory_config(self, xml, params, dom):
11161118
memtune.remove(hl)
11171119
memtune.insert(0, E.hard_limit(
11181120
str(newMaxMem + 1048576), unit='Kib'))
1119-
return ET.tostring(root, encoding='utf-8')
1121+
return ET.tostring(root, encoding='unicode')
11201122

11211123
def get_vm_cpu_cores(self, vm_xml):
11221124
return xpath_get_text(vm_xml, XPATH_TOPOLOGY + '/@cores')[0]
@@ -1224,8 +1226,8 @@ def _update_memory_live(self, dom, params):
12241226
)
12251227
# Check number of slots supported
12261228
if (
1227-
len(xpath_get_text(xml, './devices/memory')) ==
1228-
MEM_DEV_SLOTS[os.uname()[4]]
1229+
len(xpath_get_text(xml, './devices/memory'))
1230+
== MEM_DEV_SLOTS[os.uname()[4]]
12291231
):
12301232
raise InvalidOperation('KCHVM0045E')
12311233

@@ -1728,8 +1730,8 @@ def serial(self, name):
17281730
)
17291731

17301732
websocket.add_proxy_token(
1731-
name
1732-
+ '-console', os.path.join(serialconsole.BASE_DIRECTORY, name), True
1733+
name +
1734+
'-console', os.path.join(serialconsole.BASE_DIRECTORY, name), True
17331735
)
17341736

17351737
try:

model/vmsnapshots.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def _create_task(self, cb, params):
9595
cb('building snapshot XML')
9696
root_elem = E.domainsnapshot()
9797
root_elem.append(E.name(name))
98-
xml = ET.tostring(root_elem, encoding='utf-8').decode('utf-8')
98+
xml = ET.tostring(root_elem, encoding='unicode')
9999

100100
try:
101101
cb('fetching snapshot domain')

tests/test_model.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2120,7 +2120,7 @@ def test_vmhostdev_get_devices_same_addr(self):
21202120
<address type="pci" domain="0x0000" bus="0x00" slot="0x05" function="0x1"/>\
21212121
</hostdev>"""
21222122
same_addr_devices = [
2123-
ET.tostring(hostdev_multi_elem).decode('utf-8'),
2123+
ET.tostring(hostdev_multi_elem, encoding='unicode'),
21242124
hostdev_same_addr_str,
21252125
]
21262126

@@ -2135,7 +2135,7 @@ def test_vmhostdev_get_devices_same_addr(self):
21352135

21362136
self.assertEqual(
21372137
inst.vmhostdev_get_devices_same_addr(hostdevs, nomatch_elem),
2138-
[ET.tostring(nomatch_elem).decode('utf-8')],
2138+
[ET.tostring(nomatch_elem, encoding='unicode')],
21392139
)
21402140

21412141
@mock.patch('wok.plugins.kimchi.model.vmhostdevs.get_vm_config_flag')

tests/test_networkxml.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626

2727
def normalize_xml(xml_str):
28-
return ET.tostring(ET.fromstring(xml_str, ET.XMLParser(remove_blank_text=True)))
28+
return ET.tostring(ET.fromstring(xml_str, ET.XMLParser(remove_blank_text=True)), encoding='unicode')
2929

3030

3131
class NetworkXmlTests(unittest.TestCase):
@@ -50,14 +50,14 @@ def test_dhcp_xml(self):
5050
self.assertEqual(None, dhcp)
5151

5252
params['range'] = dhcp_range
53-
xml = ET.tostring(nxml._get_dhcp_elem(**params))
53+
xml = ET.tostring(nxml._get_dhcp_elem(**params), encoding='unicode')
5454
start = xpath_get_text(xml, '/dhcp/range/@start')
5555
end = xpath_get_text(xml, '/dhcp/range/@end')
5656
self.assertEqual(dhcp_range['start'], start[0])
5757
self.assertEqual(dhcp_range['end'], end[0])
5858

5959
params['hosts'] = [host1, host2]
60-
xml = ET.tostring(nxml._get_dhcp_elem(**params))
60+
xml = ET.tostring(nxml._get_dhcp_elem(**params), encoding='unicode')
6161
ip = xpath_get_text(xml, '/dhcp/host/@ip')
6262
self.assertEqual(ip, [host1['ip'], host2['ip']])
6363

@@ -73,7 +73,7 @@ def test_ip_xml(self):
7373

7474
params['net'] = '192.168.122.0/255.255.255.0'
7575
params['dhcp'] = {'range': dhcp_range}
76-
xml = ET.tostring(nxml._get_ip_elem(**params))
76+
xml = ET.tostring(nxml._get_ip_elem(**params), encoding='unicode')
7777
start = xpath_get_text(xml, '/ip/dhcp/range/@start')[0]
7878
end = xpath_get_text(xml, '/ip/dhcp/range/@end')[0]
7979
self.assertEqual(dhcp_range['start'], start)
@@ -87,7 +87,7 @@ def test_ip_xml(self):
8787
# test _get_ip_xml can accepts strings: '192.168.122.0/24',
8888
# which is same as "192.168.122.0/255.255.255.0"
8989
params['net'] = '192.168.122.0/24'
90-
xml = ET.tostring(nxml._get_ip_elem(**params))
90+
xml = ET.tostring(nxml._get_ip_elem(**params), encoding='unicode')
9191
netmask = xpath_get_text(xml, '/ip/@netmask')[0]
9292
self.assertEqual(netmask, str(ipaddr.IPNetwork(params['net']).netmask))
9393

@@ -102,7 +102,7 @@ def test_forward_xml(self):
102102

103103
params['mode'] = 'nat'
104104
params['dev'] = 'eth0'
105-
xml = ET.tostring(nxml._get_forward_elem(**params))
105+
xml = ET.tostring(nxml._get_forward_elem(**params), encoding='unicode')
106106
mode = xpath_get_text(xml, '/forward/@mode')[0]
107107
dev = xpath_get_text(xml, '/forward/@dev')[0]
108108
self.assertEqual(params['mode'], mode)

xmlutils/bootorder.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ def get_bootorder_xml(boot_order=None):
4343
"""
4444
boot_xml = ''
4545
for device in get_bootorder_node(boot_order):
46-
boot_xml += ET.tostring(device, encoding='utf-8', pretty_print=True).decode(
47-
'utf-8'
48-
)
46+
boot_xml += ET.tostring(device, encoding='unicode', pretty_print=True)
4947

5048
return boot_xml
5149

0 commit comments

Comments
 (0)