From e98935f705a931e3ae666820387a419be1622b64 Mon Sep 17 00:00:00 2001 From: Lee Yarwood Date: Fri, 23 Apr 2021 12:14:42 +0100 Subject: [PATCH] guestfs: With libguestfs >= v1.41.1 decode returned bytes to string libguestfs >= v1.41.1 and commit 0ee02e0117527 changed the return type of read_file from string to bytes. https://github.com/libguestfs/libguestfs/commit/0ee02e0117527b86a31b2a88a14994ce7f15571f As we don't check the version of libguestfs installed this change handles both the original behaviour where a string is returned and the newer behaviour by decoding any returned bytes to a string. Closes-Bug: #1882421 Change-Id: I1c12b2903c1e5bf3a88394493456ad33233f3cd8 (cherry picked from commit 606d588e3eca1d88ad26b4c2cfa3f2e1d5ed553e) --- nova/tests/unit/virt/disk/vfs/fakeguestfs.py | 2 +- nova/virt/disk/api.py | 4 ++-- nova/virt/disk/vfs/guestfs.py | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/nova/tests/unit/virt/disk/vfs/fakeguestfs.py b/nova/tests/unit/virt/disk/vfs/fakeguestfs.py index 76304e1f150d..01715a9f7bf5 100644 --- a/nova/tests/unit/virt/disk/vfs/fakeguestfs.py +++ b/nova/tests/unit/virt/disk/vfs/fakeguestfs.py @@ -109,7 +109,7 @@ class GuestFS(object): "mode": 0o700 } - return self.files[path]["content"] + return bytes(self.files[path]["content"].encode()) def write(self, path, content): if path not in self.files: diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index 79d629f2830c..9902c0608ba4 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -615,8 +615,8 @@ def _set_passwd(username, admin_passwd, passwd_data, shadow_data): :param username: the username :param admin_passwd: the admin password - :param passwd_data: path to the passwd file - :param shadow_data: path to the shadow password file + :param passwd_data: Data from the passwd file decoded as a string + :param shadow_data: Data from the shadow file decoded as a string :returns: nothing :raises: exception.NovaException(), IOError() diff --git a/nova/virt/disk/vfs/guestfs.py b/nova/virt/disk/vfs/guestfs.py index 90586ef8f176..861ad80746d8 100644 --- a/nova/virt/disk/vfs/guestfs.py +++ b/nova/virt/disk/vfs/guestfs.py @@ -306,7 +306,14 @@ class VFSGuestFS(vfs.VFS): def read_file(self, path): LOG.debug("Read file path=%s", path) path = self._canonicalize_path(path) - return self.handle.read_file(path) + data = self.handle.read_file(path) + # NOTE(lyarwood): libguestfs v1.41.1 (0ee02e0117527) switched the + # return type of read_file from string to bytes and as such we need to + # handle both here, decoding and returning a string if bytes is + # provided. https://bugzilla.redhat.com/show_bug.cgi?id=1661871 + if isinstance(data, bytes): + return data.decode() + return data def has_file(self, path): LOG.debug("Has file path=%s", path)