Skip to content

Commit 51a31d8

Browse files
committed
unit tests for JobCleaner
1 parent 9fcde9d commit 51a31d8

2 files changed

Lines changed: 43 additions & 14 deletions

File tree

src/mas/devops/saas/job_cleaner.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import logging
1313
import itertools
1414

15-
# TODO: test case: four jobs with same cleanup_group id but different namespaces
16-
1715
# Possible future features: behaviours that diverge from default ArgoCD behaviour (if auto_delete: true were set), but may be useful?:
1816
# - support option to only purge jobs >n iterations old
1917
# - avoid purging jobs that are still running

test/src/saas/test_job_cleaner.py

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
# http://www.eclipse.org/legal/epl-v10.html
88
#
99
# *****************************************************************************
10-
from unittest.mock import patch, Mock
10+
from unittest.mock import patch, Mock, call
1111
from mas.devops.saas.job_cleaner import JobCleaner
1212

1313

@@ -26,8 +26,16 @@ def mock_job(name, namespace, labels, creation_timestamp):
2626
jobs_in_cluster = [
2727
mock_job("job-xa-1", "x", {"mas.ibm.com/job-cleanup-group": "a"}, 1),
2828
mock_job("job-xa-2", "x", {"mas.ibm.com/job-cleanup-group": "a"}, 2),
29+
mock_job("job-xa-3", "x", {"mas.ibm.com/job-cleanup-group": "a"}, 3),
30+
2931
mock_job("job-xb-1", "x", {"mas.ibm.com/job-cleanup-group": "b"}, 1),
32+
mock_job("job-xb-2", "x", {"mas.ibm.com/job-cleanup-group": "b"}, 2),
33+
34+
mock_job("job-xc-1", "x", {"mas.ibm.com/job-cleanup-group": "c"}, 2),
35+
36+
mock_job("job-ya-2", "y", {"mas.ibm.com/job-cleanup-group": "a"}, 2),
3037
mock_job("job-ya-1", "y", {"mas.ibm.com/job-cleanup-group": "a"}, 1),
38+
3139
mock_job("job-yothera-1", "y", {"otherlabel": "a"}, 1),
3240
mock_job("job-zothera-1", "z", {"otherlabel": "a"}, 1)
3341
]
@@ -78,24 +86,47 @@ def test_get_all_cleanup_groups(mock_batch_v1_api):
7886
mock_batch_v1_api.return_value.list_job_for_all_namespaces.side_effect = list_job_for_all_namespaces
7987
jc = JobCleaner(None)
8088
for limit in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
81-
assert jc._get_all_cleanup_groups("mas.ibm.com/job-cleanup-group", limit) == {('x', 'a'), ('x', 'b'), ('y', 'a')}
89+
assert jc._get_all_cleanup_groups("mas.ibm.com/job-cleanup-group", limit) == {('x', 'a'), ('x', 'b'), ('x', 'c'), ('y', 'a')}
8290

8391

8492
@patch("kubernetes.client.BatchV1Api")
8593
def test_get_all_jobs(mock_batch_v1_api):
8694
mock_batch_v1_api.return_value.list_namespaced_job.side_effect = list_namespaced_job
8795
jc = JobCleaner(None)
8896
for limit in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
89-
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("x", "a", "mas.ibm.com/job-cleanup-group", limit))) == ["job-xa-1", "job-xa-2"]
90-
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("x", "b", "mas.ibm.com/job-cleanup-group", limit))) == ["job-xb-1"]
91-
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("y", "a", "mas.ibm.com/job-cleanup-group", limit))) == ["job-ya-1"]
97+
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("x", "a", "mas.ibm.com/job-cleanup-group", limit))) == ["job-xa-1", "job-xa-2", "job-xa-3"]
98+
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("x", "b", "mas.ibm.com/job-cleanup-group", limit))) == ["job-xb-1", "job-xb-2"]
99+
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("x", "c", "mas.ibm.com/job-cleanup-group", limit))) == ["job-xc-1"]
100+
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("y", "a", "mas.ibm.com/job-cleanup-group", limit))) == ["job-ya-2", "job-ya-1"]
92101
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("y", "b", "mas.ibm.com/job-cleanup-group", limit))) == []
93102
assert list(map(lambda job: job.metadata.name, jc._get_all_jobs("y", "a", "otherlabel", limit))) == ["job-yothera-1"]
94103

95-
# TODO
96-
# @patch("kubernetes.client.BatchV1Api")
97-
# def test_cleanup_jobs(mock_batch_v1_api):
98-
# mock_batch_v1_api.return_value.list_job_for_all_namespaces.side_effect = list_job_for_all_namespaces
99-
# mock_batch_v1_api.return_value.list_namespaced_job.side_effect = list_namespaced_job
100-
# jc = JobCleaner(None)
101-
# jc.cleanup_jobs()
104+
105+
@patch("kubernetes.client.BatchV1Api")
106+
def test_cleanup_jobs(mock_batch_v1_api):
107+
mock_batch_v1_api.return_value.list_job_for_all_namespaces.side_effect = list_job_for_all_namespaces
108+
mock_batch_v1_api.return_value.list_namespaced_job.side_effect = list_namespaced_job
109+
110+
jc = JobCleaner(None)
111+
for dry_run in [False, True]:
112+
dry_run_param = None
113+
if dry_run:
114+
dry_run_param = "All"
115+
116+
expected_calls = [
117+
call('job-ya-1', 'y', dry_run=dry_run_param, propagation_policy='Foreground'),
118+
call('job-xa-2', 'x', dry_run=dry_run_param, propagation_policy='Foreground'),
119+
call('job-xa-1', 'x', dry_run=dry_run_param, propagation_policy='Foreground'),
120+
call('job-xb-1', 'x', dry_run=dry_run_param, propagation_policy='Foreground'),
121+
]
122+
123+
for limit in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
124+
mock_batch_v1_api.return_value.delete_namespaced_job.reset_mock()
125+
jc.cleanup_jobs("mas.ibm.com/job-cleanup-group", 3, dry_run)
126+
127+
mock_batch_v1_api.return_value.delete_namespaced_job.assert_has_calls(
128+
expected_calls,
129+
any_order=True
130+
)
131+
132+
assert mock_batch_v1_api.return_value.delete_namespaced_job.call_count == len(expected_calls)

0 commit comments

Comments
 (0)