From 1f320ad9f9da0a8388ff05a011d2e8d2c6c60914 Mon Sep 17 00:00:00 2001 From: Vsevolod Fedorov Date: Fri, 22 Mar 2024 11:31:48 +0300 Subject: [PATCH] Do not delete unmanaged jobs when --views-only option specified Change-Id: I54e4d62db56824bfa020bbc1a711b95a5b15fcc5 --- doc/source/changelog.rst | 1 + jenkins_jobs/cli/subcommand/update.py | 7 ++-- tests/cmd/subcommands/test_update.py | 52 +++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/doc/source/changelog.rst b/doc/source/changelog.rst index e3883aaa4..022ee302b 100644 --- a/doc/source/changelog.rst +++ b/doc/source/changelog.rst @@ -7,6 +7,7 @@ Release 6.2.0 Bugs fixed ~~~~~~~~~~ +* Do not delete obsolete jobs when `--views-only` option specified. * Add readthedocs configuration file. RTD now requires it. Fixes documentation build on RTD. Release 6.1.0 diff --git a/jenkins_jobs/cli/subcommand/update.py b/jenkins_jobs/cli/subcommand/update.py index 1215524da..0478e67d7 100644 --- a/jenkins_jobs/cli/subcommand/update.py +++ b/jenkins_jobs/cli/subcommand/update.py @@ -144,7 +144,8 @@ class UpdateSubCommand(base.JobsSubCommand): ) logger.info("Number of views updated: %d", num_updated_views) - keep_jobs = [job.name for job in xml_jobs] if options.delete_old: - n = builder.delete_old_managed(keep=keep_jobs) - logger.info("Number of jobs deleted: %d", n) + if options.update in {"jobs", "all"}: + keep_jobs = [job.name for job in xml_jobs] + n = builder.delete_old_managed(keep=keep_jobs) + logger.info("Number of jobs deleted: %d", n) diff --git a/tests/cmd/subcommands/test_update.py b/tests/cmd/subcommands/test_update.py index b4996b0c3..237ed1f53 100644 --- a/tests/cmd/subcommands/test_update.py +++ b/tests/cmd/subcommands/test_update.py @@ -138,6 +138,58 @@ def test_update_jobs_and_delete_old( assert jenkins_delete_job.call_count == len(calls) +def test_update_jobs_and_delete_old_views_only( + mocker, fixtures_dir, default_config_file, execute_jenkins_jobs +): + """Test update behaviour with --delete-old option + with --views-only option specified. + No jobs should be deleted. + """ + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.job_exists") + jenkins_get_all_jobs = mocker.patch( + "jenkins_jobs.builder.jenkins.Jenkins.get_all_jobs" + ) + jenkins_reconfig_job = mocker.patch( + "jenkins_jobs.builder.jenkins.Jenkins.reconfig_job" + ) + jenkins_delete_job = mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.delete_job") + + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.view_exists") + mocker.patch("jenkins_jobs.builder.jenkins.Jenkins.get_views") + jenkins_reconfig_view = mocker.patch( + "jenkins_jobs.builder.jenkins.Jenkins.reconfig_view" + ) + + yaml_jobs = ["job-1", "job-2", "job-3"] + extra_managed_jobs = ["old-job-1", "old-job-2"] + unmanaged_jobs = ["unmanaged"] + + jenkins_get_all_jobs.return_value = [ + {"fullname": name} for name in yaml_jobs + extra_managed_jobs + unmanaged_jobs + ] + mocker.patch( + "jenkins_jobs.builder.JenkinsManager.is_managed", + side_effect=(lambda name: name not in unmanaged_jobs), + ) + + path = fixtures_dir / "update-both.yaml" + args = [ + "--conf", + default_config_file, + "update", + "--delete-old", + "--views-only", + str(path), + ] + + execute_jenkins_jobs(args) + + assert jenkins_reconfig_job.call_count == 0 + assert jenkins_delete_job.call_count == 0 + + assert jenkins_reconfig_view.call_count == 3 + + def test_update_views(mocker, fixtures_dir, default_config_file, execute_jenkins_jobs): """ Test update_job is called for project with views