apache-airflow-providers-cncf-kubernetes 8.0.0rc2__py3-none-any.whl → 8.0.1rc1__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.
@@ -27,7 +27,7 @@ import packaging.version
27
27
 
28
28
  __all__ = ["__version__"]
29
29
 
30
- __version__ = "8.0.0"
30
+ __version__ = "8.0.1"
31
31
 
32
32
  try:
33
33
  from airflow import __version__ as airflow_version
@@ -19,7 +19,7 @@ KubernetesExecutor.
19
19
 
20
20
  .. seealso::
21
21
  For more information on how the KubernetesExecutor works, take a look at the guide:
22
- :ref:`executor:KubernetesExecutor`
22
+ :doc:`/kubernetes_executor`
23
23
  """
24
24
  from __future__ import annotations
25
25
 
@@ -431,10 +431,9 @@ class KubernetesExecutor(BaseExecutor):
431
431
  self.kube_scheduler.run_next(task)
432
432
  self.task_publish_retries.pop(key, None)
433
433
  except PodReconciliationError as e:
434
- self.log.error(
434
+ self.log.exception(
435
435
  "Pod reconciliation failed, likely due to kubernetes library upgrade. "
436
436
  "Try clearing the task to re-run.",
437
- exc_info=True,
438
437
  )
439
438
  self.fail(task[0], e)
440
439
  except ApiException as e:
@@ -235,6 +235,34 @@ class KubernetesJobWatcher(multiprocessing.Process, LoggingMixin):
235
235
  self.watcher_queue.put(
236
236
  (pod_name, namespace, TaskInstanceState.FAILED, annotations, resource_version)
237
237
  )
238
+ elif (
239
+ self.kube_config.worker_pod_pending_fatal_container_state_reasons
240
+ and "status" in event["raw_object"]
241
+ ):
242
+ self.log.info("Event: %s Pending, annotations: %s", pod_name, annotations_string)
243
+ # Init containers and base container statuses to check.
244
+ # Skipping the other containers statuses check.
245
+ container_statuses_to_check = []
246
+ if "initContainerStatuses" in event["raw_object"]["status"]:
247
+ container_statuses_to_check.extend(event["raw_object"]["status"]["initContainerStatuses"])
248
+ if "containerStatuses" in event["raw_object"]["status"]:
249
+ container_statuses_to_check.append(event["raw_object"]["status"]["containerStatuses"][0])
250
+ for container_status in container_statuses_to_check:
251
+ container_status_state = container_status["state"]
252
+ if "waiting" in container_status_state:
253
+ if (
254
+ container_status_state["waiting"]["reason"]
255
+ in self.kube_config.worker_pod_pending_fatal_container_state_reasons
256
+ ):
257
+ if (
258
+ container_status_state["waiting"]["reason"] == "ErrImagePull"
259
+ and container_status_state["waiting"]["message"] == "pull QPS exceeded"
260
+ ):
261
+ continue
262
+ self.watcher_queue.put(
263
+ (pod_name, namespace, TaskInstanceState.FAILED, annotations, resource_version)
264
+ )
265
+ break
238
266
  else:
239
267
  self.log.debug("Event: %s Pending, annotations: %s", pod_name, annotations_string)
240
268
  elif status == "Failed":
@@ -28,8 +28,9 @@ def get_provider_info():
28
28
  "name": "Kubernetes",
29
29
  "description": "`Kubernetes <https://kubernetes.io/>`__\n",
30
30
  "state": "ready",
31
- "source-date-epoch": 1707637063,
31
+ "source-date-epoch": 1709555165,
32
32
  "versions": [
33
+ "8.0.1",
33
34
  "8.0.0",
34
35
  "7.14.0",
35
36
  "7.13.0",
@@ -222,6 +223,13 @@ def get_provider_info():
222
223
  "example": None,
223
224
  "default": "False",
224
225
  },
226
+ "worker_pod_pending_fatal_container_state_reasons": {
227
+ "description": "If the worker pods are in a pending state due to a fatal container\nstate reasons, then fail the task and delete the worker pod\nif delete_worker_pods is True and delete_worker_pods_on_failure is True.\n",
228
+ "version_added": "8.1.0",
229
+ "type": "string",
230
+ "example": None,
231
+ "default": "CreateContainerConfigError,ErrImagePull,CreateContainerError,ImageInspectError, InvalidImageName",
232
+ },
225
233
  "worker_pods_creation_batch_size": {
226
234
  "description": 'Number of Kubernetes Worker Pod creation calls per scheduler loop.\nNote that the current default of "1" will only launch a single pod\nper-heartbeat. It is HIGHLY recommended that users increase this\nnumber to match the tolerance of their kubernetes cluster for\nbetter performance.\n',
227
235
  "version_added": None,
@@ -40,6 +40,12 @@ class KubeConfig:
40
40
  self.delete_worker_pods_on_failure = conf.getboolean(
41
41
  self.kubernetes_section, "delete_worker_pods_on_failure"
42
42
  )
43
+ self.worker_pod_pending_fatal_container_state_reasons = []
44
+ if conf.get(self.kubernetes_section, "worker_pod_pending_fatal_container_state_reasons", fallback=""):
45
+ self.worker_pod_pending_fatal_container_state_reasons = conf.get(
46
+ self.kubernetes_section, "worker_pod_pending_fatal_container_state_reasons"
47
+ ).split(",")
48
+
43
49
  self.worker_pods_creation_batch_size = conf.getint(
44
50
  self.kubernetes_section, "worker_pods_creation_batch_size"
45
51
  )
@@ -21,7 +21,7 @@ from __future__ import annotations
21
21
  import warnings
22
22
 
23
23
  from airflow.exceptions import AirflowProviderDeprecationWarning
24
- from airflow.providers.cncf.kubernetes.operators.pod import * # noqa
24
+ from airflow.providers.cncf.kubernetes.operators.pod import * # noqa: F403
25
25
 
26
26
  warnings.warn(
27
27
  "This module is deprecated. Please use `airflow.providers.cncf.kubernetes.operators.pod` instead.",
@@ -704,6 +704,10 @@ class KubernetesPodOperator(BaseOperator):
704
704
  )
705
705
 
706
706
  if event["status"] in ("error", "failed", "timeout"):
707
+ # fetch some logs when pod is failed
708
+ if self.get_logs:
709
+ self.write_logs(self.pod)
710
+
707
711
  if self.do_xcom_push:
708
712
  _ = self.extract_xcom(pod=self.pod)
709
713
 
@@ -729,6 +733,10 @@ class KubernetesPodOperator(BaseOperator):
729
733
  self.invoke_defer_method()
730
734
 
731
735
  elif event["status"] == "success":
736
+ # fetch some logs when pod is executed successfully
737
+ if self.get_logs:
738
+ self.write_logs(self.pod)
739
+
732
740
  if self.do_xcom_push:
733
741
  xcom_sidecar_output = self.extract_xcom(pod=self.pod)
734
742
  return xcom_sidecar_output
@@ -741,8 +749,6 @@ class KubernetesPodOperator(BaseOperator):
741
749
  def _clean(self, event: dict[str, Any]):
742
750
  if event["status"] == "running":
743
751
  return
744
- if self.get_logs:
745
- self.write_logs(self.pod)
746
752
  istio_enabled = self.is_istio_enabled(self.pod)
747
753
  # Skip await_pod_completion when the event is 'timeout' due to the pod can hang
748
754
  # on the ErrImagePull or ContainerCreating step and it will never complete
@@ -787,9 +793,11 @@ class KubernetesPodOperator(BaseOperator):
787
793
  self.callbacks.on_pod_cleanup(pod=pod, client=self.client, mode=ExecutionMode.SYNC)
788
794
 
789
795
  def cleanup(self, pod: k8s.V1Pod, remote_pod: k8s.V1Pod):
790
- # If a task got marked as failed, "on_kill" method would be called and the pod will be cleaned up
796
+ # Skip cleaning the pod in the following scenarios.
797
+ # 1. If a task got marked as failed, "on_kill" method would be called and the pod will be cleaned up
791
798
  # there. Cleaning it up again will raise an exception (which might cause retry).
792
- if self._killed:
799
+ # 2. remote pod is null (ex: pod creation failed)
800
+ if self._killed or not remote_pod:
793
801
  return
794
802
 
795
803
  istio_enabled = self.is_istio_enabled(remote_pod)
@@ -21,7 +21,7 @@ from __future__ import annotations
21
21
  import warnings
22
22
 
23
23
  from airflow.exceptions import AirflowProviderDeprecationWarning
24
- from airflow.providers.cncf.kubernetes.triggers.pod import * # noqa
24
+ from airflow.providers.cncf.kubernetes.triggers.pod import * # noqa: F403
25
25
 
26
26
  warnings.warn(
27
27
  "This module is deprecated. Please use `airflow.providers.cncf.kubernetes.triggers.pod` instead.",
@@ -190,6 +190,7 @@ class KubernetesPodTrigger(BaseTrigger):
190
190
  "message": message,
191
191
  }
192
192
  )
193
+ return
193
194
  except Exception as e:
194
195
  yield TriggerEvent(
195
196
  {
@@ -223,6 +224,7 @@ class KubernetesPodTrigger(BaseTrigger):
223
224
  return self.define_container_state(pod)
224
225
  self.log.info("Still waiting for pod to start. The pod state is %s", pod.status.phase)
225
226
  await asyncio.sleep(self.poll_interval)
227
+ delta = datetime.datetime.now(tz=datetime.timezone.utc) - self.trigger_start_time
226
228
  raise PodLaunchTimeoutException("Pod did not leave 'Pending' phase within specified timeout")
227
229
 
228
230
  async def _wait_for_container_completion(self) -> TriggerEvent:
@@ -245,7 +247,12 @@ class KubernetesPodTrigger(BaseTrigger):
245
247
  )
246
248
  elif container_state == ContainerState.FAILED:
247
249
  return TriggerEvent(
248
- {"status": "failed", "namespace": self.pod_namespace, "name": self.pod_name}
250
+ {
251
+ "status": "failed",
252
+ "namespace": self.pod_namespace,
253
+ "name": self.pod_name,
254
+ "message": "Container state failed",
255
+ }
249
256
  )
250
257
  if time_get_more_logs and datetime.datetime.now(tz=datetime.timezone.utc) > time_get_more_logs:
251
258
  return TriggerEvent(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apache-airflow-providers-cncf-kubernetes
3
- Version: 8.0.0rc2
3
+ Version: 8.0.1rc1
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>=28.1.0,<=29.0.0
29
29
  Requires-Dist: kubernetes_asyncio>=28.1.0,<=29.0.0
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/8.0.0/changelog.html
32
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.0.0
31
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.0.1/changelog.html
32
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.0.1
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: ``8.0.0.rc2``
82
+ Release: ``8.0.1.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/8.0.0/>`_.
95
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.0.1/>`_.
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/8.0.0/changelog.html>`_.
122
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.0.1/changelog.html>`_.
@@ -1,10 +1,10 @@
1
1
  airflow/providers/cncf/kubernetes/LICENSE,sha256=ywUBpKZc7Jb96rVt5I3IDbg7dIJAbUSHkuoDcF3jbH4,13569
2
- airflow/providers/cncf/kubernetes/__init__.py,sha256=hUe3RqR8lcisxD9LGi2zUo6uCq3a9e5xiJAgqZsQY7s,1590
2
+ airflow/providers/cncf/kubernetes/__init__.py,sha256=MbaHKvRjf-mkddQNqXUpG9Vls7zKqd2oJ1jRKtQm_nA,1590
3
3
  airflow/providers/cncf/kubernetes/callbacks.py,sha256=s3DRwNmQJSBlbeUwhSUJwfRFFMdJ9h_PnBzVl881r-8,4094
4
- airflow/providers/cncf/kubernetes/get_provider_info.py,sha256=jhhA8LvwfihkJDJ_TaQMDpMiMdDHn4iKux0cIq4S1Uo,16971
4
+ airflow/providers/cncf/kubernetes/get_provider_info.py,sha256=IGN7VwH6p1wcxe2twbeg7lyHz6GnCuwEiedIEUMeO-s,17603
5
5
  airflow/providers/cncf/kubernetes/k8s_model.py,sha256=JzpSjHdCBpajT5HohKhvYp4vZ9emf7A6AVmte8tI4T0,2100
6
6
  airflow/providers/cncf/kubernetes/kube_client.py,sha256=nL9daGLElvX4f72rWvONRN-VUbrOPzjsElix6xfkcXU,5328
7
- airflow/providers/cncf/kubernetes/kube_config.py,sha256=SZhMYmCJACkzxEFe0vcCW0m1XmoFpmDaIYf_Rl_uycA,4851
7
+ airflow/providers/cncf/kubernetes/kube_config.py,sha256=FAmhZZ_Z2JtoVzL6wENSjcwrlwAenHttTX_Ild9aEms,5225
8
8
  airflow/providers/cncf/kubernetes/kubernetes_helper_functions.py,sha256=NuLumd5JrNVadLKYoNw3LpMYT7Hp3n07ckcOqNv6qE4,6411
9
9
  airflow/providers/cncf/kubernetes/pod_generator.py,sha256=WEFKm6xhoT7SV96bXGJTVrWkp2sOlkM4U6-iAdZa56k,24467
10
10
  airflow/providers/cncf/kubernetes/pod_generator_deprecated.py,sha256=tOrFvE4MJxy94ecSLOxAGKjIeKztqOC81q_xXr17rRU,11993
@@ -18,9 +18,9 @@ airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py,sha2
18
18
  airflow/providers/cncf/kubernetes/decorators/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
19
19
  airflow/providers/cncf/kubernetes/decorators/kubernetes.py,sha256=YGEdDNZhxeq8dpAaKpwMS2oGRvN1sN0xzf8mYotMk1E,5780
20
20
  airflow/providers/cncf/kubernetes/executors/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
21
- airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py,sha256=TNS3uRZaZn8c_xNrsi5eMljvIsSzKfUr2_NLIsyhHUI,34173
21
+ airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py,sha256=YbhPg3Jo20--slN_xLFrQO4qNYOyNySkH4Egy_l5Yoo,34131
22
22
  airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py,sha256=9rRhfRuujGtSE73Ax0kC12whZCgWF2m6j5w9G9e0F_I,1673
23
- airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py,sha256=sG4AtsrMLqFRhaOYlWCj9AqLkT2NNu8hZMAlvX9XxpA,21787
23
+ airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py,sha256=JKcUwYsipj5oiX7fqcNx3lfnv4Fiogwh-B5fh4fF9Mg,23564
24
24
  airflow/providers/cncf/kubernetes/executors/local_kubernetes_executor.py,sha256=r5cvhj9NUTreQScn3Y8NlPFoYIa_NaAVQ27WqtOrJvw,10014
25
25
  airflow/providers/cncf/kubernetes/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
26
26
  airflow/providers/cncf/kubernetes/hooks/kubernetes.py,sha256=_FUOQVpxpahtuQcyiCfenJD7yUsDblmVEV6Ym0wgmE8,25701
@@ -29,8 +29,8 @@ airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.y
29
29
  airflow/providers/cncf/kubernetes/operators/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
30
30
  airflow/providers/cncf/kubernetes/operators/custom_object_launcher.py,sha256=Q_8iXGOyRpporI-ouhl9eKQSO30yauRdQ95x2pnkku0,15357
31
31
  airflow/providers/cncf/kubernetes/operators/job.py,sha256=Z7G9iuNPH_qapodVEwvvGq17fk6xlMC0O6TwT-cWqsg,11614
32
- airflow/providers/cncf/kubernetes/operators/kubernetes_pod.py,sha256=XvJgehU-4ZubJZ2vsekHX4DlCLlzBttXuZQlpVZZ2Ro,1262
33
- airflow/providers/cncf/kubernetes/operators/pod.py,sha256=sCRkI7frojgPq4o-e0ylrCPkaAtRhQ4xcxp3urw6RGE,49216
32
+ airflow/providers/cncf/kubernetes/operators/kubernetes_pod.py,sha256=tj1JNZWcu65IGpyO6uZpS9-0Mtjyt52WP_36UZcftYQ,1268
33
+ airflow/providers/cncf/kubernetes/operators/pod.py,sha256=c9mz_PpTKuAUFbAMwn3Z2v-4EzGCQ92dDjNFkjwRDRk,49574
34
34
  airflow/providers/cncf/kubernetes/operators/resource.py,sha256=t7JBj7Q-2f_y-vCdTMxrmjG8VYQj9k03u0rz1fbAFVQ,5457
35
35
  airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py,sha256=UcID25Shv0zLTx448HcJjeob_24v25q_nAljQ_d8jM0,12070
36
36
  airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
@@ -44,14 +44,14 @@ airflow/providers/cncf/kubernetes/resource_convert/secret.py,sha256=ElZCMbTWeTKo
44
44
  airflow/providers/cncf/kubernetes/sensors/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
45
45
  airflow/providers/cncf/kubernetes/sensors/spark_kubernetes.py,sha256=AFml2CgXTV13G2VGrmNAIh-778FnRZdyLfverw92Uo0,5552
46
46
  airflow/providers/cncf/kubernetes/triggers/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
47
- airflow/providers/cncf/kubernetes/triggers/kubernetes_pod.py,sha256=yptsSm6PmdPKFLVZj9IU0zChZddom2mZcTXFteuZrjo,1259
48
- airflow/providers/cncf/kubernetes/triggers/pod.py,sha256=B16uKwKg4GYAVX8LwfXBFU969804VVyIfFJvTuTcQ5o,12857
47
+ airflow/providers/cncf/kubernetes/triggers/kubernetes_pod.py,sha256=-SIU78sH6N2z9CFya3Id7OYoB-jmcnD8A_ovF8O0jFw,1265
48
+ airflow/providers/cncf/kubernetes/triggers/pod.py,sha256=eu_9tWOWMwlM6jaXr4QiQuvOsdyGFrMDCgNBPgl9IKE,13126
49
49
  airflow/providers/cncf/kubernetes/utils/__init__.py,sha256=ClZN0VPjWySdVwS_ktH7rrgL9VLAcs3OSJSB9s3zaYw,863
50
50
  airflow/providers/cncf/kubernetes/utils/delete_from.py,sha256=poObZSoEJwQyaYWilEURs8f4CDY2sn_pfwS31Lf579A,5195
51
51
  airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py,sha256=-Pgc5i2WEDl7ZBvtJZ4eWDqqlSj8WdULqwUyOWmsRp8,1928
52
52
  airflow/providers/cncf/kubernetes/utils/pod_manager.py,sha256=dKCXMs0vNZrWuzsd65yiaVC834j4PFa-GJ0qr_Q0IT4,33328
53
53
  airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py,sha256=dCLPE-KyI3nVfawcuKMjhxuBuK9TgVZocc4eC82hAM4,2518
54
- apache_airflow_providers_cncf_kubernetes-8.0.0rc2.dist-info/entry_points.txt,sha256=ByD3QJJyP9CfmTYtpNI1953akD38RUDgpGXLaq9vpOw,111
55
- apache_airflow_providers_cncf_kubernetes-8.0.0rc2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
56
- apache_airflow_providers_cncf_kubernetes-8.0.0rc2.dist-info/METADATA,sha256=3q6dYZRrIl3xpPOll4YpEMClfVT4HVCkinrkA_A_vJI,5214
57
- apache_airflow_providers_cncf_kubernetes-8.0.0rc2.dist-info/RECORD,,
54
+ apache_airflow_providers_cncf_kubernetes-8.0.1rc1.dist-info/entry_points.txt,sha256=ByD3QJJyP9CfmTYtpNI1953akD38RUDgpGXLaq9vpOw,111
55
+ apache_airflow_providers_cncf_kubernetes-8.0.1rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
56
+ apache_airflow_providers_cncf_kubernetes-8.0.1rc1.dist-info/METADATA,sha256=Ccgav2OBn6q2MaAnl7uiC_NzRUwaY8feGTzdYTd-Tbk,5214
57
+ apache_airflow_providers_cncf_kubernetes-8.0.1rc1.dist-info/RECORD,,