Signed-off-by: Ozan Unsal <ounsal@redhat.com>
(cherry picked from commit aa0aae3d3e (centos_master))
		
	
			
		
			
				
	
	
		
			865 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			865 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| from unittest import mock
 | |
| 
 | |
| import os
 | |
| 
 | |
| from kobo.shortcuts import force_list
 | |
| 
 | |
| from tests import helpers
 | |
| from pungi.phases import ostree_installer as ostree
 | |
| from six.moves import shlex_quote
 | |
| 
 | |
| 
 | |
| LOG_PATH = "logs/x86_64/Everything/ostree_installer-1"
 | |
| 
 | |
| 
 | |
| class OstreeInstallerPhaseTest(helpers.PungiTestCase):
 | |
|     @mock.patch("pungi.phases.ostree_installer.ThreadPool")
 | |
|     def test_run(self, ThreadPool):
 | |
|         cfg = helpers.IterableMock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "ostree_installer": [("^Everything$", {"x86_64": cfg})],
 | |
|                 "runroot": True,
 | |
|                 "translate_paths": [(self.topdir + "/work", "http://example.com/work")],
 | |
|             },
 | |
|         )
 | |
| 
 | |
|         pool = ThreadPool.return_value
 | |
| 
 | |
|         phase = ostree.OstreeInstallerPhase(
 | |
|             compose, mock.Mock(), self._make_pkgset_phase(["p1", "p2"])
 | |
|         )
 | |
|         phase.run()
 | |
| 
 | |
|         self.assertEqual(len(pool.add.call_args_list), 1)
 | |
|         self.assertEqual(
 | |
|             pool.add.call_args_list[0][0][0].baseurls,
 | |
|             [
 | |
|                 "http://example.com/work/$basearch/repo/p1",
 | |
|                 "http://example.com/work/$basearch/repo/p2",
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             pool.queue_put.call_args_list,
 | |
|             [mock.call((compose, compose.variants["Everything"], "x86_64", cfg))],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.ostree_installer.ThreadPool")
 | |
|     def test_skip_without_config(self, ThreadPool):
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         compose.just_phases = None
 | |
|         compose.skip_phases = []
 | |
|         phase = ostree.OstreeInstallerPhase(compose, mock.Mock())
 | |
|         self.assertTrue(phase.skip())
 | |
| 
 | |
|     def test_validate_conflict_with_buildinstall(self):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"ostree_installer": [("^Server$", {"x86_64": mock.Mock()})]}
 | |
|         )
 | |
| 
 | |
|         skipmock = mock.Mock()
 | |
|         skipmock.skip.return_value = False
 | |
|         phase = ostree.OstreeInstallerPhase(compose, skipmock)
 | |
|         with self.assertRaises(ValueError) as ctx:
 | |
|             phase.validate()
 | |
| 
 | |
|         self.assertEqual(
 | |
|             str(ctx.exception),
 | |
|             "Can not generate ostree installer for Server.x86_64:"
 | |
|             " it has buildinstall running already and the files"
 | |
|             " would clash.",
 | |
|         )
 | |
| 
 | |
|     def test_validate_buildinstall_skipped(self):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"ostree_installer": [("^Server$", {"x86_64": mock.Mock()})]}
 | |
|         )
 | |
| 
 | |
|         phase = ostree.OstreeInstallerPhase(compose, mock.Mock(_skipped=True))
 | |
|         phase.validate()
 | |
| 
 | |
|     def test_validate_overwrite_enabled(self):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "ostree_installer_overwrite": True,
 | |
|                 "ostree_installer": [("^Server$", {"x86_64": mock.Mock()})],
 | |
|             },
 | |
|         )
 | |
| 
 | |
|         phase = ostree.OstreeInstallerPhase(compose, mock.Mock(_skipped=False))
 | |
|         phase.validate()
 | |
| 
 | |
| 
 | |
| class OstreeThreadTest(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(OstreeThreadTest, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "release_name": "Fedora",
 | |
|                 "release_version": "Rawhide",
 | |
|                 "koji_profile": "koji",
 | |
|                 "koji_cache": "/tmp",
 | |
|                 "runroot_tag": "rrt",
 | |
|                 "image_volid_formats": ["{release_short}-{variant}-{arch}"],
 | |
|                 "translate_paths": [(self.topdir + "/work", "http://example.com/work")],
 | |
|             },
 | |
|         )
 | |
| 
 | |
|     def assertImageAdded(self, compose, ImageCls, iso):
 | |
|         image = ImageCls.return_value
 | |
|         self.assertEqual(image.path, "Everything/x86_64/iso/image-name")
 | |
|         self.assertEqual(image.mtime, 13579)
 | |
|         self.assertEqual(image.size, 1024)
 | |
|         self.assertEqual(image.arch, "x86_64")
 | |
|         self.assertEqual(image.type, "dvd-ostree")
 | |
|         self.assertEqual(image.format, "iso")
 | |
|         self.assertEqual(image.disc_number, 1)
 | |
|         self.assertEqual(image.disc_count, 1)
 | |
|         self.assertEqual(image.bootable, True)
 | |
|         self.assertEqual(image.implant_md5, iso.get_implanted_md5.return_value)
 | |
|         self.assertEqual(
 | |
|             compose.im.add.mock_calls, [mock.call("Everything", "x86_64", image)]
 | |
|         )
 | |
| 
 | |
|     def assertRunrootCall(
 | |
|         self,
 | |
|         koji,
 | |
|         sources,
 | |
|         release,
 | |
|         isfinal=False,
 | |
|         extra=[],
 | |
|         extra_pkgs=[],
 | |
|         weight=None,
 | |
|     ):
 | |
|         lorax_cmd = [
 | |
|             "lorax",
 | |
|             "--product=Fedora",
 | |
|             "--version=Rawhide",
 | |
|             "--release=%s" % release,
 | |
|         ]
 | |
| 
 | |
|         for s in force_list(sources):
 | |
|             lorax_cmd.append(shlex_quote("--source=%s" % s))
 | |
| 
 | |
|         lorax_cmd.append("--variant=Everything")
 | |
|         lorax_cmd.append("--nomacboot")
 | |
| 
 | |
|         if isfinal:
 | |
|             lorax_cmd.append("--isfinal")
 | |
| 
 | |
|         lorax_cmd.append("--buildarch=x86_64")
 | |
|         lorax_cmd.append("--volid=test-Everything-x86_64")
 | |
| 
 | |
|         if extra:
 | |
|             lorax_cmd.extend(extra)
 | |
| 
 | |
|         outdir = self.topdir + "/work/x86_64/Everything/ostree_installer"
 | |
|         lorax_cmd.append(outdir)
 | |
| 
 | |
