Skip to content

Commit 2ed0356

Browse files
Add force and grace_period_seconds options to delete (#565)
1 parent fbf21e8 commit 2ed0356

File tree

2 files changed

+63
-8
lines changed

2 files changed

+63
-8
lines changed

kr8s/_objects.py

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,41 @@ async def create(self) -> None:
360360
"""Create this object in Kubernetes."""
361361
return await self.async_create()
362362

363-
async def delete(self, propagation_policy: str | None = None) -> None:
364-
"""Delete this object from Kubernetes."""
365-
return await self.async_delete(propagation_policy=propagation_policy)
363+
async def delete(
364+
self,
365+
propagation_policy: str | None = None,
366+
grace_period: int | None = None,
367+
force: bool = False,
368+
) -> None:
369+
"""Delete this object from Kubernetes.
370+
371+
Args:
372+
propagation_policy: The deletion propagation policy.
373+
grace_period: The grace period for deletion.
374+
force: Force deletion. (Setting to ``True`` is equivelaent to setting grace_period to 0)
375+
"""
376+
return await self.async_delete(
377+
propagation_policy=propagation_policy,
378+
grace_period=grace_period,
379+
force=force,
380+
)
366381

367-
async def async_delete(self, propagation_policy: str | None = None) -> None:
382+
async def async_delete(
383+
self,
384+
propagation_policy: str | None = None,
385+
grace_period: int | None = None,
386+
force: bool = False,
387+
) -> None:
368388
"""Delete this object from Kubernetes."""
369-
data = {}
389+
data: dict[str, Any] = {}
370390
if propagation_policy:
371391
data["propagationPolicy"] = propagation_policy
392+
if grace_period and force:
393+
raise ValueError("Cannot set both grace_period and force")
394+
if grace_period:
395+
data["gracePeriodSeconds"] = grace_period
396+
elif force:
397+
data["gracePeriodSeconds"] = 0
372398
try:
373399
assert self.api
374400
async with self.api.call_api(
@@ -802,8 +828,17 @@ def exists(self, ensure=False) -> bool: # type: ignore[override]
802828
def create(self) -> None: # type: ignore[override]
803829
return run_sync(self.async_create)() # type: ignore
804830

805-
def delete(self, propagation_policy: str | None = None) -> None: # type: ignore[override]
806-
return run_sync(self.async_delete)(propagation_policy=propagation_policy) # type: ignore
831+
def delete( # type: ignore[override]
832+
self,
833+
propagation_policy: str | None = None,
834+
grace_period: int | None = None,
835+
force: bool = False,
836+
) -> None:
837+
run_sync(self.async_delete)(
838+
propagation_policy=propagation_policy,
839+
grace_period=grace_period,
840+
force=force,
841+
) # type: ignore
807842

808843
def refresh(self) -> None: # type: ignore[override]
809844
return run_sync(self.async_refresh)() # type: ignore

kr8s/tests/test_objects.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,26 @@ async def test_pod_create_and_delete(example_pod_spec):
128128
assert not await pod.exists()
129129

130130

131+
async def test_pod_force_delete(example_pod_spec):
132+
pod = await Pod(example_pod_spec)
133+
await pod.create()
134+
while not await pod.exists():
135+
await anyio.sleep(0.1)
136+
await pod.delete(force=True)
137+
await anyio.sleep(0.1)
138+
assert not await pod.exists()
139+
140+
141+
def test_pod_force_delete_sync(example_pod_spec):
142+
pod = SyncPod(example_pod_spec)
143+
pod.create()
144+
while not pod.exists():
145+
time.sleep(0.1)
146+
pod.delete(force=True)
147+
time.sleep(0.1)
148+
assert not pod.exists()
149+
150+
131151
async def test_pod_object_from_name_type(example_pod_spec):
132152
pod = await Pod(example_pod_spec)
133153
await pod.create()
@@ -152,7 +172,7 @@ async def test_pod_wait_ready(example_pod_spec):
152172
await pod.wait("jsonpath='{.status.phase}'=Running")
153173
with pytest.raises(ValueError):
154174
await pod.wait("foo=NotARealCondition")
155-
await pod.delete()
175+
await pod.delete(grace_period=10)
156176
await pod.wait("condition=Ready=False")
157177
await pod.wait("delete")
158178

0 commit comments

Comments
 (0)