#286 284 and 285 with fixed tests
Merged 9 years ago by ausil. Opened 9 years ago by lsedlar.
lsedlar/pungi isohybrid  into  master

file modified
+16 -18
@@ -2,12 +2,10 @@ 

  

  import argparse

  import os

- import contextlib

  from kobo import shortcuts

  

  from .wrappers.iso import IsoWrapper

  from .wrappers.jigdo import JigdoWrapper

- from .util import makedirs

  

  

  def find_templates(fallback):
@@ -20,16 +18,6 @@ 

      return output.strip()

  

  

- @contextlib.contextmanager

- def in_dir(dir):

-     """Temporarily switch to another directory."""

-     old_cwd = os.getcwd()

-     makedirs(dir)

-     os.chdir(dir)

-     yield

-     os.chdir(old_cwd)

- 

- 

  def make_image(iso, opts):

      mkisofs_kwargs = {}

  
@@ -49,16 +37,26 @@ 

      cmd = iso.get_mkisofs_cmd(opts.iso_name, None, volid=opts.volid,

                                exclude=["./lost+found"],

                                graft_points=opts.graft_points, **mkisofs_kwargs)

-     shortcuts.run(cmd, stdout=True, show_cmd=True)

+     shortcuts.run(cmd, stdout=True, show_cmd=True, workdir=opts.output_dir)

  

  

  def implant_md5(iso, opts):

      cmd = iso.get_implantisomd5_cmd(opts.iso_name, opts.supported)

-     shortcuts.run(cmd, stdout=True, show_cmd=True)

+     shortcuts.run(cmd, stdout=True, show_cmd=True, workdir=opts.output_dir)

+ 

+ 

+ def run_isohybrid(iso, opts):

+     """If the image is bootable, it needs to include an MBR or GPT so that it

+     can actually be booted. This is done by running isohybrid on the image.

+     """

+     if opts.buildinstall_method and opts.arch in ["x86_64", "i386"]:

+         cmd = iso.get_isohybrid_cmd(opts.iso_name, opts.arch)

+         shortcuts.run(cmd, stdout=True, show_cmd=True, workdir=opts.output_dir)

  

  

  def make_manifest(iso, opts):

-     shortcuts.run(iso.get_manifest_cmd(opts.iso_name), stdout=True, show_cmd=True)

+     shortcuts.run(iso.get_manifest_cmd(opts.iso_name), stdout=True,

+                   show_cmd=True, workdir=opts.output_dir)

  

  

  def make_jigdo(opts):
@@ -73,12 +71,13 @@ 

      cmd = jigdo.get_jigdo_cmd(os.path.join(opts.output_dir, opts.iso_name),

                                files, output_dir=opts.jigdo_dir,

                                no_servers=True, report="noprogress")

-     shortcuts.run(cmd, stdout=True, show_cmd=True)

+     shortcuts.run(cmd, stdout=True, show_cmd=True, workdir=opts.output_dir)

  

  

  def run(opts):

      iso = IsoWrapper()

      make_image(iso, opts)

+     run_isohybrid(iso, opts)

      implant_md5(iso, opts)

      make_manifest(iso, opts)

      if opts.jigdo_dir:
@@ -111,5 +110,4 @@ 

  

      if bool(opts.jigdo_dir) != bool(opts.os_tree):

          parser.error('--jigdo-dir must be used together with --os-tree')

-     with in_dir(opts.output_dir):

-         run(opts)

+     run(opts)

@@ -165,7 +165,7 @@ 

                      sourcerpm_name = kobo.rpmlib.parse_nvra(i.sourcerpm)["name"]

                      seen_sourcerpms.add(sourcerpm_name)

  

-                 self.file_cache[i.file_path] = i

+                 self.file_cache.file_cache[i.file_path] = i

                  self.rpms_by_arch[arch].append(i)

  

          self.log_debug("[DONE ] %s" % msg)

file modified
+9
@@ -205,6 +205,15 @@ 

          result = line.rsplit(":")[-1].strip()

          return result

  

+     def get_isohybrid_cmd(self, iso_path, arch):

+         # isohybrid is in syslinux which is x86 only

+         cmd = ["/usr/bin/isohybrid"]

+         # uefi is only supported on x86_64

+         if arch == "x86_64":

+             cmd.append("--uefi")

+         cmd.append(iso_path)

+         return cmd

