473 lines
17 KiB
Python
473 lines
17 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
|
||
|
import json
|
||
|
import os
|
||
|
|
||
|
import mock
|
||
|
import six
|
||
|
import yaml
|
||
|
|
||
|
from tests import helpers
|
||
|
from pungi import ostree
|
||
|
|
||
|
|
||
|
class OstreeTreeScriptTest(helpers.PungiTestCase):
|
||
|
def setUp(self):
|
||
|
super(OstreeTreeScriptTest, self).setUp()
|
||
|
self.repo = os.path.join(self.topdir, "atomic")
|
||
|
|
||
|
def _make_dummy_config_dir(self, path):
|
||
|
helpers.touch(
|
||
|
os.path.join(path, "fedora-atomic-docker-host.json"),
|
||
|
json.dumps(
|
||
|
{
|
||
|
"ref": "fedora-atomic/25/x86_64",
|
||
|
"repos": ["fedora-rawhide", "fedora-24", "fedora-23"],
|
||
|
}
|
||
|
),
|
||
|
)
|
||
|
helpers.touch(
|
||
|
os.path.join(path, "fedora-atomic-docker-host.yaml"),
|
||
|
yaml.dump(
|
||
|
{
|
||
|
"ref": "fedora-atomic/25/x86_64",
|
||
|
"repos": ["fedora-rawhide", "fedora-24", "fedora-23"],
|
||
|
}
|
||
|
),
|
||
|
)
|
||
|
helpers.touch(
|
||
|
os.path.join(path, "fedora-rawhide.repo"),
|
||
|
"[fedora-rawhide]\nmirrorlist=mirror-mirror-on-the-wall",
|
||
|
)
|
||
|
helpers.touch(
|
||
|
os.path.join(path, "fedora-24.repo"),
|
||
|
"[fedora-24]\nmetalink=who-is-the-fairest-of-them-all",
|
||
|
)
|
||
|
helpers.touch(
|
||
|
os.path.join(path, "fedora-23.repo"),
|
||
|
"[fedora-23]\nbaseurl=why-not-zoidberg?",
|
||
|
)
|
||
|
|
||
|
def assertCorrectCall(self, mock_run, extra_calls=[], extra_args=[]):
|
||
|
six.assertCountEqual(
|
||
|
self,
|
||
|
mock_run.call_args_list,
|
||
|
[
|
||
|
mock.call(
|
||
|
[
|
||
|
"rpm-ostree",
|
||
|
"compose",
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--write-commitid-to=%s"
|
||
|
% (self.topdir + "/logs/Atomic/commitid.log"),
|
||
|
"--touch-if-changed=%s.stamp"
|
||
|
% (self.topdir + "/logs/Atomic/commitid.log"),
|
||
|
]
|
||
|
+ extra_args
|
||
|
+ [self.topdir + "/fedora-atomic-docker-host.json"],
|
||
|
logfile=self.topdir + "/logs/Atomic/create-ostree-repo.log",
|
||
|
show_cmd=True,
|
||
|
stdout=True,
|
||
|
universal_newlines=True,
|
||
|
)
|
||
|
]
|
||
|
+ extra_calls,
|
||
|
)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_full_run(self, run):
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(run)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_run_on_existing_empty_dir(self, run):
|
||
|
os.mkdir(self.repo)
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(run)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_run_on_initialized_repo(self, run):
|
||
|
helpers.touch(os.path.join(self.repo, "initialized"))
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(run)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_update_summary(self, run):
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
"--update-summary",
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(
|
||
|
run,
|
||
|
extra_calls=[
|
||
|
mock.call(
|
||
|
["ostree", "summary", "-u", "--repo=%s" % self.repo],
|
||
|
logfile=self.topdir + "/logs/Atomic/ostree-summary.log",
|
||
|
show_cmd=True,
|
||
|
stdout=True,
|
||
|
universal_newlines=True,
|
||
|
)
|
||
|
],
|
||
|
)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_versioning_metadata(self, run):
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
"--version=24",
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(run, extra_args=["--add-metadata-string=version=24"])
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_ostree_ref(self, run):
|
||
|
self._make_dummy_config_dir(self.topdir)
|
||
|
treefile = os.path.join(self.topdir, "fedora-atomic-docker-host.json")
|
||
|
|
||
|
with open(treefile, "r") as f:
|
||
|
treefile_content = json.load(f)
|
||
|
original_repos = treefile_content["repos"]
|
||
|
original_ref = treefile_content["ref"]
|
||
|
replacing_ref = original_ref + "-changed"
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s" % treefile,
|
||
|
"--ostree-ref=%s" % replacing_ref,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
with open(treefile, "r") as f:
|
||
|
treefile_content = json.load(f)
|
||
|
new_repos = treefile_content["repos"]
|
||
|
new_ref = treefile_content["ref"]
|
||
|
|
||
|
# ref value in treefile should be overrided with new ref
|
||
|
self.assertEqual(replacing_ref, new_ref)
|
||
|
# repos should stay unchanged
|
||
|
self.assertEqual(original_repos, new_repos)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_run_with_yaml_file(self, run):
|
||
|
self._make_dummy_config_dir(self.topdir)
|
||
|
treefile = os.path.join(self.topdir, "fedora-atomic-docker-host.yaml")
|
||
|
|
||
|
with open(treefile, "r") as f:
|
||
|
# Read initial content from YAML file
|
||
|
treefile_content = yaml.safe_load(f)
|
||
|
original_repos = treefile_content["repos"]
|
||
|
original_ref = treefile_content["ref"]
|
||
|
replacing_ref = original_ref + "-changed"
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s" % treefile,
|
||
|
"--ostree-ref=%s" % replacing_ref,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
with open(treefile.replace(".yaml", ".json"), "r") as f:
|
||
|
# There is now a tweaked JSON file
|
||
|
treefile_content = json.load(f)
|
||
|
new_repos = treefile_content["repos"]
|
||
|
new_ref = treefile_content["ref"]
|
||
|
|
||
|
# ref value in treefile should be overrided with new ref
|
||
|
self.assertEqual(replacing_ref, new_ref)
|
||
|
# repos should stay unchanged
|
||
|
self.assertEqual(original_repos, new_repos)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_force_new_commit(self, run):
|
||
|
helpers.touch(os.path.join(self.repo, "initialized"))
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s/fedora-atomic-docker-host.json" % self.topdir,
|
||
|
"--force-new-commit",
|
||
|
]
|
||
|
)
|
||
|
|
||
|
self.assertCorrectCall(run, extra_args=["--force-nocache"])
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_extra_config_with_extra_repos(self, run):
|
||
|
configdir = os.path.join(self.topdir, "config")
|
||
|
self._make_dummy_config_dir(configdir)
|
||
|
treefile = os.path.join(configdir, "fedora-atomic-docker-host.json")
|
||
|
|
||
|
extra_config_file = os.path.join(self.topdir, "extra_config.json")
|
||
|
extra_config = {
|
||
|
"repo": [
|
||
|
{"name": "server", "baseurl": "http://www.example.com/Server/repo"},
|
||
|
{
|
||
|
"name": "optional",
|
||
|
"baseurl": "http://example.com/repo/x86_64/optional",
|
||
|
"exclude": "systemd-container",
|
||
|
"gpgcheck": False,
|
||
|
},
|
||
|
{"name": "extra", "baseurl": "http://example.com/repo/x86_64/extra"},
|
||
|
]
|
||
|
}
|
||
|
helpers.touch(extra_config_file, json.dumps(extra_config))
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s" % treefile,
|
||
|
"--extra-config=%s" % extra_config_file,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
pungi_repo = os.path.join(configdir, "pungi.repo")
|
||
|
self.assertTrue(os.path.isfile(pungi_repo))
|
||
|
with open(pungi_repo, "r") as f:
|
||
|
content = f.read().strip()
|
||
|
result_template = (
|
||
|
"[repo-0]",
|
||
|
"name=repo-0",
|
||
|
"baseurl=http://example.com/repo/x86_64/extra",
|
||
|
"gpgcheck=0",
|
||
|
"[repo-1]",
|
||
|
"name=repo-1",
|
||
|
"baseurl=http://example.com/repo/x86_64/optional",
|
||
|
"exclude=systemd-container",
|
||
|
"gpgcheck=0",
|
||
|
"[repo-2]",
|
||
|
"name=repo-2",
|
||
|
"baseurl=http://www.example.com/Server/repo",
|
||
|
"gpgcheck=0",
|
||
|
)
|
||
|
result = "\n".join(result_template).strip()
|
||
|
self.assertEqual(content, result)
|
||
|
|
||
|
treeconf = json.load(open(treefile, "r"))
|
||
|
repos = treeconf["repos"]
|
||
|
self.assertEqual(len(repos), 3)
|
||
|
for name in ("repo-0", "repo-1", "repo-2"):
|
||
|
self.assertIn(name, repos)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_extra_config_with_keep_original_sources(self, run):
|
||
|
|
||
|
configdir = os.path.join(self.topdir, "config")
|
||
|
self._make_dummy_config_dir(configdir)
|
||
|
treefile = os.path.join(configdir, "fedora-atomic-docker-host.json")
|
||
|
|
||
|
extra_config_file = os.path.join(self.topdir, "extra_config.json")
|
||
|
extra_config = {
|
||
|
"repo": [
|
||
|
{"name": "server", "baseurl": "http://www.example.com/Server/repo"},
|
||
|
{
|
||
|
"name": "optional",
|
||
|
"baseurl": "http://example.com/repo/x86_64/optional",
|
||
|
"exclude": "systemd-container",
|
||
|
"gpgcheck": False,
|
||
|
},
|
||
|
{"name": "extra", "baseurl": "http://example.com/repo/x86_64/extra"},
|
||
|
],
|
||
|
"keep_original_sources": True,
|
||
|
}
|
||
|
helpers.touch(extra_config_file, json.dumps(extra_config))
|
||
|
|
||
|
ostree.main(
|
||
|
[
|
||
|
"tree",
|
||
|
"--repo=%s" % self.repo,
|
||
|
"--log-dir=%s" % os.path.join(self.topdir, "logs", "Atomic"),
|
||
|
"--treefile=%s" % treefile,
|
||
|
"--extra-config=%s" % extra_config_file,
|
||
|
]
|
||
|
)
|
||
|
|
||
|
treeconf = json.load(open(treefile, "r"))
|
||
|
repos = treeconf["repos"]
|
||
|
self.assertEqual(len(repos), 6)
|
||
|
for name in [
|
||
|
"fedora-rawhide",
|
||
|
"fedora-24",
|
||
|
"fedora-23",
|
||
|
"repo-0",
|
||
|
"repo-1",
|
||
|
"repo-2",
|
||
|
]:
|
||
|
self.assertIn(name, repos)
|
||
|
|
||
|
|
||
|
class OstreeInstallerScriptTest(helpers.PungiTestCase):
|
||
|
def setUp(self):
|
||
|
super(OstreeInstallerScriptTest, self).setUp()
|
||
|
self.product = "dummyproduct"
|
||
|
self.version = "1.0"
|
||
|
self.release = "20160101.t.0"
|
||
|
self.output = os.path.join(self.topdir, "output")
|
||
|
self.logdir = os.path.join(self.topdir, "logs")
|
||
|
self.volid = "%s-%s" % (self.product, self.version)
|
||
|
self.variant = "dummy"
|
||
|
self.rootfs_size = None
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_run_with_args(self, run):
|
||
|
args = [
|
||
|
"installer",
|
||
|
"--product=%s" % self.product,
|
||
|
"--version=%s" % self.version,
|
||
|
"--release=%s" % self.release,
|
||
|
"--output=%s" % self.output,
|
||
|
"--variant=%s" % self.variant,
|
||
|
"--rootfs-size=%s" % self.rootfs_size,
|
||
|
"--nomacboot",
|
||
|
"--isfinal",
|
||
|
]
|
||
|
args.append("--source=%s" % "http://www.example.com/dummy/repo")
|
||
|
args.append("--installpkgs=dummy-foo")
|
||
|
args.append("--installpkgs=dummy-bar")
|
||
|
args.append("--add-template=/path/to/lorax.tmpl")
|
||
|
args.append("--add-template-var=ostree_osname=dummy")
|
||
|
args.append("--add-arch-template=/path/to/lorax-embed.tmpl")
|
||
|
args.append("--add-arch-template-var=ostree_repo=http://www.example.com/ostree")
|
||
|
ostree.main(args)
|
||
|
self.maxDiff = None
|
||
|
six.assertCountEqual(
|
||
|
self,
|
||
|
run.mock_calls,
|
||
|
[
|
||
|
mock.call(
|
||
|
[
|
||
|
"lorax",
|
||
|
"--product=dummyproduct",
|
||
|
"--version=1.0",
|
||
|
"--release=20160101.t.0",
|
||
|
"--source=http://www.example.com/dummy/repo",
|
||
|
"--variant=dummy",
|
||
|
"--nomacboot",
|
||
|
"--isfinal",
|
||
|
"--installpkgs=dummy-foo",
|
||
|
"--installpkgs=dummy-bar",
|
||
|
"--add-template=/path/to/lorax.tmpl",
|
||
|
"--add-arch-template=/path/to/lorax-embed.tmpl",
|
||
|
"--add-template-var=ostree_osname=dummy",
|
||
|
"--add-arch-template-var=ostree_repo=http://www.example.com/ostree", # noqa: E501
|
||
|
"--rootfs-size=None",
|
||
|
self.output,
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
)
|
||
|
|
||
|
@mock.patch("kobo.shortcuts.run")
|
||
|
def test_run_with_extra_config_file(self, run):
|
||
|
extra_config_file = os.path.join(self.topdir, "extra_config.json")
|
||
|
helpers.touch(
|
||
|
extra_config_file,
|
||
|
json.dumps(
|
||
|
{
|
||
|
"repo": "http://www.example.com/another/repo",
|
||
|
"installpkgs": ["dummy-foo", "dummy-bar"],
|
||
|
"add_template": ["/path/to/lorax.tmpl"],
|
||
|
"add_template_var": [
|
||
|
"ostree_osname=dummy-atomic",
|
||
|
"ostree_ref=dummy/x86_64/docker",
|
||
|
],
|
||
|
"add_arch_template": ["/path/to/lorax-embed.tmpl"],
|
||
|
"add_arch_template_var": [
|
||
|
"ostree_osname=dummy-atomic",
|
||
|
"ostree_repo=http://www.example.com/ostree",
|
||
|
],
|
||
|
}
|
||
|
),
|
||
|
)
|
||
|
args = [
|
||
|
"installer",
|
||
|
"--product=%s" % self.product,
|
||
|
"--version=%s" % self.version,
|
||
|
"--release=%s" % self.release,
|
||
|
"--output=%s" % self.output,
|
||
|
"--variant=%s" % self.variant,
|
||
|
"--rootfs-size=%s" % self.rootfs_size,
|
||
|
"--nomacboot",
|
||
|
"--isfinal",
|
||
|
]
|
||
|
args.append("--source=%s" % "http://www.example.com/dummy/repo")
|
||
|
args.append("--extra-config=%s" % extra_config_file)
|
||
|
ostree.main(args)
|
||
|
self.maxDiff = None
|
||
|
six.assertCountEqual(
|
||
|
self,
|
||
|
run.mock_calls,
|
||
|
[
|
||
|
mock.call(
|
||
|
[
|
||
|
"lorax",
|
||
|
"--product=dummyproduct",
|
||
|
"--version=1.0",
|
||
|
"--release=20160101.t.0",
|
||
|
"--source=http://www.example.com/dummy/repo",
|
||
|
"--variant=dummy",
|
||
|
"--nomacboot",
|
||
|
"--isfinal",
|
||
|
"--installpkgs=dummy-foo",
|
||
|
"--installpkgs=dummy-bar",
|
||
|
"--add-template=/path/to/lorax.tmpl",
|
||
|
"--add-arch-template=/path/to/lorax-embed.tmpl",
|
||
|
"--add-template-var=ostree_osname=dummy-atomic",
|
||
|
"--add-template-var=ostree_ref=dummy/x86_64/docker",
|
||
|
"--add-arch-template-var=ostree_osname=dummy-atomic",
|
||
|
"--add-arch-template-var=ostree_repo=http://www.example.com/ostree", # noqa: E501
|
||
|
"--rootfs-size=None",
|
||
|
self.output,
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
)
|