Skip to content

Commit 52f4c3a

Browse files
Fix deleting and recreating resources (#641)
1 parent b8aec08 commit 52f4c3a

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

kr8s/_objects.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,18 @@ def raw(self) -> Box:
134134
def raw(self, value: Any) -> None:
135135
self._raw = Box(value)
136136

137+
@property
138+
def raw_template(self) -> Box:
139+
"""Template representation of the Kubernetes resource without instance-specific data.
140+
141+
Returns a copy of the raw object with metadata.resourceVersion and status removed.
142+
This is useful for creating new resources based on existing ones.
143+
"""
144+
template = self.raw.copy()
145+
if "metadata" in template:
146+
template.metadata.pop("resourceVersion", None)
147+
return template
148+
137149
@property
138150
def name(self) -> str:
139151
"""Name of the Kubernetes resource."""
@@ -353,7 +365,7 @@ async def async_create(self) -> None:
353365
version=self.version,
354366
url=self.endpoint,
355367
namespace=self.namespace,
356-
data=json.dumps(self.raw),
368+
data=json.dumps(self.raw_template),
357369
) as resp:
358370
self.raw = resp.json()
359371

kr8s/tests/test_objects.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,3 +1401,27 @@ async def test_generate_name():
14011401
assert po.metadata.generateName in po.name
14021402
finally:
14031403
await po.delete()
1404+
1405+
1406+
async def test_recreate_pod(ns):
1407+
po = await kr8s.asyncio.objects.Pod.gen(
1408+
generate_name="nginx-", image="nginx:latest", namespace=ns
1409+
)
1410+
await po.create()
1411+
await po.delete()
1412+
while await po.exists():
1413+
await anyio.sleep(0.1)
1414+
await po.create()
1415+
while not await po.exists():
1416+
await anyio.sleep(0.1)
1417+
assert await po.exists()
1418+
await po.delete()
1419+
1420+
1421+
async def test_create_existing_pod_fails():
1422+
po = await kr8s.asyncio.objects.Pod.gen(
1423+
generate_name="nginx-", image="nginx:latest"
1424+
)
1425+
await po.create()
1426+
with pytest.raises(kr8s.ServerError, match="already exists"):
1427+
await po.create()

0 commit comments

Comments
 (0)