
Rewrite YAML parser, YAML objects and parameters expansion logic to enable better control over expansion logic. Broken backward compatilibity: * More agressive parameter expansion. This may lead to parameters expanded in places where they were not expanded before. * Top-level elements, which is not known to parser (such as 'job', 'view', 'project' etc), are now lead to parse failures. Prepend them with underscore to be ignored by parser. * Files included using '!include-raw:' elements and having formatting in it's path ('lazy-loaded' in previous implementation) are now expanded too. Use '!include-raw-escape:' for them instead. See changes in these tests for examples: tests/yamlparser/job_fixtures/lazy-load-jobs-multi001.yaml tests/yamlparser/job_fixtures/lazy-load-jobs-multi002.yaml tests/yamlparser/job_fixtures/lazy-load-jobs001.yaml * Parameters with template value using itself were substituted as is. For example: "timer: '{timer}'" was expanded to "{timer}". Now it leads to recursive parameter error. See changes in this test for example: tests/yamlparser/job_fixtures/parameter_name_reuse_default.* -> tests/yamlparser/error_fixtures/parameter_name_reuse_default.* * When job group includes a job which was never declared, it was just ignored. Now it fails: job is missing. See changes in this test for example: tests/yamlparser/job_fixtures/job_group_includes_missing_job.* -> tests/yamlparser/error_fixtures/job_group_includes_missing_job.* Change-Id: Ief4e515f065a1b9e0f74fe06d7e94fa77d69f273
178 lines
5.6 KiB
Python
178 lines
5.6 KiB
Python
import io
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from jenkins_jobs.cli import entry
|
|
from jenkins_jobs import builder
|
|
|
|
|
|
global_conf = "/etc/jenkins_jobs/jenkins_jobs.ini"
|
|
user_conf = Path.home() / ".config" / "jenkins_jobs" / "jenkins_jobs.ini"
|
|
local_conf = Path(__file__).parent / "jenkins_jobs.ini"
|
|
|
|
|
|
def test_use_global_config(mocker, default_config_file):
|
|
"""
|
|
Verify that JJB uses the global config file by default
|
|
"""
|
|
mocker.patch("jenkins_jobs.builder.JenkinsManager.get_plugins_info")
|
|
|
|
args = ["test", "foo"]
|
|
|
|
default_io_open = io.open
|
|
|
|
def io_open(file, *args, **kw):
|
|
if file == global_conf:
|
|
default_io_open(default_config_file, "r", encoding="utf-8")
|
|
else:
|
|
return default_io_open(file, *args, **kw)
|
|
|
|
def isfile(path):
|
|
if path == global_conf:
|
|
return True
|
|
return False
|
|
|
|
mocker.patch("os.path.isfile", side_effect=isfile)
|
|
mocked_open = mocker.patch("io.open", side_effect=io_open)
|
|
|
|
entry.JenkinsJobs(args, config_file_required=True)
|
|
|
|
mocked_open.assert_called_with(global_conf, "r", encoding="utf-8")
|
|
|
|
|
|
def test_use_config_in_user_home(mocker, default_config_file):
|
|
"""
|
|
Verify that JJB uses config file in user home folder
|
|
"""
|
|
|
|
args = ["test", "foo"]
|
|
|
|
default_io_open = io.open
|
|
|
|
def io_open(file, *args, **kw):
|
|
if file == str(user_conf):
|
|
default_io_open(default_config_file, "r", encoding="utf-8")
|
|
else:
|
|
return default_io_open(file, *args, **kw)
|
|
|
|
def isfile(path):
|
|
if path == str(user_conf):
|
|
return True
|
|
return False
|
|
|
|
mocker.patch("os.path.isfile", side_effect=isfile)
|
|
mocked_open = mocker.patch("io.open", side_effect=io_open)
|
|
|
|
entry.JenkinsJobs(args, config_file_required=True)
|
|
mocked_open.assert_called_with(str(user_conf), "r", encoding="utf-8")
|
|
|
|
|
|
def test_non_existing_config_dir(default_config_file):
|
|
"""
|
|
Run test mode and pass a non-existing configuration directory
|
|
"""
|
|
args = ["--conf", default_config_file, "test", "foo"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
with pytest.raises(IOError):
|
|
jenkins_jobs.execute()
|
|
|
|
|
|
def test_non_existing_config_file(default_config_file):
|
|
"""
|
|
Run test mode and pass a non-existing configuration file
|
|
"""
|
|
args = ["--conf", default_config_file, "test", "non-existing.yaml"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
with pytest.raises(IOError):
|
|
jenkins_jobs.execute()
|
|
|
|
|
|
def test_config_options_not_replaced_by_cli_defaults(fixtures_dir):
|
|
"""
|
|
Run test mode and check config settings from conf file retained
|
|
when none of the global CLI options are set.
|
|
"""
|
|
config_file = fixtures_dir / "settings_from_config.ini"
|
|
args = ["--conf", str(config_file), "test", "dummy.yaml"]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jjb_config = jenkins_jobs.jjb_config
|
|
assert jjb_config.jenkins["user"] == "jenkins_user"
|
|
assert jjb_config.jenkins["password"] == "jenkins_password"
|
|
assert jjb_config.builder["ignore_cache"]
|
|
assert jjb_config.builder["flush_cache"]
|
|
assert jjb_config.builder["update"] == "all"
|
|
assert jjb_config.yamlparser["allow_empty_variables"]
|
|
|
|
|
|
def test_config_options_overriden_by_cli():
|
|
"""
|
|
Run test mode and check config settings from conf file retained
|
|
when none of the global CLI options are set.
|
|
"""
|
|
args = [
|
|
"--user",
|
|
"myuser",
|
|
"--password",
|
|
"mypassword",
|
|
"--ignore-cache",
|
|
"--flush-cache",
|
|
"--allow-empty-variables",
|
|
"test",
|
|
"dummy.yaml",
|
|
]
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jjb_config = jenkins_jobs.jjb_config
|
|
assert jjb_config.jenkins["user"] == "myuser"
|
|
assert jjb_config.jenkins["password"] == "mypassword"
|
|
assert jjb_config.builder["ignore_cache"]
|
|
assert jjb_config.builder["flush_cache"]
|
|
assert jjb_config.yamlparser["allow_empty_variables"]
|
|
|
|
|
|
def test_update_timeout_not_set(mocker, fixtures_dir, default_config_file):
|
|
"""Check that timeout is left unset
|
|
|
|
Test that the Jenkins object has the timeout set on it only when
|
|
provided via the config option.
|
|
"""
|
|
jenkins_mock = mocker.patch("jenkins_jobs.cli.subcommand.base.JenkinsManager")
|
|
|
|
path = fixtures_dir / "cmd-002.yaml"
|
|
args = ["--conf", default_config_file, "update", str(path)]
|
|
|
|
jenkins_mock.return_value.update_jobs.return_value = ([], 0)
|
|
jenkins_mock.return_value.update_views.return_value = ([], 0)
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jenkins_jobs.execute()
|
|
|
|
# validate that the JJBConfig used to initialize builder.Jenkins
|
|
# contains the expected timeout value.
|
|
|
|
jjb_config = jenkins_mock.call_args[0][0]
|
|
assert jjb_config.jenkins["timeout"] == builder._DEFAULT_TIMEOUT
|
|
|
|
|
|
def test_update_timeout_set(mocker, fixtures_dir):
|
|
"""Check that timeout is set correctly
|
|
|
|
Test that the Jenkins object has the timeout set on it only when
|
|
provided via the config option.
|
|
"""
|
|
jenkins_mock = mocker.patch("jenkins_jobs.cli.subcommand.base.JenkinsManager")
|
|
|
|
path = fixtures_dir / "cmd-002.yaml"
|
|
config_file = fixtures_dir / "non-default-timeout.ini"
|
|
args = ["--conf", str(config_file), "update", str(path)]
|
|
|
|
jenkins_mock.return_value.update_jobs.return_value = ([], 0)
|
|
jenkins_mock.return_value.update_views.return_value = ([], 0)
|
|
jenkins_jobs = entry.JenkinsJobs(args)
|
|
jenkins_jobs.execute()
|
|
|
|
# validate that the JJBConfig used to initialize builder.Jenkins
|
|
# contains the expected timeout value.
|
|
|
|
jjb_config = jenkins_mock.call_args[0][0]
|
|
assert jjb_config.jenkins["timeout"] == 0.2
|