|         self.assertEqual(
 | |
|             koji.get_runroot_cmd.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "rrt",
 | |
|                     "x86_64",
 | |
|                     "rm -rf %s && %s" % (outdir, " ".join(lorax_cmd)),
 | |
|                     channel=None,
 | |
|                     mounts=[self.topdir],
 | |
|                     packages=["pungi", "lorax", "ostree"] + extra_pkgs,
 | |
|                     use_shell=True,
 | |
|                     weight=weight,
 | |
|                     chown_paths=[outdir],
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             koji.run_runroot_cmd.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     koji.get_runroot_cmd.return_value,
 | |
|                     log_file=os.path.join(self.topdir, LOG_PATH, "runroot.log"),
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     def assertIsoLinked(self, link, get_file_size, get_mtime, final_iso_path):
 | |
|         self.assertEqual(
 | |
|             link.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.topdir
 | |
|                     + "/work/x86_64/Everything/ostree_installer/images/boot.iso",
 | |
|                     final_iso_path,
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(get_file_size.call_args_list, [mock.call(final_iso_path)])
 | |
|         self.assertEqual(get_mtime.call_args_list, [mock.call(final_iso_path)])
 | |
| 
 | |
|     def assertAllCopied(self, copy_all):
 | |
|         self.assertEqual(
 | |
|             self.compose.get_image_name.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "x86_64", self.compose.variants["Everything"], disc_type="ostree"
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertTrue(os.path.isdir(self.topdir + "/work/x86_64/Everything/"))
 | |
|         self.assertFalse(
 | |
|             os.path.isdir(self.topdir + "/work/x86_64/Everything/ostree_installer")
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             copy_all.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "{0}/work/x86_64/Everything/ostree_installer".format(self.topdir),
 | |
|                     "{0}/compose/Everything/x86_64/os".format(self.topdir),
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         self.compose.supported = False
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|             "release": "20160321.n.0",
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             [
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ],
 | |
|             cfg["release"],
 | |
|             extra=["--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH)],
 | |
|         )
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     @mock.patch("pungi.phases.ostree_installer.move_all")
 | |
|     def test_run_koji_plugin(
 | |
|         self,
 | |
|         move_all,
 | |
|         KojiWrapper,
 | |
|         link,
 | |
|         iso,
 | |
|         get_file_size,
 | |
|         get_mtime,
 | |
|         ImageCls,
 | |
|         copy_all,
 | |
|     ):
 | |
|         self.compose.supported = False
 | |
|         self.compose.conf["ostree_installer_use_koji_plugin"] = True
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|             "release": "20160321.n.0",
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         args = {
 | |
|             "product": "Fedora",
 | |
|             "version": "Rawhide",
 | |
|             "release": "20160321.n.0",
 | |
|             "sources": [
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ],
 | |
|             "variant": "Everything",
 | |
|             "nomacboot": True,
 | |
|             "volid": "test-Everything-x86_64",
 | |
|             "buildarch": "x86_64",
 | |
|             "installpkgs": None,
 | |
|             "add-template": [],
 | |
|             "add-arch-template": [],
 | |
|             "add-template-var": None,
 | |
|             "add-arch-template-var": None,
 | |
|             "rootfs-size": None,
 | |
|             "isfinal": False,
 | |
|             "outputdir": self.topdir + "/work/x86_64/Everything/ostree_installer",
 | |
|         }
 | |
|         self.assertEqual(
 | |
|             koji.get_pungi_buildinstall_cmd.mock_calls,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "rrt",
 | |
|                     "x86_64",
 | |
|                     args,
 | |
|                     channel=None,
 | |
|                     packages=["pungi", "lorax", "ostree"],
 | |
|                     mounts=[self.topdir],
 | |
|                     weight=None,
 | |
|                     chown_uid=os.getuid(),
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             koji.run_runroot_cmd.mock_calls,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     koji.get_pungi_buildinstall_cmd.return_value,
 | |
|                     log_file=os.path.join(self.topdir, LOG_PATH, "runroot.log"),
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             move_all.mock_calls,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.topdir + "/work/x86_64/Everything/ostree_installer/results",
 | |
|                     self.topdir + "/work/x86_64/Everything/ostree_installer",
 | |
|                     rm_src_dir=True,
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.topdir + "/work/x86_64/Everything/ostree_installer/logs",
 | |
|                     os.path.join(self.topdir, LOG_PATH),
 | |
|                     rm_src_dir=True,
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_external_source(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "http://example.com/repo/$arch/",
 | |
|             "release": "20160321.n.0",
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             (
 | |
|                 "http://example.com/repo/x86_64/",
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ),
 | |
|             cfg["release"],
 | |
|             isfinal=True,
 | |
|             extra=["--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH)],
 | |
|         )
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_with_repo_key(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "release": "20160321.n.0",
 | |
|             "repo": [
 | |
|                 "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|                 "https://example.com/extra-repo1.repo",
 | |
|                 "https://example.com/extra-repo2.repo",
 | |
|             ],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         sources = [
 | |
|             "https://example.com/extra-repo1.repo",
 | |
|             "https://example.com/extra-repo2.repo",
 | |
|             "http://example.com/repo/1",
 | |
|             "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|         ]
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             sources,
 | |
|             cfg["release"],
 | |
|             isfinal=True,
 | |
|             extra=["--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH)],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_with_multiple_variant_repos(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "release": "20160321.n.0",
 | |
|             "repo": [
 | |
|                 "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|                 "Server",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|                 "https://example.com/extra-repo1.repo",
 | |
|                 "https://example.com/extra-repo2.repo",
 | |
|             ],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         sources = [
 | |
|             "https://example.com/extra-repo1.repo",
 | |
|             "https://example.com/extra-repo2.repo",
 | |
|             "http://example.com/repo/1",
 | |
|             "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|         ]
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             sources,
 | |
|             cfg["release"],
 | |
|             isfinal=True,
 | |
|             extra=["--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH)],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_without_comps(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         self.compose.has_comps = False
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "release": "20160321.n.0",
 | |
|             "repo": [],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         sources = ["http://example.com/repo/1"]
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             sources,
 | |
|             cfg["release"],
 | |
|             isfinal=True,
 | |
|             extra=["--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH)],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.wrappers.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_fail_with_relative_template_path_but_no_repo(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",
 | |
|             "release": "20160321.n.0",
 | |
|             "add_template": ["some-file.txt"],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         with self.assertRaises(RuntimeError) as ctx:
 | |
|             t.process(
 | |
|                 (self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1
 | |
|             )
 | |
| 
 | |
|         self.assertIn("template_repo", str(ctx.exception))
 | |
| 
 | |
|     @mock.patch("pungi.wrappers.scm.get_dir_from_scm")
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_clone_templates(
 | |
|         self,
 | |
|         KojiWrapper,
 | |
|         link,
 | |
|         iso,
 | |
|         get_file_size,
 | |
|         get_mtime,
 | |
|         ImageCls,
 | |
|         copy_all,
 | |
|         get_dir_from_scm,
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|             "release": "20160321.n.0",
 | |
|             "add_template": ["some_file.txt"],
 | |
|             "add_arch_template": ["other_file.txt"],
 | |
|             "template_repo": "git://example.com/templates.git",
 | |
|             "template_branch": "f24",
 | |
|             "extra_runroot_pkgs": ["templatedep"],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
|         templ_dir = self.topdir + "/work/x86_64/Everything/lorax_templates"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         self.assertEqual(
 | |
|             get_dir_from_scm.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     {
 | |
|                         "scm": "git",
 | |
|                         "repo": "git://example.com/templates.git",
 | |
|                         "branch": "f24",
 | |
|                         "dir": ".",
 | |
|                     },
 | |
|                     templ_dir,
 | |
|                     compose=self.compose,
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             [
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ],
 | |
|             cfg["release"],
 | |
|             isfinal=True,
 | |
|             extra=[
 | |
|                 "--add-template=%s/some_file.txt" % templ_dir,
 | |
|                 "--add-arch-template=%s/other_file.txt" % templ_dir,
 | |
|                 "--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH),
 | |
|             ],
 | |
|             extra_pkgs=["templatedep"],
 | |
|         )
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_with_explicitly_generated_release(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo  # noqa: E501
 | |
|             "release": "!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN",
 | |
|             "installpkgs": ["fedora-productimg-atomic"],
 | |
|             "add_template": [
 | |
|                 "/spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl"
 | |
|             ],
 | |
|             "add_template_var": [
 | |
|                 "ostree_osname=fedora-atomic",
 | |
|                 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
 | |
|             ],
 | |
|             "add_arch_template": [
 | |
|                 "/spin-kickstarts/atomic-installer/lorax-embed-repo.tmpl"
 | |
|             ],
 | |
|             "add_arch_template_var": [
 | |
|                 "ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",  # noqa: E501
 | |
|                 "ostree_osname=fedora-atomic",
 | |
|                 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
 | |
|             ],
 | |
|         }
 | |
|         self.compose.conf["runroot_weights"] = {"ostree_installer": 123}
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             [
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ],
 | |
|             "20151203.t.0",
 | |
|             isfinal=True,
 | |
|             extra=[
 | |
|                 "--installpkgs=fedora-productimg-atomic",
 | |
|                 "--add-template=/spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl",  # noqa: E501
 | |
|                 "--add-arch-template=/spin-kickstarts/atomic-installer/lorax-embed-repo.tmpl",  # noqa: E501
 | |
|                 "--add-template-var=ostree_osname=fedora-atomic",
 | |
|                 "--add-template-var=ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",  # noqa: E501
 | |
|                 "--add-arch-template-var=ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",  # noqa: E501
 | |
|                 "--add-arch-template-var=ostree_osname=fedora-atomic",
 | |
|                 "--add-arch-template-var=ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",  # noqa: E501
 | |
|                 "--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH),
 | |
|             ],
 | |
|             weight=123,
 | |
|         )
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_run_with_implicit_release(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",  # this variant-type repo is deprecated, in result will be replaced with default repo. # noqa: E501
 | |
|             "release": None,
 | |
|             "installpkgs": ["fedora-productimg-atomic"],
 | |
|             "add_template": [
 | |
|                 "/spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl"
 | |
|             ],
 | |
|             "add_template_var": [
 | |
|                 "ostree_osname=fedora-atomic",
 | |
|                 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
 | |
|             ],
 | |
|             "add_arch_template": [
 | |
|                 "/spin-kickstarts/atomic-installer/lorax-embed-repo.tmpl"
 | |
|             ],
 | |
|             "add_arch_template_var": [
 | |
|                 "ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",  # noqa: E501
 | |
|                 "ostree_osname=fedora-atomic",
 | |
|                 "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
 | |
|             ],
 | |
|         }
 | |
|         self.compose.conf["runroot_weights"] = {"ostree_installer": 123}
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "task_id": 1234,
 | |
|             "retcode": 0,
 | |
|             "output": "Foo bar\n",
 | |
|         }
 | |
|         get_file_size.return_value = 1024
 | |
|         get_mtime.return_value = 13579
 | |
|         final_iso_path = self.topdir + "/compose/Everything/x86_64/iso/image-name"
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
| 
 | |
|         self.assertRunrootCall(
 | |
|             koji,
 | |
|             [
 | |
|                 "http://example.com/repo/1",
 | |
|                 "http://example.com/work/$basearch/comps_repo_Everything",
 | |
|             ],
 | |
|             "20151203.t.0",
 | |
|             isfinal=True,
 | |
|             extra=[
 | |
|                 "--installpkgs=fedora-productimg-atomic",
 | |
|                 "--add-template=/spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl",  # noqa: E501
 | |
|                 "--add-arch-template=/spin-kickstarts/atomic-installer/lorax-embed-repo.tmpl",  # noqa: E501
 | |
|                 "--add-template-var=ostree_osname=fedora-atomic",
 | |
|                 "--add-template-var=ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",  # noqa: E501
 | |
|                 "--add-arch-template-var=ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",  # noqa: E501
 | |
|                 "--add-arch-template-var=ostree_osname=fedora-atomic",
 | |
|                 "--add-arch-template-var=ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",  # noqa: E501
 | |
|                 "--logfile=%s/%s/lorax.log" % (self.topdir, LOG_PATH),
 | |
|             ],
 | |
|             weight=123,
 | |
|         )
 | |
|         self.assertIsoLinked(link, get_file_size, get_mtime, final_iso_path)
 | |
|         self.assertImageAdded(self.compose, ImageCls, iso)
 | |
|         self.assertAllCopied(copy_all)
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_fail_crash(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {"repo": "Everything", "release": None, "failable": ["x86_64"]}
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.side_effect = helpers.boom
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
|         pool._logger.error.assert_has_calls(
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "[FAIL] Ostree installer (variant Everything, arch x86_64) failed, but going on anyway."  # noqa: E501
 | |
|                 ),
 | |
|                 mock.call("BOOM"),
 | |
|             ]
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.util.copy_all")
 | |
|     @mock.patch("productmd.images.Image")
 | |
|     @mock.patch("pungi.util.get_mtime")
 | |
|     @mock.patch("pungi.util.get_file_size")
 | |
|     @mock.patch("pungi.phases.ostree_installer.iso")
 | |
|     @mock.patch("os.link")
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     def test_fail_runroot_fail(
 | |
|         self, KojiWrapper, link, iso, get_file_size, get_mtime, ImageCls, copy_all
 | |
|     ):
 | |
|         pool = mock.Mock()
 | |
|         cfg = {
 | |
|             "repo": "Everything",
 | |
|             "release": None,
 | |
|             "failable": ["*"],
 | |
|         }
 | |
|         koji = KojiWrapper.return_value
 | |
|         koji.run_runroot_cmd.return_value = {
 | |
|             "output": "Failed",
 | |
|             "task_id": 1234,
 | |
|             "retcode": 1,
 | |
|         }
 | |
| 
 | |
|         t = ostree.OstreeInstallerThread(pool, ["http://example.com/repo/1"])
 | |
| 
 | |
|         t.process((self.compose, self.compose.variants["Everything"], "x86_64", cfg), 1)
 | |
|         pool._logger.error.assert_has_calls(
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "[FAIL] Ostree installer (variant Everything, arch x86_64) failed, but going on anyway."  # noqa: E501
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     "Runroot task failed: 1234. See %s/%s/runroot.log for more details."
 | |
|                     % (self.topdir, LOG_PATH)
 | |
|                 ),
 | |
|             ]
 | |
|         )
 |