Skip to content

Commit abc7e47

Browse files
committed
task: fix fetching default resource name for task
I think combining @functools.cache with @staticmethod (and methods in general) is problematic. Avoid that.
1 parent 0461d27 commit abc7e47

1 file changed

Lines changed: 32 additions & 30 deletions

File tree

task.py

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import enum
2+
import functools
23
import json
34
import logging
45
import os
@@ -7,7 +8,6 @@
78
import time
89
import typing
910
import yaml
10-
import functools
1111

1212
from abc import ABC
1313
from abc import abstractmethod
@@ -56,6 +56,36 @@ class _OperationState(enum.Enum):
5656
STOPPED = 5
5757

5858

59+
@functools.cache
60+
def detect_default_resource_name_cached(
61+
client: K8sClient,
62+
namespace: str,
63+
secondary_network_nad: Optional[str],
64+
) -> Optional[str]:
65+
if secondary_network_nad is not None:
66+
if "/" in secondary_network_nad:
67+
ns, nad = secondary_network_nad.split("/", 1)
68+
else:
69+
ns, nad = namespace, secondary_network_nad
70+
data = client.oc_get(
71+
f"network-attachment-definition/{nad}",
72+
namespace=ns,
73+
)
74+
else:
75+
data = None
76+
resource_name = None
77+
78+
if data is not None:
79+
try:
80+
r = data["metadata"]["annotations"]["k8s.v1.cni.cncf.io/resourceName"]
81+
if isinstance(r, str) and r:
82+
resource_name = r
83+
except Exception:
84+
pass
85+
logger.info(f"autodetected resource_name as {repr(resource_name)}")
86+
return resource_name
87+
88+
5989
class TaskOperation:
6090
@typing.overload
6191
def __init__(
@@ -308,38 +338,10 @@ def out_file_yaml(self) -> str:
308338
raise RuntimeError("task cannot generate a pod yaml")
309339
return tftbase.get_manifest_renderpath(self.pod_name + ".yaml")
310340

311-
@functools.cache
312-
@staticmethod
313-
def _fetch_default_resource_name(
314-
client: K8sClient, namespace: str, secondary_network_nad: Optional[str]
315-
) -> Optional[str]:
316-
if secondary_network_nad is not None:
317-
if "/" in secondary_network_nad:
318-
ns, nad = secondary_network_nad.split("/", 1)
319-
else:
320-
ns, nad = namespace, secondary_network_nad
321-
data = client.oc_get(
322-
f"network-attachment-definition/{nad}",
323-
namespace=ns,
324-
)
325-
else:
326-
data = None
327-
resource_name = None
328-
329-
if data is not None:
330-
try:
331-
r = data["metadata"]["annotations"]["k8s.v1.cni.cncf.io/resourceName"]
332-
if isinstance(r, str) and r:
333-
resource_name = r
334-
except Exception:
335-
pass
336-
logger.info(f"autodetected resource_name as {repr(resource_name)}")
337-
return resource_name
338-
339341
def get_template_args(self) -> dict[str, str | list[str] | bool]:
340342
resource_name = (
341343
self.ts.connection.resource_name
342-
or Task._fetch_default_resource_name(
344+
or detect_default_resource_name_cached(
343345
self.client,
344346
self.get_namespace(),
345347
self.ts.connection.secondary_network_nad,

0 commit comments

Comments
 (0)