Skip to content

Commit 596950b

Browse files
committed
fixing file and multi container
1 parent 31a9514 commit 596950b

File tree

3 files changed

+76
-51
lines changed

3 files changed

+76
-51
lines changed

poetry.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

robusta_krr/core/integrations/kubernetes/__init__.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -525,21 +525,33 @@ async def _list_all_groupedjobs(self) -> list[K8sObjectData]:
525525

526526
for namespace, namespace_jobs in jobs_by_namespace.items():
527527
limited_jobs = namespace_jobs[:settings.job_grouping_limit]
528-
template_job = limited_jobs[0]
529-
template_container = template_job.spec.template.spec.containers[0]
530528

531-
grouped_job = self.__build_scannable_object(
532-
item=template_job,
533-
container=template_container,
534-
kind="GroupedJob"
535-
)
536-
537-
grouped_job.name = group_name
538-
grouped_job.namespace = namespace
539-
grouped_job._api_resource._grouped_jobs = limited_jobs
540-
grouped_job._api_resource._label_filter = group_name
529+
container_names = set()
530+
for job in limited_jobs:
531+
for container in job.spec.template.spec.containers:
532+
container_names.add(container.name)
541533

542-
result.append(grouped_job)
534+
for container_name in container_names:
535+
template_job = limited_jobs[0]
536+
template_container = None
537+
for container in template_job.spec.template.spec.containers:
538+
if container.name == container_name:
539+
template_container = container
540+
break
541+
542+
if template_container:
543+
grouped_job = self.__build_scannable_object(
544+
item=template_job,
545+
container=template_container,
546+
kind="GroupedJob"
547+
)
548+
549+
grouped_job.name = group_name
550+
grouped_job.namespace = namespace
551+
grouped_job._api_resource._grouped_jobs = limited_jobs
552+
grouped_job._api_resource._label_filter = group_name
553+
554+
result.append(grouped_job)
543555

544556
logger.debug("Found %d GroupedJob groups", len(result))
545557
return result

tests/test_grouped_jobs.py

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -76,30 +76,35 @@ def mock_build_scannable_object(item, container, kind):
7676
# Call the method
7777
result = await mock_kubernetes_loader._list_all_groupedjobs()
7878

79-
# Verify we got 2 groups (frontend and backend)
79+
# Verify we got 2 objects (1 frontend + 1 backend, one per unique container name)
8080
assert len(result) == 2
8181

82-
# Find the frontend group
83-
frontend_group = next((g for g in result if g.name == "app=frontend"), None)
84-
assert frontend_group is not None
85-
assert frontend_group.namespace == "default"
82+
# Group results by name to verify grouping
83+
frontend_objects = [g for g in result if g.name == "app=frontend"]
84+
backend_objects = [g for g in result if g.name == "app=backend"]
8685

87-
# Verify the frontend group is limited to 3 jobs (the limit)
88-
assert len(frontend_group._api_resource._grouped_jobs) == 3
89-
assert frontend_group._api_resource._grouped_jobs[0].metadata.name == "job-1"
90-
assert frontend_group._api_resource._grouped_jobs[1].metadata.name == "job-2"
91-
assert frontend_group._api_resource._grouped_jobs[2].metadata.name == "job-3"
86+
# Verify we got 1 frontend object (one per unique container name)
87+
assert len(frontend_objects) == 1
88+
assert frontend_objects[0].namespace == "default"
89+
assert frontend_objects[0].container == "main-container"
9290

93-
# Find the backend group
94-
backend_group = next((g for g in result if g.name == "app=backend"), None)
95-
assert backend_group is not None
96-
assert backend_group.namespace == "default"
91+
# Verify we got 1 backend object (one per unique container name)
92+
assert len(backend_objects) == 1
93+
assert backend_objects[0].namespace == "default"
94+
assert backend_objects[0].container == "main-container"
9795

