Split repoclosure into separate phase
Move repoclosure out from test phase into its own phase and run parallel with image building phases(osbs, imagebuild, ...) to speed things up. JIRA: RHELCMP-8 Signed-off-by: Haibo Lin <hlin@redhat.com>
This commit is contained in:
parent
e187b5ea79
commit
477b43d4e9
9 changed files with 473 additions and 380 deletions
236
tests/test_repoclosure_phase.py
Normal file
236
tests/test_repoclosure_phase.py
Normal file
|
|
@ -0,0 +1,236 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
import unittest
|
||||
|
||||
import mock
|
||||
import six
|
||||
|
||||
import pungi.phases.repoclosure as repoclosure_phase
|
||||
from tests.helpers import DummyCompose, PungiTestCase, mk_boom
|
||||
|
||||
try:
|
||||
import dnf # noqa: F401
|
||||
|
||||
HAS_DNF = True
|
||||
except ImportError:
|
||||
HAS_DNF = False
|
||||
|
||||
try:
|
||||
import yum # noqa: F401
|
||||
|
||||
HAS_YUM = True
|
||||
except ImportError:
|
||||
HAS_YUM = False
|
||||
|
||||
|
||||
class TestRepoclosure(PungiTestCase):
|
||||
def setUp(self):
|
||||
super(TestRepoclosure, self).setUp()
|
||||
self.maxDiff = None
|
||||
|
||||
def _get_repo(self, compose_id, variant, arch, path=None):
|
||||
path = path or arch + "/os"
|
||||
return {
|
||||
"%s-repoclosure-%s.%s" % (compose_id, variant, arch): self.topdir
|
||||
+ "/compose/%s/%s" % (variant, path)
|
||||
}
|
||||
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_skip_if_disabled(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_strictness": [("^.*$", {"*": "off"})]}
|
||||
)
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
self.assertEqual(mock_grc.call_args_list, [])
|
||||
|
||||
@unittest.skipUnless(HAS_YUM, "YUM is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_default_backend(self, mock_run, mock_grc):
|
||||
with mock.patch("six.PY2", new=True):
|
||||
compose = DummyCompose(self.topdir, {})
|
||||
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Client", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@unittest.skipUnless(HAS_DNF, "DNF is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_dnf_backend(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(self.topdir, {"repoclosure_backend": "dnf"})
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Client", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("glob.glob")
|
||||
@mock.patch("pungi.wrappers.repoclosure.extract_from_fus_logs")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_hybrid_variant(self, mock_run, mock_grc, effl, glob):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_backend": "dnf", "gather_method": "hybrid"}
|
||||
)
|
||||
f = mock.Mock()
|
||||
glob.return_value = [f]
|
||||
|
||||
def _log(a, v):
|
||||
return compose.paths.log.log_file(a, "repoclosure-%s" % compose.variants[v])
|
||||
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
self.assertEqual(mock_grc.call_args_list, [])
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
effl.call_args_list,
|
||||
[
|
||||
mock.call([f], _log("amd64", "Everything")),
|
||||
mock.call([f], _log("amd64", "Client")),
|
||||
mock.call([f], _log("amd64", "Server")),
|
||||
mock.call([f], _log("x86_64", "Server")),
|
||||
mock.call([f], _log("x86_64", "Everything")),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_report_error(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_strictness": [("^.*$", {"*": "fatal"})]}
|
||||
)
|
||||
mock_run.side_effect = mk_boom(cls=RuntimeError)
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
@unittest.skipUnless(HAS_DNF, "DNF is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_overwrite_options_creates_correct_commands(
|
||||
self, mock_run, mock_grc
|
||||
):
|
||||
compose = DummyCompose(
|
||||
self.topdir,
|
||||
{
|
||||
"repoclosure_backend": "dnf",
|
||||
"repoclosure_strictness": [
|
||||
("^.*$", {"*": "off"}),
|
||||
("^Server$", {"*": "fatal"}),
|
||||
],
|
||||
},
|
||||
)
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("pungi.phases.repoclosure._delete_repoclosure_cache_dirs")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.repoclosure.run")
|
||||
def test_repoclosure_uses_correct_behaviour(self, mock_run, mock_grc, mock_del):
|
||||
compose = DummyCompose(
|
||||
self.topdir,
|
||||
{
|
||||
"repoclosure_backend": "dnf",
|
||||
"repoclosure_strictness": [
|
||||
("^.*$", {"*": "off"}),
|
||||
("^Server$", {"*": "fatal"}),
|
||||
],
|
||||
},
|
||||
)
|
||||
mock_run.side_effect = mk_boom(cls=RuntimeError)
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
repoclosure_phase.run_repoclosure(compose)
|
||||
|
|
@ -1,17 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
try:
|
||||
import unittest2 as unittest
|
||||
except ImportError:
|
||||
import unittest
|
||||
|
||||
import mock
|
||||
import os
|
||||
import six
|
||||
|
||||
import pungi.phases.test as test_phase
|
||||
from tests.helpers import DummyCompose, PungiTestCase, touch, mk_boom
|
||||
from tests.helpers import DummyCompose, PungiTestCase, touch
|
||||
|
||||
try:
|
||||
import dnf # noqa: F401
|
||||
|
|
@ -311,212 +304,3 @@ class TestCheckImageSanity(PungiTestCase):
|
|||
test_phase.check_image_sanity(compose)
|
||||
|
||||
self.assertEqual(compose.log_warning.call_args_list, [])
|
||||
|
||||
|
||||
class TestRepoclosure(PungiTestCase):
|
||||
def setUp(self):
|
||||
super(TestRepoclosure, self).setUp()
|
||||
self.maxDiff = None
|
||||
|
||||
def _get_repo(self, compose_id, variant, arch, path=None):
|
||||
path = path or arch + "/os"
|
||||
return {
|
||||
"%s-repoclosure-%s.%s" % (compose_id, variant, arch): self.topdir
|
||||
+ "/compose/%s/%s" % (variant, path)
|
||||
}
|
||||
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_skip_if_disabled(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_strictness": [("^.*$", {"*": "off"})]}
|
||||
)
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
self.assertEqual(mock_grc.call_args_list, [])
|
||||
|
||||
@unittest.skipUnless(HAS_YUM, "YUM is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_default_backend(self, mock_run, mock_grc):
|
||||
with mock.patch("six.PY2", new=True):
|
||||
compose = DummyCompose(self.topdir, {})
|
||||
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Client", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="yum",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@unittest.skipUnless(HAS_DNF, "DNF is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_dnf_backend(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(self.topdir, {"repoclosure_backend": "dnf"})
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Client", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Everything", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("glob.glob")
|
||||
@mock.patch("pungi.wrappers.repoclosure.extract_from_fus_logs")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_hybrid_variant(self, mock_run, mock_grc, effl, glob):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_backend": "dnf", "gather_method": "hybrid"}
|
||||
)
|
||||
f = mock.Mock()
|
||||
glob.return_value = [f]
|
||||
|
||||
def _log(a, v):
|
||||
return compose.paths.log.log_file(a, "repoclosure-%s" % compose.variants[v])
|
||||
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
self.assertEqual(mock_grc.call_args_list, [])
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
effl.call_args_list,
|
||||
[
|
||||
mock.call([f], _log("amd64", "Everything")),
|
||||
mock.call([f], _log("amd64", "Client")),
|
||||
mock.call([f], _log("amd64", "Server")),
|
||||
mock.call([f], _log("x86_64", "Server")),
|
||||
mock.call([f], _log("x86_64", "Everything")),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_report_error(self, mock_run, mock_grc):
|
||||
compose = DummyCompose(
|
||||
self.topdir, {"repoclosure_strictness": [("^.*$", {"*": "fatal"})]}
|
||||
)
|
||||
mock_run.side_effect = mk_boom(cls=RuntimeError)
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
@unittest.skipUnless(HAS_DNF, "DNF is not available")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_overwrite_options_creates_correct_commands(
|
||||
self, mock_run, mock_grc
|
||||
):
|
||||
compose = DummyCompose(
|
||||
self.topdir,
|
||||
{
|
||||
"repoclosure_backend": "dnf",
|
||||
"repoclosure_strictness": [
|
||||
("^.*$", {"*": "off"}),
|
||||
("^Server$", {"*": "fatal"}),
|
||||
],
|
||||
},
|
||||
)
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
||||
six.assertCountEqual(
|
||||
self,
|
||||
mock_grc.call_args_list,
|
||||
[
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["amd64", "x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "amd64"),
|
||||
),
|
||||
mock.call(
|
||||
backend="dnf",
|
||||
arch=["x86_64", "noarch"],
|
||||
lookaside={},
|
||||
repos=self._get_repo(compose.compose_id, "Server", "x86_64"),
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@mock.patch("pungi.phases.test._delete_repoclosure_cache_dirs")
|
||||
@mock.patch("pungi.wrappers.repoclosure.get_repoclosure_cmd")
|
||||
@mock.patch("pungi.phases.test.run")
|
||||
def test_repoclosure_uses_correct_behaviour(self, mock_run, mock_grc, mock_del):
|
||||
compose = DummyCompose(
|
||||
self.topdir,
|
||||
{
|
||||
"repoclosure_backend": "dnf",
|
||||
"repoclosure_strictness": [
|
||||
("^.*$", {"*": "off"}),
|
||||
("^Server$", {"*": "fatal"}),
|
||||
],
|
||||
},
|
||||
)
|
||||
mock_run.side_effect = mk_boom(cls=RuntimeError)
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
test_phase.run_repoclosure(compose)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue