apache-airflow-providers-cncf-kubernetes 7.12.0rc1__py3-none-any.whl → 7.13.0rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of apache-airflow-providers-cncf-kubernetes might be problematic. Click here for more details.

@@ -27,7 +27,7 @@ import packaging.version
27
27
 
28
28
  __all__ = ["__version__"]
29
29
 
30
- __version__ = "7.12.0"
30
+ __version__ = "7.13.0"
31
31
 
32
32
  try:
33
33
  from airflow import __version__ as airflow_version
@@ -17,10 +17,8 @@
17
17
  from __future__ import annotations
18
18
 
19
19
  import base64
20
- import inspect
21
20
  import os
22
21
  import pickle
23
- import textwrap
24
22
  import uuid
25
23
  from shlex import quote
26
24
  from tempfile import TemporaryDirectory
@@ -32,7 +30,6 @@ from kubernetes.client import models as k8s
32
30
  from airflow.decorators.base import DecoratedOperator, TaskDecorator, task_decorator_factory
33
31
  from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator
34
32
  from airflow.providers.cncf.kubernetes.python_kubernetes_script import (
35
- remove_task_decorator,
36
33
  write_python_script,
37
34
  )
38
35
 
@@ -77,13 +74,6 @@ class _KubernetesDecoratedOperator(DecoratedOperator, KubernetesPodOperator):
77
74
  **kwargs,
78
75
  )
79
76
 
80
- # TODO: Remove me once this provider min supported Airflow version is 2.6
81
- def get_python_source(self):
82
- raw_source = inspect.getsource(self.python_callable)
83
- res = textwrap.dedent(raw_source)
84
- res = remove_task_decorator(res, self.custom_operator_name)
85
- return res
86
-
87
77
  def _generate_cmds(self) -> list[str]:
88
78
  script_filename = "/tmp/script.py"
89
79
  input_filename = "/tmp/script.in"
@@ -28,8 +28,9 @@ def get_provider_info():
28
28
  "name": "Kubernetes",
29
29
  "description": "`Kubernetes <https://kubernetes.io/>`__\n",
30
30
  "suspended": False,
31
- "source-date-epoch": 1703288121,
31
+ "source-date-epoch": 1703747586,
32
32
  "versions": [
33
+ "7.13.0",
33
34
  "7.12.0",
34
35
  "7.11.0",
35
36
  "7.10.0",
@@ -21,7 +21,6 @@ from __future__ import annotations
21
21
  import json
22
22
  import logging
23
23
  import re
24
- import secrets
25
24
  import shlex
26
25
  import string
27
26
  import warnings
@@ -32,7 +31,6 @@ from typing import TYPE_CHECKING, Any, Callable, Iterable, Sequence
32
31
 
33
32
  from kubernetes.client import CoreV1Api, V1Pod, models as k8s
34
33
  from kubernetes.stream import stream
35
- from slugify import slugify
36
34
  from urllib3.exceptions import HTTPError
37
35
 
38
36
  from airflow.configuration import conf
@@ -51,7 +49,11 @@ from airflow.providers.cncf.kubernetes.backcompat.backwards_compat_converters im
51
49
  convert_volume_mount,
52
50
  )
53
51
  from airflow.providers.cncf.kubernetes.hooks.kubernetes import KubernetesHook
54
- from airflow.providers.cncf.kubernetes.kubernetes_helper_functions import POD_NAME_MAX_LENGTH
52
+ from airflow.providers.cncf.kubernetes.kubernetes_helper_functions import (
53
+ POD_NAME_MAX_LENGTH,
54
+ add_pod_suffix,
55
+ create_pod_id,
56
+ )
55
57
  from airflow.providers.cncf.kubernetes.pod_generator import PodGenerator
56
58
  from airflow.providers.cncf.kubernetes.triggers.pod import KubernetesPodTrigger
57
59
  from airflow.providers.cncf.kubernetes.utils import xcom_sidecar # type: ignore[attr-defined]
@@ -83,61 +85,6 @@ alphanum_lower = string.ascii_lowercase + string.digits
83
85
  KUBE_CONFIG_ENV_VAR = "KUBECONFIG"
84
86
 
85
87
 
86
- def _rand_str(num):
87
- """Generate random lowercase alphanumeric string of length num.
88
-
89
- TODO: when min airflow version >= 2.5, delete this function and import from kubernetes_helper_functions.
90
-
91
- :meta private:
92
- """
93
- return "".join(secrets.choice(alphanum_lower) for _ in range(num))
94
-
95
-
96
- def _add_pod_suffix(*, pod_name, rand_len=8, max_len=POD_NAME_MAX_LENGTH):
97
- """Add random string to pod name while staying under max len.
98
-
99
- TODO: when min airflow version >= 2.5, delete this function and import from kubernetes_helper_functions.
100
-
101
- :meta private:
102
- """
103
- suffix = "-" + _rand_str(rand_len)
104
- return pod_name[: max_len - len(suffix)].strip("-.") + suffix
105
-
106
-
107
- def _create_pod_id(
108
- dag_id: str | None = None,
109
- task_id: str | None = None,
110
- *,
111
- max_length: int = POD_NAME_MAX_LENGTH,
112
- unique: bool = True,
113
- ) -> str:
114
- """
115
- Generate unique pod ID given a dag_id and / or task_id.
116
-
117
- TODO: when min airflow version >= 2.5, delete this function and import from kubernetes_helper_functions.
118
-
119
- :param dag_id: DAG ID
120
- :param task_id: Task ID
121
- :param max_length: max number of characters
122
- :param unique: whether a random string suffix should be added
123
- :return: A valid identifier for a kubernetes pod name
124
- """
125
- if not (dag_id or task_id):
126
- raise ValueError("Must supply either dag_id or task_id.")
127
- name = ""
128
- if dag_id:
129
- name += dag_id
130
- if task_id:
131
- if name:
132
- name += "-"
133
- name += task_id
134
- base_name = slugify(name, lowercase=True)[:max_length].strip(".-")
135
- if unique:
136
- return _add_pod_suffix(pod_name=base_name, max_len=max_length)
137
- else:
138
- return base_name
139
-
140
-
141
88
  class PodReattachFailure(AirflowException):
142
89
  """When we expect to be able to find a pod but cannot."""
143
90
 
@@ -253,6 +200,9 @@ class KubernetesPodOperator(BaseOperator):
253
200
  :param progress_callback: Callback function for receiving k8s container logs.