98-
# Verify the backend group is also limited to 3 jobs
99-
assert len(backend_group._api_resource._grouped_jobs) == 3
100-
assert backend_group._api_resource._grouped_jobs[0].metadata.name == "job-6"
101-
assert backend_group._api_resource._grouped_jobs[1].metadata.name == "job-7"
102-
assert backend_group._api_resource._grouped_jobs[2].metadata.name == "job-8"
96+
# Verify all objects in each group have the same grouped_jobs list
97+
frontend_grouped_jobs = frontend_objects[0]._api_resource._grouped_jobs
98+
assert len(frontend_grouped_jobs) == 3
99+
assert frontend_grouped_jobs[0].metadata.name == "job-1"
100+
assert frontend_grouped_jobs[1].metadata.name == "job-2"
101+
assert frontend_grouped_jobs[2].metadata.name == "job-3"
102+
103+
backend_grouped_jobs = backend_objects[0]._api_resource._grouped_jobs
104+
assert len(backend_grouped_jobs) == 3
105+
assert backend_grouped_jobs[0].metadata.name == "job-6"
106+
assert backend_grouped_jobs[1].metadata.name == "job-7"
107+
assert backend_grouped_jobs[2].metadata.name == "job-8"
103108

104109

105110
@pytest.mark.asyncio
@@ -128,20 +133,24 @@ def mock_build_scannable_object(item, container, kind):
128133
# Call the method
129134
result = await mock_kubernetes_loader._list_all_groupedjobs()
130135

131-
# Verify we got 2 groups (one per namespace)
136+
# Verify we got 2 objects (1 per namespace, one per unique container name)
132137
assert len(result) == 2
133138

134-
# Check namespace-1 group
135-
ns1_group = next((g for g in result if g.namespace == "namespace-1"), None)
136-
assert ns1_group is not None
137-
assert ns1_group.name == "app=frontend"
138-
assert len(ns1_group._api_resource._grouped_jobs) == 2
139+
# Group results by namespace
140+
ns1_objects = [g for g in result if g.namespace == "namespace-1"]
141+
ns2_objects = [g for g in result if g.namespace == "namespace-2"]
142+
143+
# Check namespace-1 objects
144+
assert len(ns1_objects) == 1
145+
assert ns1_objects[0].name == "app=frontend"
146+
assert ns1_objects[0].container == "main-container"
147+
assert len(ns1_objects[0]._api_resource._grouped_jobs) == 2
139148

140-
# Check namespace-2 group
141-
ns2_group = next((g for g in result if g.namespace == "namespace-2"), None)
142-
assert ns2_group is not None
143-
assert ns2_group.name == "app=frontend"
144-
assert len(ns2_group._api_resource._grouped_jobs) == 2
149+
# Check namespace-2 objects
150+
assert len(ns2_objects) == 1
151+
assert ns2_objects[0].name == "app=frontend"
152+
assert ns2_objects[0].container == "main-container"
153+
assert len(ns2_objects[0]._api_resource._grouped_jobs) == 2
145154

146155

147156
@pytest.mark.asyncio
@@ -171,12 +180,12 @@ def mock_build_scannable_object(item, container, kind):
171180
# Call the method
172181
result = await mock_kubernetes_loader._list_all_groupedjobs()
173182

174-
# Verify we got 1 group with only 1 job (the one without CronJob owner)
183+
# Verify we got 1 object (only the job without CronJob owner)
175184
assert len(result) == 1
176-
group = result[0]
177-
assert group.name == "app=frontend"
178-
assert len(group._api_resource._grouped_jobs) == 1
179-
assert group._api_resource._grouped_jobs[0].metadata.name == "job-1"
185+
obj = result[0]
186+
assert obj.name == "app=frontend"
187+
assert len(obj._api_resource._grouped_jobs) == 1
188+
assert obj._api_resource._grouped_jobs[0].metadata.name == "job-1"
180189

181190

182191
@pytest.mark.asyncio
@@ -217,10 +226,13 @@ def mock_build_scannable_object(item, container, kind):
217226
# Call the method
218227
result = await mock_kubernetes_loader._list_all_groupedjobs()
219228

220-
# Verify we got 3 groups (one for each label+value combination)
229+
# Verify we got 3 objects (one for each label+value combination, one per unique container name)
221230
assert len(result) == 3
222231

223232
group_names = {g.name for g in result}
224233
assert "app=frontend" in group_names
225234
assert "team=backend" in group_names
226235
assert "app=api" in group_names
236+
237+
# Verify all objects have the same container name
238+
assert all(obj.container == "main-container" for obj in result)

0 commit comments

Comments
 (0)