+ 

      def get_manifest_cmd(self, iso_name):

          return "isoinfo -R -f -i %s | grep -v '/TRANS.TBL$' | sort >> %s.manifest" % (pipes.quote(iso_name), pipes.quote(iso_name))

  

file modified
+66 -23
@@ -13,17 +13,21 @@ 

  from pungi import createiso

  

  

- class OstreeScriptTest(helpers.PungiTestCase):

+ class CreateIsoScriptTest(helpers.PungiTestCase):

  

      def assertEqualCalls(self, actual, expected):

          self.assertEqual(len(actual), len(expected))

          for x, y in zip(actual, expected):

              self.assertEqual(x, y)

  

+     def setUp(self):

+         super(CreateIsoScriptTest, self).setUp()

+         self.outdir = os.path.join(self.topdir, 'isos')

+ 

      @mock.patch('kobo.shortcuts.run')

      def test_minimal_run(self, run):

          createiso.main([

-             '--output-dir={}/isos'.format(self.topdir),

+             '--output-dir={}'.format(self.outdir),

              '--iso-name=DP-1.0-20160405.t.3-x86_64.iso',

              '--volid=DP-1.0-20160405.t.3',

              '--graft-points=graft-list',
@@ -38,11 +42,11 @@ 

                          '-input-charset', 'utf-8', '-x', './lost+found',

                          '-o', 'DP-1.0-20160405.t.3-x86_64.iso',

                          '-graft-points', '-path-list', 'graft-list'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-x86_64.iso'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-x86_64.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-x86_64.iso.manifest',

-                        show_cmd=True, stdout=True)]

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

          )

  

      @mock.patch('kobo.shortcuts.run')
@@ -50,7 +54,7 @@ 

          run.return_value = (0, '/usr/share/lorax')

  

          createiso.main([

-             '--output-dir={}/isos'.format(self.topdir),

+             '--output-dir={}'.format(self.outdir),

              '--iso-name=DP-1.0-20160405.t.3-x86_64.iso',

              '--volid=DP-1.0-20160405.t.3',

              '--graft-points=graft-list',
@@ -72,13 +76,52 @@ 

                          '-no-emul-boot',

                          '-o', 'DP-1.0-20160405.t.3-x86_64.iso',

                          '-graft-points', '-path-list', 'graft-list'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['pungi-pylorax-find-templates', '/usr/share/lorax'],

                         show_cmd=True, stdout=True),

+              mock.call(['/usr/bin/isohybrid', '--uefi', 'DP-1.0-20160405.t.3-x86_64.iso'],

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-x86_64.iso'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-x86_64.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-x86_64.iso.manifest',

-                        show_cmd=True, stdout=True)]

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

+         )

+ 

+     @mock.patch('kobo.shortcuts.run')

+     def test_bootable_run_on_i386(self, run):

+         # This will call isohybrid, but not with --uefi switch

+         run.return_value = (0, '/usr/share/lorax')

+ 

+         createiso.main([

+             '--output-dir={}'.format(self.outdir),

+             '--iso-name=DP-1.0-20160405.t.3-i386.iso',

+             '--volid=DP-1.0-20160405.t.3',

+             '--graft-points=graft-list',

+             '--arch=i386',

+             '--buildinstall-method=lorax',

+         ])

+ 

+         self.maxDiff = None

+         self.assertItemsEqual(

+             run.call_args_list,

+             [mock.call(['/usr/bin/genisoimage', '-untranslated-filenames',

+                         '-volid', 'DP-1.0-20160405.t.3', '-J', '-joliet-long',

+                         '-rational-rock', '-translation-table',

+                         '-input-charset', 'utf-8', '-x', './lost+found',

+                         '-b', 'isolinux/isolinux.bin', '-c', 'isolinux/boot.cat',

+                         '-no-emul-boot',

+                         '-boot-load-size', '4', '-boot-info-table',

+                         '-o', 'DP-1.0-20160405.t.3-i386.iso',

+                         '-graft-points', '-path-list', 'graft-list'],

+                        show_cmd=True, stdout=True, workdir=self.outdir),

+              mock.call(['pungi-pylorax-find-templates', '/usr/share/lorax'],

+                        show_cmd=True, stdout=True),

+              mock.call(['/usr/bin/isohybrid', 'DP-1.0-20160405.t.3-i386.iso'],

+                        show_cmd=True, stdout=True, workdir=self.outdir),

+              mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-i386.iso'],

+                        show_cmd=True, stdout=True, workdir=self.outdir),

+              mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-i386.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-i386.iso.manifest',

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

          )

  

      @mock.patch('kobo.shortcuts.run')