254
201
  """
255
202
 
203
+ # !!! Changes in KubernetesPodOperator's arguments should be also reflected in !!!
204
+ # - airflow/decorators/__init__.pyi (by a separate PR)
205
+
256
206
  # This field can be overloaded at the instance level via base_container_name
257
207
  BASE_CONTAINER_NAME = "base"
258
208
  ISTIO_CONTAINER_NAME = "istio-proxy"
@@ -342,20 +292,6 @@ class KubernetesPodOperator(BaseOperator):
342
292
  progress_callback: Callable[[str], None] | None = None,
343
293
  **kwargs,
344
294
  ) -> None:
345
- # TODO: remove in provider 6.0.0 release. This is a mitigate step to advise users to switch to the
346
- # container_resources parameter.
347
- if isinstance(kwargs.get("resources"), k8s.V1ResourceRequirements):
348
- raise AirflowException(
349
- "Specifying resources for the launched pod with 'resources' is deprecated. "
350
- "Use 'container_resources' instead."
351
- )
352
- # TODO: remove in provider 6.0.0 release. This is a mitigate step to advise users to switch to the
353
- # node_selector parameter.
354
- if "node_selectors" in kwargs:
355
- raise ValueError(
356
- "Param `node_selectors` supplied. This param is no longer supported. "
357
- "Use `node_selector` instead."
358
- )
359
295
  super().__init__(**kwargs)
360
296
  self.kubernetes_conn_id = kubernetes_conn_id
361
297
  self.do_xcom_push = do_xcom_push
@@ -418,7 +354,7 @@ class KubernetesPodOperator(BaseOperator):
418
354
  skip_on_exit_code
419
355
  if isinstance(skip_on_exit_code, Container)
420
356
  else [skip_on_exit_code]
421
- if skip_on_exit_code
357
+ if skip_on_exit_code is not None
422
358
  else []
423
359
  )
424
360
  self.base_container_name = base_container_name or self.BASE_CONTAINER_NAME
@@ -745,34 +681,37 @@ class KubernetesPodOperator(BaseOperator):
745
681
  if pod_phase != PodPhase.SUCCEEDED or self.on_finish_action == OnFinishAction.KEEP_POD:
746
682
  self.patch_already_checked(remote_pod, reraise=False)
747
683
 
748
- if (pod_phase != PodPhase.SUCCEEDED and not istio_enabled) or (
684
+ failed = (pod_phase != PodPhase.SUCCEEDED and not istio_enabled) or (
749
685
  istio_enabled and not container_is_succeeded(remote_pod, self.base_container_name)
750
- ):
686
+ )
687
+
688
+ if failed:
751
689
  if self.log_events_on_failure:
752
690
  self._read_pod_events(pod, reraise=False)
753
691
 
754
- self.process_pod_deletion(remote_pod, reraise=False)
692
+ self.process_pod_deletion(remote_pod, reraise=False)
755
693
 
756
- error_message = get_container_termination_message(remote_pod, self.base_container_name)
757
- if self.skip_on_exit_code is not None:
758
- container_statuses = (
759
- remote_pod.status.container_statuses if remote_pod and remote_pod.status else None
760
- ) or []
761
- base_container_status = next(
762
- (x for x in container_statuses if x.name == self.base_container_name), None
763
- )
764
- exit_code = (
765
- base_container_status.state.terminated.exit_code
766
- if base_container_status
767
- and base_container_status.state
768
- and base_container_status.state.terminated
769
- else None
694
+ if self.skip_on_exit_code:
695
+ container_statuses = (
696
+ remote_pod.status.container_statuses if remote_pod and remote_pod.status else None
697
+ ) or []
698
+ base_container_status = next(
699
+ (x for x in container_statuses if x.name == self.base_container_name), None
700
+ )
701
+ exit_code = (
702
+ base_container_status.state.terminated.exit_code
703
+ if base_container_status
704
+ and base_container_status.state
705
+ and base_container_status.state.terminated
706
+ else None
707
+ )
708
+ if exit_code in self.skip_on_exit_code:
709
+ raise AirflowSkipException(
710
+ f"Pod {pod and pod.metadata.name} returned exit code {exit_code}. Skipping."
770
711
  )
771
- if exit_code in self.skip_on_exit_code:
772
- raise AirflowSkipException(
773
- f"Pod {pod and pod.metadata.name} returned exit code "
774
- f"{self.skip_on_exit_code}. Skipping."
775
- )
712
+
713
+ if failed:
714
+ error_message = get_container_termination_message(remote_pod, self.base_container_name)
776
715
  raise AirflowException(
777
716
  "\n".join(
778
717
  filter(
@@ -785,8 +724,6 @@ class KubernetesPodOperator(BaseOperator):
785
724
  )
786
725
  )
787
726
  )
788
- else:
789
- self.process_pod_deletion(remote_pod, reraise=False)
790
727
 
791
728
  def _read_pod_events(self, pod, *, reraise=True):
792
729
  """Will fetch and emit events from pod."""
@@ -962,12 +899,12 @@ class KubernetesPodOperator(BaseOperator):
962
899
  pod = PodGenerator.reconcile_pods(pod_template, pod)
963
900
 
964
901
  if not pod.metadata.name:
965
- pod.metadata.name = _create_pod_id(
902
+ pod.metadata.name = create_pod_id(
966
903
  task_id=self.task_id, unique=self.random_name_suffix, max_length=POD_NAME_MAX_LENGTH
967
904
  )
968
905
  elif self.random_name_suffix:
969
906
  # user has supplied pod name, we're just adding suffix
970
- pod.metadata.name = _add_pod_suffix(pod_name=pod.metadata.name)
907
+ pod.metadata.name = add_pod_suffix(pod_name=pod.metadata.name)
971
908
 
972
909
  if not pod.metadata.namespace:
973
910
  hook_namespace = self.hook.get_namespace()
@@ -58,6 +58,7 @@ class KubernetesResourceBaseOperator(BaseOperator):
58
58
  namespace: str | None = None,
59
59
  kubernetes_conn_id: str | None = KubernetesHook.default_conn_name,
60
60
  custom_resource_definition: bool = False,
61
+ config_file: str | None = None,
61
62
  **kwargs,
62
63
  ) -> None:
63
64
  super().__init__(**kwargs)
@@ -65,6 +66,7 @@ class KubernetesResourceBaseOperator(BaseOperator):
65
66
  self.kubernetes_conn_id = kubernetes_conn_id
66
67
  self.yaml_conf = yaml_conf
67
68
  self.custom_resource_definition = custom_resource_definition
69
+ self.config_file = config_file
68
70
 
69
71
  @cached_property
70
72
  def client(self) -> ApiClient:
@@ -76,7 +78,7 @@ class KubernetesResourceBaseOperator(BaseOperator):
76
78
 
77
79
  @cached_property
78
80
  def hook(self) -> KubernetesHook:
79
- hook = KubernetesHook(conn_id=self.kubernetes_conn_id)
81
+ hook = KubernetesHook(conn_id=self.kubernetes_conn_id, config_file=self.config_file)
80
82
  return hook
81
83
 
82
84
  def get_namespace(self) -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apache-airflow-providers-cncf-kubernetes
3
- Version: 7.12.0rc1
3
+ Version: 7.13.0rc1
4
4
  Summary: Provider package apache-airflow-providers-cncf-kubernetes for Apache Airflow
5
5
  Keywords: airflow-provider,cncf.kubernetes,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -28,8 +28,8 @@ Requires-Dist: google-re2>=1.0
28
28
  Requires-Dist: kubernetes>=21.7.0,<24
29
29
  Requires-Dist: kubernetes_asyncio>=18.20.1,<25
30
30
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
31
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.12.0/changelog.html
32
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.12.0
31
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.13.0/changelog.html
32
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.13.0
33
33
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
34
34
  Project-URL: Source Code, https://github.com/apache/airflow
35
35
  Project-URL: Twitter, https://twitter.com/ApacheAirflow
@@ -79,7 +79,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
79
79
 
80
80
  Package ``apache-airflow-providers-cncf-kubernetes``
81
81
 
82
- Release: ``7.12.0.rc1``
82
+ Release: ``7.13.0.rc1``
83
83
 
84
84
 
85
85
  `Kubernetes <https://kubernetes.io/>`__
@@ -92,7 +92,7 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
92
92
  are in ``airflow.providers.cncf.kubernetes`` python package.
93
93
 
94
94
  You can find package information and changelog for the provider
95
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.12.0/>`_.
95
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.13.0/>`_.
96
96
 
97
97
  Installation
98
98
  ------------
@@ -119,4 +119,4 @@ PIP package Version required
119
119
  ====================== ==================
120
120
 
121
121
  The changelog for the provider package can be found in the
122
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.12.0/changelog.html>`_.
122
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/7.13.0/changelog.html>`_.
@@ -1,6 +1,6 @@
1
1
  airflow/providers/cncf/kubernetes/LICENSE,sha256=ywUBpKZc7Jb96rVt5I3IDbg7dIJAbUSHkuoDcF3jbH4,13569
2
- airflow/providers/cncf/kubernetes/__init__.py,sha256=MZ74qQcKNfyPGE65KVFB-goFLicYvMb0XEEGGs6fwBs,1591
3
- airflow/providers/cncf/kubernetes/get_provider_info.py,sha256=Xy_X1-YJdYlApYxM28S6gpnyAHchdUEhO-5NnhLS9q8,16249
2
+ airflow/providers/cncf/kubernetes/__init__.py,sha256=gou8vJ_2dVzGonkv0g99QZj1N52MXT4Ia-oElxkSjZA,1591
3
+ airflow/providers/cncf/kubernetes/get_provider_info.py,sha256=VhRDeLvTnuVNBoJDcuLj45UpTYyuug8FeirtZsdzk6U,16271
4
4
  airflow/providers/cncf/kubernetes/k8s_model.py,sha256=JzpSjHdCBpajT5HohKhvYp4vZ9emf7A6AVmte8tI4T0,2100
5
5
  airflow/providers/cncf/kubernetes/kube_client.py,sha256=nL9daGLElvX4f72rWvONRN-VUbrOPzjsElix6xfkcXU,5328
6
6
  airflow/providers/cncf/kubernetes/kube_config.py,sha256=SZhMYmCJACkzxEFe0vcCW0m1XmoFpmDaIYf_Rl_uycA,4851
@@ -15,7 +15,7 @@ airflow/providers/cncf/kubernetes/template_rendering.py,sha256=ld9iFK2VdzoCTqTnc
15
15
  airflow/providers/cncf/kubernetes/backcompat/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
16
16
  airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py,sha256=8USJYpjSQhloMUgJHJ6NZYIpUVR5di5ljP0v-ZhOeV8,3966
17
17
  airflow/providers/cncf/kubernetes/decorators/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
18
- airflow/providers/cncf/kubernetes/decorators/kubernetes.py,sha256=CwzOZFPnxt66GgfsMBY-lePLErDidovxB2SOjkX47wI,6140
18
+ airflow/providers/cncf/kubernetes/decorators/kubernetes.py,sha256=YGEdDNZhxeq8dpAaKpwMS2oGRvN1sN0xzf8mYotMk1E,5780
19
19
  airflow/providers/cncf/kubernetes/executors/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
20
20
  airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py,sha256=Fy89QrJdsCt-cIDt0fVRYz0AyctY1bZdp6Jj853PjyY,33311
21
21
  airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py,sha256=9rRhfRuujGtSE73Ax0kC12whZCgWF2m6j5w9G9e0F_I,1673
@@ -27,8 +27,8 @@ airflow/providers/cncf/kubernetes/kubernetes_executor_templates/__init__.py,sha2
27
27
  airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.yaml,sha256=yzJmXN4ZyB4aDwI_GIugpL9-f1YMVy__X-LQSbeU95A,2567
28
28
  airflow/providers/cncf/kubernetes/operators/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
29
29
  airflow/providers/cncf/kubernetes/operators/kubernetes_pod.py,sha256=XvJgehU-4ZubJZ2vsekHX4DlCLlzBttXuZQlpVZZ2Ro,1262
30
- airflow/providers/cncf/kubernetes/operators/pod.py,sha256=9NglVJKewxRm3x-EVmqp1HBsKauD1qSMpp4YiFx9u8c,46313
31
- airflow/providers/cncf/kubernetes/operators/resource.py,sha256=ie0QspONlLBah-3hCUGNX85jWr7DvUf4wo77d8wMkOA,5348
30
+ airflow/providers/cncf/kubernetes/operators/pod.py,sha256=p1FThvIXY2DqZBBaw5QqkhbBiTtsUJ2ck9rge462aW8,43844
31
+ airflow/providers/cncf/kubernetes/operators/resource.py,sha256=t7JBj7Q-2f_y-vCdTMxrmjG8VYQj9k03u0rz1fbAFVQ,5457
32
32
  airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py,sha256=FNCzSvutCkkrsYbt4E2Xhp-xSaVC0WcdsPJYdQFwUOI,7723
33
33
  airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
34
34
  airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml,sha256=7JdppZ-XDBpv2Bnde2SthhcME8w3b8xQdPAK1fJGW60,2256
@@ -44,7 +44,7 @@ airflow/providers/cncf/kubernetes/utils/delete_from.py,sha256=poObZSoEJwQyaYWilE
44
44
  airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py,sha256=-Pgc5i2WEDl7ZBvtJZ4eWDqqlSj8WdULqwUyOWmsRp8,1928
45
45
  airflow/providers/cncf/kubernetes/utils/pod_manager.py,sha256=Grtq1QIzPyiilP30-GpNVPKSHhodgxPKno5UJjsW4x8,32278
46
46
  airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py,sha256=dCLPE-KyI3nVfawcuKMjhxuBuK9TgVZocc4eC82hAM4,2518
47
- apache_airflow_providers_cncf_kubernetes-7.12.0rc1.dist-info/entry_points.txt,sha256=ByD3QJJyP9CfmTYtpNI1953akD38RUDgpGXLaq9vpOw,111
48
- apache_airflow_providers_cncf_kubernetes-7.12.0rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
49
- apache_airflow_providers_cncf_kubernetes-7.12.0rc1.dist-info/METADATA,sha256=ajDCgpRFr1VQ2CqQb_uYqOjc0JWkS0upmvbNSVwfpgo,5193
50
- apache_airflow_providers_cncf_kubernetes-7.12.0rc1.dist-info/RECORD,,
47
+ apache_airflow_providers_cncf_kubernetes-7.13.0rc1.dist-info/entry_points.txt,sha256=ByD3QJJyP9CfmTYtpNI1953akD38RUDgpGXLaq9vpOw,111
48
+ apache_airflow_providers_cncf_kubernetes-7.13.0rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
49
+ apache_airflow_providers_cncf_kubernetes-7.13.0rc1.dist-info/METADATA,sha256=GMa4zRAzGFRw3wMGTXVaQWnMudA7Nqs-bb2uN4T6PV0,5193
50
+ apache_airflow_providers_cncf_kubernetes-7.13.0rc1.dist-info/RECORD,,