Skip to content

Commit aaa6b56

Browse files
committed
Improve the Summary of the Podman container status check
CMK-32330 Change-Id: I889200ee31de10e9c978de6a8e170bc5c5a17f29
1 parent 1d5f1b0 commit aaa6b56

7 files changed

Lines changed: 49 additions & 16 deletions

File tree

cmk/plugins/podman/agent_based/lib.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class ContainerHealth(BaseModel, frozen=True):
2929
class SectionPodmanContainerState(BaseModel, frozen=True):
3030
status: str = Field(alias="Status")
3131
started_at: str = Field(alias="StartedAt")
32+
finished_at: str = Field(alias="FinishedAt")
3233
exit_code: int = Field(alias="ExitCode", description="Exit code of the container.")
3334
health: ContainerHealth | None = Field(
3435
default=None,
@@ -66,6 +67,7 @@ class PodmanContainerNetworkSettings(BaseModel, frozen=True):
6667

6768

6869
class SectionPodmanContainerInspect(BaseModel, frozen=True):
70+
name: str = Field(alias="Name", description="The name of the container.")
6971
state: SectionPodmanContainerState = Field(alias="State")
7072
restarts: int = Field(alias="RestartCount", description="Number of restarts of the container.")
7173
pod: str = Field(alias="Pod", description="The pod this container is part of, if any.")

cmk/plugins/podman/agent_based/podman_container_status.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,10 @@
44
# conditions defined in the file COPYING, which is part of this source code package.
55

66

7+
from datetime import datetime, UTC
78
from typing import Literal, TypedDict
89

9-
from cmk.agent_based.v2 import (
10-
CheckPlugin,
11-
CheckResult,
12-
DiscoveryResult,
13-
Result,
14-
Service,
15-
State,
16-
)
10+
from cmk.agent_based.v2 import CheckPlugin, CheckResult, DiscoveryResult, Result, Service, State
1711

1812
from .lib import SectionPodmanContainerInspect
1913

@@ -47,6 +41,12 @@ def discover_podman_container_status(
4741
yield Service()
4842

4943

44+
def _format_exit_time(finished_at: str) -> str:
45+
dt = datetime.fromisoformat(finished_at)
46+
utc_dt = dt.astimezone(UTC)
47+
return utc_dt.strftime("%Y-%m-%d %H:%M UTC")
48+
49+
5050
def check_podman_container_status(
5151
params: Params,
5252
section: SectionPodmanContainerInspect,
@@ -58,9 +58,16 @@ def check_podman_container_status(
5858
if section.state.status == "exited"
5959
else section.state.status
6060
)
61+
62+
if section.state.status == "exited":
63+
exit_time = _format_exit_time(section.state.finished_at)
64+
summary = f"Container {section.name} exited at {exit_time} (code {section.state.exit_code})"
65+
else:
66+
summary = status.capitalize().replace("_", " ")
67+
6168
yield Result(
6269
state=State(params.get(status, 3)),
63-
summary=f"{status.capitalize().replace('_', ' ')}",
70+
summary=summary,
6471
)
6572

6673
if section.pod:

tests/unit/cmk/plugins/podman/agent_based/lib.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
)
1515

1616
SECTION_RUNNING = SectionPodmanContainerInspect(
17+
Name="test-container",
1718
State=SectionPodmanContainerState(
1819
Status="running",
1920
StartedAt="2025-08-01T13:00:00+02:00",
21+
FinishedAt="0001-01-01T00:00:00Z",
2022
ExitCode=0,
2123
Health=ContainerHealth(
2224
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],
@@ -44,9 +46,11 @@
4446
)
4547

4648
SECTION_PAUSED = SectionPodmanContainerInspect(
49+
Name="test-container",
4750
State=SectionPodmanContainerState(
4851
Status="paused",
4952
StartedAt="2025-08-01T13:00:00+02:00",
53+
FinishedAt="0001-01-01T00:00:00Z",
5054
ExitCode=0,
5155
Health=ContainerHealth(
5256
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],

tests/unit/cmk/plugins/podman/agent_based/test_podman_container_health.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
)
3131

3232
SECTION_NO_HEALTHCHECK = SectionPodmanContainerInspect(
33+
Name="test-container",
3334
State=SectionPodmanContainerState(
3435
Status="running",
3536
StartedAt="2025-08-01T13:00:00+02:00",
37+
FinishedAt="0001-01-01T00:00:00Z",
3638
ExitCode=0,
3739
Health=ContainerHealth(
3840
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],

tests/unit/cmk/plugins/podman/agent_based/test_podman_container_inspect.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
'"Config": {"HealthcheckOnFailureAction": "none", '
2929
'"Hostname": "test-hostname", "Labels": {"key1": "value1", "key2": "value2"}, "User": "username"},'
3030
'"NetworkSettings": {"IPAddress": "192.168.1.100", "Gateway": "192.168.1.1", '
31-
'"MacAddress": "00:11:22:33:44:55"}, "SocketUser": "hostuser"}'
31+
'"MacAddress": "00:11:22:33:44:55"}, "SocketUser": "hostuser", "Name": "test-container"}'
3232
]
3333
]
3434

@@ -41,17 +41,19 @@
4141
'"RestartCount": 5, "Pod": "", "Config": {"HealthcheckOnFailureAction": "none", '
4242
'"Hostname": "test-hostname", "Labels": {"key1": "value1", "key2": "value2"}, "User": "username"},'
4343
'"NetworkSettings": {"IPAddress": "192.168.1.100", "Gateway": "192.168.1.1", '
44-
'"MacAddress": "00:11:22:33:44:55"}}'
44+
'"MacAddress": "00:11:22:33:44:55"}, "Name": "test-container"}'
4545
]
4646
]
4747

4848

4949
def test_discover_podman_container_inspect() -> None:
5050
section = parse_podman_container_inspect(STRING_TABLE)
5151
assert section == SectionPodmanContainerInspect(
52+
Name="test-container",
5253
State=SectionPodmanContainerState(
5354
Status="running",
5455
StartedAt="2025-08-01T13:00:00+02:00",
56+
FinishedAt="0001-01-01T00:00:00Z",
5557
ExitCode=0,
5658
Health=ContainerHealth(Log=None, FailingStreak=0, Status="healthy"),
5759
),
@@ -141,9 +143,11 @@ def test_host_label_function_image_labels(
141143
image_name: str, expected_labels: list[HostLabel]
142144
) -> None:
143145
section = SectionPodmanContainerInspect(
146+
Name="test-container",
144147
State=SectionPodmanContainerState(
145148
Status="running",
146149
StartedAt="2025-08-01T13:00:00+02:00",
150+
FinishedAt="0001-01-01T00:00:00Z",
147151
ExitCode=0,
148152
Health=None,
149153
),

tests/unit/cmk/plugins/podman/agent_based/test_podman_container_status.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
from .lib import SECTION_PAUSED, SECTION_RUNNING
2727

2828
SECTION_EXITED_WITH_ZERO = SectionPodmanContainerInspect(
29+
Name="test-container",
2930
State=SectionPodmanContainerState(
3031
Status="exited",
3132
StartedAt="2025-08-01T13:00:00+02:00",
33+
FinishedAt="2026-03-09T22:14:05Z",
3234
ExitCode=0,
3335
Health=ContainerHealth(
3436
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],
@@ -55,9 +57,11 @@
5557
)
5658

5759
SECTION_EXITED_WITH_NON_ZERO = SectionPodmanContainerInspect(
60+
Name="test-container",
5861
State=SectionPodmanContainerState(
5962
Status="exited",
6063
StartedAt="2025-08-01T13:00:00+02:00",
64+
FinishedAt="2026-03-09T22:14:05Z",
6165
ExitCode=1,
6266
Health=ContainerHealth(
6367
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],
@@ -103,7 +107,10 @@ def test_discover_podman_container_status() -> None:
103107
SECTION_EXITED_WITH_ZERO,
104108
DEFAULT_CHECK_PARAMETERS,
105109
[
106-
Result(state=State.OK, summary="Exited with zero"),
110+
Result(
111+
state=State.OK,
112+
summary="Container test-container exited at 2026-03-09 22:14 UTC (code 0)",
113+
),
107114
Result(state=State.OK, summary="Pod: Pod1"),
108115
],
109116
id="Exited with zero -> OK. Contains Pod",
@@ -112,7 +119,10 @@ def test_discover_podman_container_status() -> None:
112119
SECTION_EXITED_WITH_NON_ZERO,
113120
DEFAULT_CHECK_PARAMETERS,
114121
[
115-
Result(state=State.CRIT, summary="Exited with non zero"),
122+
Result(
123+
state=State.CRIT,
124+
summary="Container test-container exited at 2026-03-09 22:14 UTC (code 1)",
125+
),
116126
Result(state=State.OK, summary="Pod: Pod1"),
117127
],
118128
id="Exited with non zero -> CRIT. Contains Pod",

tests/unit/cmk/plugins/podman/agent_based/test_podman_container_uptime.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
SectionPodmanContainerInspect,
1818
SectionPodmanContainerState,
1919
)
20-
from cmk.plugins.podman.agent_based.podman_container_inspect import (
21-
parse_podman_container_inspect,
22-
)
20+
from cmk.plugins.podman.agent_based.podman_container_inspect import parse_podman_container_inspect
2321
from cmk.plugins.podman.agent_based.podman_container_uptime import (
2422
calculate_uptime,
2523
check_podman_container_uptime,
@@ -78,9 +76,11 @@ def test_check_podman_container_uptime_no_running_container() -> None:
7876
[
7977
pytest.param(
8078
SectionPodmanContainerInspect(
79+
Name="test-container",
8180
State=SectionPodmanContainerState(
8281
Status="running",
8382
StartedAt="2025-06-01T13:00:00+02:00",
83+
FinishedAt="0001-01-01T00:00:00Z",
8484
ExitCode=0,
8585
Health=ContainerHealth(
8686
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],
@@ -110,9 +110,11 @@ def test_check_podman_container_uptime_no_running_container() -> None:
110110
),
111111
pytest.param(
112112
SectionPodmanContainerInspect(
113+
Name="test-container",
113114
State=SectionPodmanContainerState(
114115
Status="running",
115116
StartedAt="2025-06-01T13:00:00+00:00",
117+
FinishedAt="0001-01-01T00:00:00Z",
116118
ExitCode=0,
117119
Health=ContainerHealth(
118120
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],
@@ -142,9 +144,11 @@ def test_check_podman_container_uptime_no_running_container() -> None:
142144
),
143145
pytest.param(
144146
SectionPodmanContainerInspect(
147+
Name="test-container",
145148
State=SectionPodmanContainerState(
146149
Status="running",
147150
StartedAt="2025-06-01T13:00:00-01:00",
151+
FinishedAt="0001-01-01T00:00:00Z",
148152
ExitCode=0,
149153
Health=ContainerHealth(
150154
Log=[HealthCheckLog(Output="testOutput", ExitCode=0)],

0 commit comments

Comments
 (0)