@@ -86,7 +129,7 @@ 

          run.return_value = (0, '/usr/share/lorax')

  

          createiso.main([

-             '--output-dir={}/isos'.format(self.topdir),

+             '--output-dir={}'.format(self.outdir),

              '--iso-name=DP-1.0-20160405.t.3-ppc64.iso',

              '--volid=DP-1.0-20160405.t.3',

              '--graft-points=graft-list',
@@ -106,19 +149,19 @@ 

                          '-hfs-bless', '/ppc/mac',

                          '-o', 'DP-1.0-20160405.t.3-ppc64.iso',

                          '-graft-points', '-path-list', 'graft-list'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['pungi-pylorax-find-templates', '/usr/share/lorax'],

                         show_cmd=True, stdout=True),

               mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-ppc64.iso'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-ppc64.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-ppc64.iso.manifest',

-                        show_cmd=True, stdout=True)]

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

          )

  

      @mock.patch('kobo.shortcuts.run')

      def test_bootable_run_buildinstall(self, run):

          createiso.main([

-             '--output-dir={}/isos'.format(self.topdir),

+             '--output-dir={}'.format(self.outdir),

              '--iso-name=DP-1.0-20160405.t.3-ppc64.iso',

              '--volid=DP-1.0-20160405.t.3',

              '--graft-points=graft-list',
@@ -139,11 +182,11 @@ 

                          '-hfs-bless', '/ppc/mac',

                          '-o', 'DP-1.0-20160405.t.3-ppc64.iso',

                          '-graft-points', '-path-list', 'graft-list'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-ppc64.iso'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-ppc64.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-ppc64.iso.manifest',

-                        show_cmd=True, stdout=True)]

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

          )

  

      @mock.patch('sys.stderr')
@@ -151,7 +194,7 @@ 

      def test_run_with_jigdo_bad_args(self, run, stderr):

          with self.assertRaises(SystemExit):

              createiso.main([

-                 '--output-dir={}/isos'.format(self.topdir),

+                 '--output-dir={}'.format(self.outdir),

                  '--iso-name=DP-1.0-20160405.t.3-x86_64.iso',

                  '--volid=DP-1.0-20160405.t.3',

                  '--graft-points=graft-list',
@@ -162,7 +205,7 @@ 

      @mock.patch('kobo.shortcuts.run')

      def test_run_with_jigdo(self, run):

          createiso.main([

-             '--output-dir={}/isos'.format(self.topdir),

+             '--output-dir={}'.format(self.outdir),

              '--iso-name=DP-1.0-20160405.t.3-x86_64.iso',

              '--volid=DP-1.0-20160405.t.3',

              '--graft-points=graft-list',
@@ -179,17 +222,17 @@ 

                          '-input-charset', 'utf-8', '-x', './lost+found',

                          '-o', 'DP-1.0-20160405.t.3-x86_64.iso',

                          '-graft-points', '-path-list', 'graft-list'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['/usr/bin/implantisomd5', 'DP-1.0-20160405.t.3-x86_64.iso'],

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call('isoinfo -R -f -i DP-1.0-20160405.t.3-x86_64.iso | grep -v \'/TRANS.TBL$\' | sort >> DP-1.0-20160405.t.3-x86_64.iso.manifest',

-                        show_cmd=True, stdout=True),

+                        show_cmd=True, stdout=True, workdir=self.outdir),

               mock.call(['jigdo-file', 'make-template', '--force',

                          '--image={}/isos/DP-1.0-20160405.t.3-x86_64.iso'.format(self.topdir),

                          '--jigdo={}/jigdo/DP-1.0-20160405.t.3-x86_64.iso.jigdo'.format(self.topdir),

                          '--template={}/jigdo/DP-1.0-20160405.t.3-x86_64.iso.template'.format(self.topdir),

                          '--no-servers-section', '--report=noprogress', self.topdir + '/os//'],

-                        show_cmd=True, stdout=True)]

+                        show_cmd=True, stdout=True, workdir=self.outdir)]

          )

  

  

@@ -70,6 +70,7 @@ 

      """

      def __init__(self, _wrapper):

          super(MockFileCache, self).__init__()

+         self.file_cache = self

  

      def add(self, file_path):

          obj = MockFile(file_path)

no initial comment

This PR contains patches from #284 (to fix creating package set, which is broken in master right now) and #285 to fix bootable ISOs.

Pull-Request has been merged by ausil

9 years ago