[PATCH] tests/iso_gen.py: adding fake bootable PowerPC ISO

There was no support for ppc fake ISOs in iso_gen.py, which led to several tests crashing in Power systems when the test tries to create a template with a fake Intel ISO. Signed-off-by: Daniel Henrique Barboza <dhbarboza82@gmail.com> --- tests/iso_gen.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/tests/iso_gen.py b/tests/iso_gen.py index 34f091d..1d1262f 100644 --- a/tests/iso_gen.py +++ b/tests/iso_gen.py @@ -17,6 +17,7 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +import platform import struct from kimchi.isoinfo import IsoImage @@ -57,9 +58,12 @@ iso_des = [ class FakeIsoImage(object): def _build_iso(self, fd, iso_volid, bootable): - self._build_el_boot(fd, bootable) self._build_prim_vol(fd, iso_volid) - self._build_el_torito(fd) + if platform.machine().startswith('ppc'): + self._build_bootable_ppc_path_table(fd) + else: + self._build_el_boot(fd, bootable) + self._build_el_torito(fd) def _build_prim_vol(self, fd, iso_volid): fd.seek(16 * IsoImage.SECTOR_SIZE) @@ -125,6 +129,47 @@ class FakeIsoImage(object): s = 'a' * IsoImage.SECTOR_SIZE fd.write(s) + def _build_bootable_ppc_path_table(self, fd): + # write path table locator + PATH_TABLE_LOC_OFFSET = 16 * IsoImage.SECTOR_SIZE + 132 + PATH_TABLE_SIZE_LOC = struct.Struct("<I 4s I") + path_table_size = 64 + path_table_loc = 18 + fd.seek(PATH_TABLE_LOC_OFFSET) + fmt = PATH_TABLE_SIZE_LOC + data = (path_table_size, 4*'0', path_table_loc) + s = fmt.pack(*data) + fd.write(s) + # write path table entry + fd.seek(path_table_loc * IsoImage.SECTOR_SIZE) + DIR_NAMELEN_LOCATION_PARENT = struct.Struct("<B B I H 3s") + dir_struct_size = DIR_NAMELEN_LOCATION_PARENT.size + dir_namelen = 3 + dir_loc = 19 + dir_parent = 1 + dir_name = 'ppc' + data = (dir_namelen, 0, dir_loc, dir_parent, dir_name) + fmt = DIR_NAMELEN_LOCATION_PARENT + s = fmt.pack(*data) + fd.write(s) + # write 'ppc' dir record + ppc_dir_offset = dir_loc * IsoImage.SECTOR_SIZE + fd.seek(ppc_dir_offset) + STATIC_DIR_RECORD_FMT = struct.Struct("<B 9s I 11s B 6s B 12s") + dir_rec_len = 1 + unused1 = 9 * '0' + dir_size = 100 + unused2 = 11 * '0' + file_flags = 0 + unused3 = 6 * '0' + file_name_len = 12 + boot_file_name = "bootinfo.txt" + data = (dir_rec_len, unused1, dir_size, unused2, file_flags, + unused3, file_name_len, boot_file_name) + fmt = STATIC_DIR_RECORD_FMT + s = fmt.pack(*data) + fd.write(s) + def construct_fake_iso(path, bootable, version, distro): iso = FakeIsoImage() -- 1.9.3

Comments inline. On 01/28/2015 12:54 PM, Daniel Henrique Barboza wrote:
There was no support for ppc fake ISOs in iso_gen.py, which led to several tests crashing in Power systems when the test tries to create a template with a fake Intel ISO.
Signed-off-by: Daniel Henrique Barboza <dhbarboza82@gmail.com> --- tests/iso_gen.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/tests/iso_gen.py b/tests/iso_gen.py index 34f091d..1d1262f 100644 --- a/tests/iso_gen.py +++ b/tests/iso_gen.py @@ -17,6 +17,7 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+import platform import struct
from kimchi.isoinfo import IsoImage @@ -57,9 +58,12 @@ iso_des = [
class FakeIsoImage(object): def _build_iso(self, fd, iso_volid, bootable): - self._build_el_boot(fd, bootable) self._build_prim_vol(fd, iso_volid) - self._build_el_torito(fd) + if platform.machine().startswith('ppc'): + self._build_bootable_ppc_path_table(fd) + else: + self._build_el_boot(fd, bootable) + self._build_el_torito(fd) I don't think this will work for x86_64, because three calls _build_el_boot, _build_prim_vol and _build_el_torito write file in sequence without "fd.seek". That is to say we can't put _build_el_boot after _build_prim_vol.
Below is a centos ISO generated by this patch, isoinfo.py cannot read its format because the record is not right. royce@royce-cn:~/kimchi-2/kimchi$ PYTHONPATH=./src python ./src/kimchi/isoinfo.py /home/royce/kimchi-2/kimchi/tests/centos.iso Traceback (most recent call last): File "./src/kimchi/isoinfo.py", line 504, in <module> probe_iso(None, dict(path=sys.argv[1], updater=updater)) File "./src/kimchi/isoinfo.py", line 490, in probe_iso iso_img = IsoImage(loc) File "./src/kimchi/isoinfo.py", line 153, in __init__ raise IsoFormatError('KCHISO0009E', {'filename': self.path}) kimchi.exception.IsoFormatError: KCHISO0009E: Incomplete record while reading ISO /home/royce/kimchi-2/kimchi/tests/centos.iso. Before: royce@royce-cn:~/kimchi-2/kimchi/tests$ PYTHONPATH=../src python ../src/kimchi/isoinfo.py ./centos.iso [{'path': '/home/royce/kimchi-2/kimchi/tests/centos.iso', 'version': '6.1', 'distro': 'centos'}]
def _build_prim_vol(self, fd, iso_volid): fd.seek(16 * IsoImage.SECTOR_SIZE) @@ -125,6 +129,47 @@ class FakeIsoImage(object): s = 'a' * IsoImage.SECTOR_SIZE fd.write(s)
+ def _build_bootable_ppc_path_table(self, fd): + # write path table locator + PATH_TABLE_LOC_OFFSET = 16 * IsoImage.SECTOR_SIZE + 132 + PATH_TABLE_SIZE_LOC = struct.Struct("<I 4s I") + path_table_size = 64 + path_table_loc = 18 + fd.seek(PATH_TABLE_LOC_OFFSET) + fmt = PATH_TABLE_SIZE_LOC + data = (path_table_size, 4*'0', path_table_loc) + s = fmt.pack(*data) + fd.write(s) + # write path table entry + fd.seek(path_table_loc * IsoImage.SECTOR_SIZE) + DIR_NAMELEN_LOCATION_PARENT = struct.Struct("<B B I H 3s") + dir_struct_size = DIR_NAMELEN_LOCATION_PARENT.size + dir_namelen = 3 + dir_loc = 19 + dir_parent = 1 + dir_name = 'ppc' + data = (dir_namelen, 0, dir_loc, dir_parent, dir_name) + fmt = DIR_NAMELEN_LOCATION_PARENT + s = fmt.pack(*data) + fd.write(s) + # write 'ppc' dir record + ppc_dir_offset = dir_loc * IsoImage.SECTOR_SIZE + fd.seek(ppc_dir_offset) + STATIC_DIR_RECORD_FMT = struct.Struct("<B 9s I 11s B 6s B 12s") + dir_rec_len = 1 + unused1 = 9 * '0' + dir_size = 100 + unused2 = 11 * '0' + file_flags = 0 + unused3 = 6 * '0' + file_name_len = 12 + boot_file_name = "bootinfo.txt" + data = (dir_rec_len, unused1, dir_size, unused2, file_flags, + unused3, file_name_len, boot_file_name) + fmt = STATIC_DIR_RECORD_FMT + s = fmt.pack(*data) + fd.write(s) +
def construct_fake_iso(path, bootable, version, distro): iso = FakeIsoImage()

On 01/29/2015 05:55 AM, Royce Lv wrote:
Comments inline. On 01/28/2015 12:54 PM, Daniel Henrique Barboza wrote:
There was no support for ppc fake ISOs in iso_gen.py, which led to several tests crashing in Power systems when the test tries to create a template with a fake Intel ISO.
Signed-off-by: Daniel Henrique Barboza <dhbarboza82@gmail.com> --- tests/iso_gen.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/tests/iso_gen.py b/tests/iso_gen.py index 34f091d..1d1262f 100644 --- a/tests/iso_gen.py +++ b/tests/iso_gen.py @@ -17,6 +17,7 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+import platform import struct
from kimchi.isoinfo import IsoImage @@ -57,9 +58,12 @@ iso_des = [
class FakeIsoImage(object): def _build_iso(self, fd, iso_volid, bootable): - self._build_el_boot(fd, bootable) self._build_prim_vol(fd, iso_volid) - self._build_el_torito(fd) + if platform.machine().startswith('ppc'): + self._build_bootable_ppc_path_table(fd) + else: + self._build_el_boot(fd, bootable) + self._build_el_torito(fd) I don't think this will work for x86_64, because three calls _build_el_boot, _build_prim_vol and _build_el_torito write file in sequence without "fd.seek". That is to say we can't put _build_el_boot after _build_prim_vol. I wasn't aware that x86_64 functions were tied together that way. I'll fix it in v2.
Thanks!
Below is a centos ISO generated by this patch, isoinfo.py cannot read its format because the record is not right.
royce@royce-cn:~/kimchi-2/kimchi$ PYTHONPATH=./src python ./src/kimchi/isoinfo.py /home/royce/kimchi-2/kimchi/tests/centos.iso Traceback (most recent call last): File "./src/kimchi/isoinfo.py", line 504, in <module> probe_iso(None, dict(path=sys.argv[1], updater=updater)) File "./src/kimchi/isoinfo.py", line 490, in probe_iso iso_img = IsoImage(loc) File "./src/kimchi/isoinfo.py", line 153, in __init__ raise IsoFormatError('KCHISO0009E', {'filename': self.path}) kimchi.exception.IsoFormatError: KCHISO0009E: Incomplete record while reading ISO /home/royce/kimchi-2/kimchi/tests/centos.iso.
Before: royce@royce-cn:~/kimchi-2/kimchi/tests$ PYTHONPATH=../src python ../src/kimchi/isoinfo.py ./centos.iso [{'path': '/home/royce/kimchi-2/kimchi/tests/centos.iso', 'version': '6.1', 'distro': 'centos'}]
def _build_prim_vol(self, fd, iso_volid): fd.seek(16 * IsoImage.SECTOR_SIZE) @@ -125,6 +129,47 @@ class FakeIsoImage(object): s = 'a' * IsoImage.SECTOR_SIZE fd.write(s)
+ def _build_bootable_ppc_path_table(self, fd): + # write path table locator + PATH_TABLE_LOC_OFFSET = 16 * IsoImage.SECTOR_SIZE + 132 + PATH_TABLE_SIZE_LOC = struct.Struct("<I 4s I") + path_table_size = 64 + path_table_loc = 18 + fd.seek(PATH_TABLE_LOC_OFFSET) + fmt = PATH_TABLE_SIZE_LOC + data = (path_table_size, 4*'0', path_table_loc) + s = fmt.pack(*data) + fd.write(s) + # write path table entry + fd.seek(path_table_loc * IsoImage.SECTOR_SIZE) + DIR_NAMELEN_LOCATION_PARENT = struct.Struct("<B B I H 3s") + dir_struct_size = DIR_NAMELEN_LOCATION_PARENT.size + dir_namelen = 3 + dir_loc = 19 + dir_parent = 1 + dir_name = 'ppc' + data = (dir_namelen, 0, dir_loc, dir_parent, dir_name) + fmt = DIR_NAMELEN_LOCATION_PARENT + s = fmt.pack(*data) + fd.write(s) + # write 'ppc' dir record + ppc_dir_offset = dir_loc * IsoImage.SECTOR_SIZE + fd.seek(ppc_dir_offset) + STATIC_DIR_RECORD_FMT = struct.Struct("<B 9s I 11s B 6s B 12s") + dir_rec_len = 1 + unused1 = 9 * '0' + dir_size = 100 + unused2 = 11 * '0' + file_flags = 0 + unused3 = 6 * '0' + file_name_len = 12 + boot_file_name = "bootinfo.txt" + data = (dir_rec_len, unused1, dir_size, unused2, file_flags, + unused3, file_name_len, boot_file_name) + fmt = STATIC_DIR_RECORD_FMT + s = fmt.pack(*data) + fd.write(s) +
def construct_fake_iso(path, bootable, version, distro): iso = FakeIsoImage()
_______________________________________________ Kimchi-devel mailing list Kimchi-devel@ovirt.org http://lists.ovirt.org/mailman/listinfo/kimchi-devel
participants (2)
-
Daniel Henrique Barboza
-
Royce Lv