Merge #538 consolidate repo option names
This commit is contained in:
commit
63a3b6ccaa
12 changed files with 304 additions and 58 deletions
|
|
@ -38,6 +38,11 @@ class MockVariant(mock.Mock):
|
|||
return self.uid
|
||||
|
||||
|
||||
class IterableMock(mock.Mock):
|
||||
def __iter__(self):
|
||||
return iter([])
|
||||
|
||||
|
||||
class DummyCompose(object):
|
||||
def __init__(self, topdir, config):
|
||||
self.supported = True
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ import os
|
|||
import sys
|
||||
import StringIO
|
||||
|
||||
import kobo.conf
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||||
|
||||
from pungi import checks
|
||||
|
|
@ -188,6 +190,169 @@ class CheckDependenciesTestCase(unittest.TestCase):
|
|||
self.assertTrue(result)
|
||||
|
||||
|
||||
class TestSchemaValidator(unittest.TestCase):
|
||||
def _load_conf_from_string(self, string):
|
||||
conf = kobo.conf.PyConfigParser()
|
||||
conf.load_from_string(string)
|
||||
return conf
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_property(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["release_name"],
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
release_name = "dummy product"
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 0)
|
||||
self.assertEqual(len(warnings), 0)
|
||||
self.assertEqual(config.get("release_name", None), "dummy product")
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_alias_property(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
product_name = "dummy product"
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 0)
|
||||
self.assertEqual(len(warnings), 0)
|
||||
self.assertEqual(config.get("release_name", None), "dummy product")
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_required_is_missing(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["release_name"],
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
name = "dummy product"
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 1)
|
||||
self.assertIn("Failed validation in : 'release_name' is a required property", errors)
|
||||
self.assertEqual(len(warnings), 1)
|
||||
self.assertIn("WARNING: Unrecognized config option: name.", warnings)
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_required_is_in_alias(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["release_name"],
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
product_name = "dummy product"
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 0)
|
||||
self.assertEqual(len(warnings), 0)
|
||||
self.assertEqual(config.get("release_name", None), "dummy product")
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_redundant_alias(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["release_name"],
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
product_name = "dummy product"
|
||||
release_name = "dummy product"
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 1)
|
||||
self.assertIn('Failed validation in : product_name is an alias of release_name, only one can be used.', errors)
|
||||
self.assertEqual(len(warnings), 0)
|
||||
self.assertEqual(config.get("release_name", None), "dummy product")
|
||||
|
||||
@mock.patch('pungi.checks._make_schema')
|
||||
def test_properties_in_deep(self, make_schema):
|
||||
schema = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Pungi Configuration",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"release_name": {"type": "string", "alias": "product_name"},
|
||||
"keys": {
|
||||
"type": "array",
|
||||
"items": {"type": "string"},
|
||||
},
|
||||
"foophase": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"repo": {"type": "string", "alias": "tree"},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["repo"],
|
||||
},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["release_name"],
|
||||
}
|
||||
make_schema.return_value = schema
|
||||
|
||||
string = """
|
||||
product_name = "dummy product"
|
||||
foophase = {
|
||||
"tree": "http://www.exampe.com/os"
|
||||
}
|
||||
"""
|
||||
config = self._load_conf_from_string(string)
|
||||
errors, warnings = checks.validate(config)
|
||||
self.assertEqual(len(errors), 0)
|
||||
self.assertEqual(len(warnings), 0)
|
||||
self.assertEqual(config.get("release_name", None), "dummy product")
|
||||
self.assertEqual(config.get("foophase", {}).get("repo", None), "http://www.exampe.com/os")
|
||||
|
||||
|
||||
class TestUmask(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.orig_umask = os.umask(0)
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything', 'Server-optional'],
|
||||
'release': None,
|
||||
}
|
||||
|
|
@ -76,7 +76,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': 'Everything',
|
||||
'release': None,
|
||||
}
|
||||
|
|
@ -124,7 +124,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
'release': None,
|
||||
}
|
||||
|
|
@ -171,11 +171,11 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': [{
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
}, {
|
||||
'kickstart': 'another.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
}]
|
||||
})
|
||||
|
|
@ -244,7 +244,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'ksurl': 'https://git.example.com/kickstarts.git?#HEAD',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
'type': 'appliance',
|
||||
}
|
||||
|
|
@ -299,7 +299,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
'type': 'appliance',
|
||||
}
|
||||
|
|
@ -354,7 +354,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
'type': 'appliance',
|
||||
}
|
||||
|
|
@ -406,7 +406,7 @@ class TestLiveImagesPhase(PungiTestCase):
|
|||
('^Client$', {
|
||||
'amd64': {
|
||||
'kickstart': 'test.ks',
|
||||
'additional_repos': ['http://example.com/repo/'],
|
||||
'repo': ['http://example.com/repo/'],
|
||||
'repo_from': ['Everything'],
|
||||
'release': None,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ class OstreeInstallerPhaseTest(helpers.PungiTestCase):
|
|||
|
||||
@mock.patch('pungi.phases.ostree_installer.ThreadPool')
|
||||
def test_run(self, ThreadPool):
|
||||
cfg = mock.Mock()
|
||||
cfg = helpers.IterableMock()
|
||||
compose = helpers.DummyCompose(self.topdir, {
|
||||
'ostree_installer': [
|
||||
('^Everything$', {'x86_64': cfg})
|
||||
|
|
@ -133,7 +133,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
self.compose.supported = False
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': '20160321.n.0',
|
||||
}
|
||||
koji = KojiWrapper.return_value
|
||||
|
|
@ -169,7 +169,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_file_size, get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'http://example.com/repo/$arch/',
|
||||
'repo_from': 'http://example.com/repo/$arch/',
|
||||
'release': '20160321.n.0',
|
||||
}
|
||||
koji = KojiWrapper.return_value
|
||||
|
|
@ -203,7 +203,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_file_size, get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': '20160321.n.0',
|
||||
'repo': [
|
||||
'https://example.com/extra-repo1.repo',
|
||||
|
|
@ -241,7 +241,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_file_size, get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': ['Everything', 'Server'],
|
||||
'repo_from': ['Everything', 'Server'],
|
||||
'release': '20160321.n.0',
|
||||
'repo': [
|
||||
'https://example.com/extra-repo1.repo',
|
||||
|
|
@ -281,7 +281,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': '20160321.n.0',
|
||||
'add_template': ['some-file.txt'],
|
||||
}
|
||||
|
|
@ -314,7 +314,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_dir_from_scm):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': '20160321.n.0',
|
||||
'add_template': ['some_file.txt'],
|
||||
'add_arch_template': ['other_file.txt'],
|
||||
|
|
@ -362,7 +362,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_file_size, get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': None,
|
||||
"installpkgs": ["fedora-productimg-atomic"],
|
||||
"add_template": ["/spin-kickstarts/atomic-installer/lorax-configure-repo.tmpl"],
|
||||
|
|
@ -423,7 +423,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': None,
|
||||
'failable': ['x86_64']
|
||||
}
|
||||
|
|
@ -449,7 +449,7 @@ class OstreeThreadTest(helpers.PungiTestCase):
|
|||
get_file_size, get_mtime, ImageCls, run):
|
||||
pool = mock.Mock()
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'release': None,
|
||||
'failable': ['*'],
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ class OSTreePhaseTest(helpers.PungiTestCase):
|
|||
|
||||
@mock.patch('pungi.phases.ostree.ThreadPool')
|
||||
def test_run(self, ThreadPool):
|
||||
cfg = mock.Mock()
|
||||
cfg = helpers.IterableMock()
|
||||
compose = helpers.DummyCompose(self.topdir, {
|
||||
'ostree': [
|
||||
('^Everything$', {'x86_64': cfg})
|
||||
|
|
@ -51,7 +51,7 @@ class OSTreeThreadTest(helpers.PungiTestCase):
|
|||
self.repo = os.path.join(self.topdir, 'place/for/atomic')
|
||||
os.makedirs(os.path.join(self.repo, 'refs', 'heads'))
|
||||
self.cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'repo_from': 'Everything',
|
||||
'config_url': 'https://git.fedorahosted.org/git/fedora-atomic.git',
|
||||
'config_branch': 'f24',
|
||||
'treefile': 'fedora-atomic-docker-host.json',
|
||||
|
|
@ -305,8 +305,8 @@ class OSTreeThreadTest(helpers.PungiTestCase):
|
|||
koji.run_runroot_cmd.side_effect = self._mock_runroot(0)
|
||||
|
||||
cfg = {
|
||||
'source_repo_from': 'Everything',
|
||||
'extra_source_repos': [
|
||||
'repo_from': 'Everything',
|
||||
'repo': [
|
||||
{
|
||||
'name': 'repo_a',
|
||||
'baseurl': 'http://url/to/repo/a',
|
||||
|
|
@ -333,9 +333,9 @@ class OSTreeThreadTest(helpers.PungiTestCase):
|
|||
self.assertTrue(os.path.isfile(extra_config_file))
|
||||
extra_config = json.load(open(extra_config_file, 'r'))
|
||||
self.assertTrue(extra_config.get('keep_original_sources', False))
|
||||
self.assertEqual(extra_config.get('source_repo_from', None), 'http://example.com/Everything/$basearch/os')
|
||||
self.assertEqual(len(extra_config.get('extra_source_repos', [])), len(cfg['extra_source_repos']))
|
||||
self.assertEqual(extra_config.get('extra_source_repos').pop()['baseurl'], 'http://example.com/Server/$basearch/os')
|
||||
self.assertEqual(extra_config.get('repo_from', None), 'http://example.com/Everything/$basearch/os')
|
||||
self.assertEqual(len(extra_config.get('repo', [])), len(cfg['repo']))
|
||||
self.assertEqual(extra_config.get('repo').pop()['baseurl'], 'http://example.com/Server/$basearch/os')
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
|||
|
|
@ -156,8 +156,8 @@ class OstreeTreeScriptTest(helpers.PungiTestCase):
|
|||
|
||||
extra_config_file = os.path.join(self.topdir, 'extra_config.json')
|
||||
extra_config = {
|
||||
"source_repo_from": "http://www.example.com/Server.repo",
|
||||
"extra_source_repos": [
|
||||
"repo_from": "http://www.example.com/Server.repo",
|
||||
"repo": [
|
||||
{
|
||||
"name": "optional",
|
||||
"baseurl": "http://example.com/repo/x86_64/optional",
|
||||
|
|
@ -230,8 +230,8 @@ class OstreeTreeScriptTest(helpers.PungiTestCase):
|
|||
|
||||
extra_config_file = os.path.join(self.topdir, 'extra_config.json')
|
||||
extra_config = {
|
||||
"source_repo_from": "http://www.example.com/Server.repo",
|
||||
"extra_source_repos": [
|
||||
"repo_from": "http://www.example.com/Server.repo",
|
||||
"repo": [
|
||||
{
|
||||
"name": "optional",
|
||||
"baseurl": "http://example.com/repo/x86_64/optional",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue