2016-08-22 14:08:25 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
2016-09-22 08:28:01 +00:00
|
|
|
try:
|
|
|
|
import unittest2 as unittest
|
|
|
|
except ImportError:
|
|
|
|
import unittest
|
2016-08-22 14:08:25 +00:00
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
|
|
|
|
from pungi import checks
|
|
|
|
from tests.helpers import load_config, PKGSET_REPOS
|
|
|
|
|
|
|
|
|
|
|
|
class PkgsetConfigTestCase(unittest.TestCase):
|
|
|
|
|
|
|
|
def test_validate_minimal_pkgset_koji(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='koji',
|
|
|
|
pkgset_koji_tag="f25",
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_validate_minimal_pkgset_repos(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='repos',
|
|
|
|
pkgset_repos={'x86_64': '/first', 'ppc64': '/second'},
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_pkgset_mismatch_repos(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='repos',
|
|
|
|
pkgset_koji_tag='f25',
|
|
|
|
pkgset_koji_inherit=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('pkgset_source', 'repos', 'pkgset_repos'),
|
|
|
|
checks.CONFLICTS.format('pkgset_source', 'repos', 'pkgset_koji_tag'),
|
|
|
|
checks.CONFLICTS.format('pkgset_source', 'repos', 'pkgset_koji_inherit')])
|
|
|
|
|
|
|
|
def test_pkgset_mismatch_koji(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='koji',
|
|
|
|
pkgset_repos={'whatever': '/foo'},
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('pkgset_source', 'koji', 'pkgset_koji_tag'),
|
|
|
|
checks.CONFLICTS.format('pkgset_source', 'koji', 'pkgset_repos')])
|
|
|
|
|
|
|
|
|
|
|
|
class ReleaseConfigTestCase(unittest.TestCase):
|
|
|
|
def test_layered_without_base_product(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
release_is_layered=True
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('release_is_layered', 'True', 'base_product_name'),
|
|
|
|
checks.REQUIRES.format('release_is_layered', 'True', 'base_product_short'),
|
|
|
|
checks.REQUIRES.format('release_is_layered', 'True', 'base_product_version')])
|
|
|
|
|
|
|
|
def test_not_layered_with_base_product(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
base_product_name='Prod',
|
|
|
|
base_product_short='bp',
|
|
|
|
base_product_version='1.0',
|
|
|
|
base_product_type='updates',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('release_is_layered', 'False', 'base_product_name'),
|
|
|
|
checks.CONFLICTS.format('release_is_layered', 'False', 'base_product_short'),
|
|
|
|
checks.CONFLICTS.format('release_is_layered', 'False', 'base_product_type'),
|
|
|
|
checks.CONFLICTS.format('release_is_layered', 'False', 'base_product_version')])
|
|
|
|
|
|
|
|
|
|
|
|
class RunrootConfigTestCase(unittest.TestCase):
|
|
|
|
def test_runroot_without_deps(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
runroot=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('runroot', 'True', 'koji_profile'),
|
|
|
|
checks.REQUIRES.format('runroot', 'True', 'runroot_tag'),
|
|
|
|
checks.REQUIRES.format('runroot', 'True', 'runroot_channel')])
|
|
|
|
|
|
|
|
def test_koji_settings_without_runroot(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
runroot=False,
|
|
|
|
koji_profile='koji',
|
|
|
|
runroot_tag='f25',
|
|
|
|
runroot_channel='compose',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('runroot', 'False', 'runroot_tag'),
|
|
|
|
checks.CONFLICTS.format('runroot', 'False', 'runroot_channel')])
|
|
|
|
|
|
|
|
|
|
|
|
class BuildinstallConfigTestCase(unittest.TestCase):
|
|
|
|
def test_bootable_without_method(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
bootable=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('bootable', 'True', 'buildinstall_method')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_non_bootable_with_method(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
bootable=False,
|
|
|
|
buildinstall_method='lorax',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('bootable', 'False', 'buildinstall_method')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_buildinstall_method_without_bootable(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
buildinstall_method='lorax',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('bootable', 'False', 'buildinstall_method')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_buildinstall_with_lorax_options(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
bootable=True,
|
|
|
|
buildinstall_method='buildinstall',
|
|
|
|
lorax_options=[('^Server$', {})]
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('buildinstall_method', 'buildinstall', 'lorax_options')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_lorax_with_lorax_options(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
bootable=True,
|
|
|
|
buildinstall_method='lorax',
|
|
|
|
lorax_options=[]
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_lorax_options_without_bootable_and_method(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
lorax_options=[('^Server$', {})],
|
|
|
|
buildinstall_kickstart='foo',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('buildinstall_method', 'None', 'lorax_options'),
|
|
|
|
checks.CONFLICTS.format('buildinstall_method', 'None', 'buildinstall_kickstart')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_deprecated(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
buildinstall_upgrade_image=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.DEPRECATED.format('buildinstall_upgrade_image', 'use lorax_options instead')]
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class CreaterepoConfigTestCase(unittest.TestCase):
|
|
|
|
def test_validate_minimal_pkgset_koji(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='koji',
|
|
|
|
pkgset_koji_tag="f25",
|
|
|
|
product_id_allow_missing=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.CONFLICTS.format('product_id', 'None', 'product_id_allow_missing')]
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class GatherConfigTestCase(unittest.TestCase):
|
|
|
|
def test_source_comps_requires_comps(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='koji',
|
|
|
|
pkgset_koji_tag="f25",
|
|
|
|
gather_source='comps',
|
|
|
|
gather_source_mapping='foo'
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('gather_source', 'comps', 'comps_file'),
|
|
|
|
checks.CONFLICTS.format('gather_source', 'comps', 'gather_source_mapping')]
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_source_json_requires_mapping(self):
|
|
|
|
cfg = load_config(
|
|
|
|
pkgset_source='koji',
|
|
|
|
pkgset_koji_tag="f25",
|
|
|
|
gather_source='json',
|
|
|
|
comps_file='comps',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.REQUIRES.format('gather_source', 'json', 'gather_source_mapping'),
|
|
|
|
checks.CONFLICTS.format('gather_source', 'json', 'comps_file')]
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class OSBSConfigTestCase(unittest.TestCase):
|
|
|
|
def test_validate(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
osbs={"^Server$": {
|
|
|
|
'url': 'http://example.com',
|
|
|
|
'target': 'f25-build',
|
|
|
|
}}
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertItemsEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_validate_bad_conf(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
osbs='yes please'
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertNotEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
|
|
|
|
class OstreeConfigTestCase(unittest.TestCase):
|
|
|
|
def test_validate(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
ostree=[
|
|
|
|
("^Atomic$", {
|
|
|
|
"x86_64": {
|
|
|
|
"treefile": "fedora-atomic-docker-host.json",
|
|
|
|
"config_url": "https://git.fedorahosted.org/git/fedora-atomic.git",
|
|
|
|
"source_repo_from": "Everything",
|
|
|
|
"ostree_repo": "/mnt/koji/compose/atomic/Rawhide/"
|
|
|
|
}
|
|
|
|
})
|
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_validate_bad_conf(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
ostree='yes please'
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertNotEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
|
|
|
|
class OstreeInstallerConfigTestCase(unittest.TestCase):
|
|
|
|
def test_validate(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
ostree_installer=[
|
|
|
|
("^Atomic$", {
|
|
|
|
"x86_64": {
|
|
|
|
"source_repo_from": "Everything",
|
|
|
|
"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/",
|
|
|
|
"ostree_osname=fedora-atomic",
|
|
|
|
"ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_validate_bad_conf(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
ostree_installer=[
|
|
|
|
("^Atomic$", {
|
|
|
|
"x86_64": {
|
|
|
|
"source_repo_from": "Everything",
|
|
|
|
"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": 15,
|
|
|
|
"add_arch_template_var": [
|
|
|
|
"ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",
|
|
|
|
"ostree_osname=fedora-atomic",
|
|
|
|
"ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
]
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertNotEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
|
|
|
|
class LiveMediaConfigTestCase(unittest.TestCase):
|
|
|
|
def test_global_config_validation(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
live_media_ksurl='git://example.com/repo.git#HEAD',
|
|
|
|
live_media_target='f24',
|
|
|
|
live_media_release='RRR',
|
|
|
|
live_media_version='Rawhide',
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
def test_global_config_null_release(self):
|
|
|
|
cfg = load_config(
|
|
|
|
PKGSET_REPOS,
|
|
|
|
live_media_release=None,
|
|
|
|
)
|
|
|
|
|
|
|
|
self.assertEqual(checks.validate(cfg), [])
|
|
|
|
|
|
|
|
|
|
|
|
class TestSuggestions(unittest.TestCase):
|
2016-08-19 08:09:40 +00:00
|
|
|
def test_with_a_typo(self):
|
2016-08-22 14:08:25 +00:00
|
|
|
cfg = load_config(PKGSET_REPOS,
|
|
|
|
product_pid=None)
|
|
|
|
|
|
|
|
self.assertEqual(
|
|
|
|
checks.validate(cfg),
|
|
|
|
[checks.UNKNOWN_SUGGEST.format('product_pid', 'product_id')])
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|