apache-airflow-providers-cncf-kubernetes 10.4.3__tar.gz → 10.5.0rc1__tar.gz

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.
Files changed (158) hide show
  1. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/PKG-INFO +8 -8
  2. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/README.rst +4 -4
  3. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/changelog.rst +29 -0
  4. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/docs/commits.rst +35 -0
  5. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/index.rst +3 -3
  6. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/operators.rst +35 -1
  7. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/provider.yaml +9 -3
  8. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/pyproject.toml +4 -4
  9. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/__init__.py +3 -3
  10. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/src/airflow/providers/cncf/kubernetes/decorators/kubernetes_cmd.py +123 -0
  11. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/get_provider_info.py +6 -2
  12. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/kubernetes.py +11 -2
  13. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/pod.py +11 -2
  14. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py +54 -13
  15. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/version_compat.py +0 -1
  16. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/system/cncf/kubernetes/example_kubernetes_cmd_decorator.py +76 -0
  17. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes.py +126 -0
  18. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes_cmd.py +390 -0
  19. apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes_commons.py +280 -0
  20. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_pod.py +13 -0
  21. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/utils/test_pod_manager.py +59 -7
  22. apache_airflow_providers_cncf_kubernetes-10.4.3/docs/commits.rst +0 -1537
  23. apache_airflow_providers_cncf_kubernetes-10.4.3/tests/unit/cncf/kubernetes/decorators/test_kubernetes.py +0 -328
  24. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/.latest-doc-only-change.txt +0 -0
  25. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/cli-ref.rst +0 -0
  26. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/conf.py +0 -0
  27. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/configurations-ref.rst +0 -0
  28. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/connections/kubernetes.rst +0 -0
  29. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/arch-diag-kubernetes.png +0 -0
  30. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/arch-diag-kubernetes2.png +0 -0
  31. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/k8s-failed-pod.png +0 -0
  32. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/k8s-happy-path.png +0 -0
  33. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/installing-providers-from-sources.rst +0 -0
  34. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/integration-logos/Kubernetes.png +0 -0
  35. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/integration-logos/Spark-On-Kubernetes.png +0 -0
  36. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/kubernetes_executor.rst +0 -0
  37. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/local_kubernetes_executor.rst +0 -0
  38. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/redirects.txt +0 -0
  39. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/security.rst +0 -0
  40. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/__init__.py +0 -0
  41. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/__init__.py +0 -0
  42. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/__init__.py +0 -0
  43. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/LICENSE +0 -0
  44. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/__init__.py +0 -0
  45. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py +0 -0
  46. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/callbacks.py +0 -0
  47. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/cli/__init__.py +0 -0
  48. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/cli/kubernetes_command.py +0 -0
  49. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/__init__.py +0 -0
  50. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/kubernetes.py +0 -0
  51. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/exceptions.py +0 -0
  52. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/__init__.py +0 -0
  53. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py +0 -0
  54. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py +0 -0
  55. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py +0 -0
  56. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/local_kubernetes_executor.py +0 -0
  57. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/__init__.py +0 -0
  58. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/k8s_model.py +0 -0
  59. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kube_client.py +0 -0
  60. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kube_config.py +0 -0
  61. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/__init__.py +0 -0
  62. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.yaml +0 -0
  63. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_helper_functions.py +0 -0
  64. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/__init__.py +0 -0
  65. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/custom_object_launcher.py +0 -0
  66. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/job.py +0 -0
  67. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/kueue.py +0 -0
  68. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/resource.py +0 -0
  69. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py +0 -0
  70. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_generator.py +0 -0
  71. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py +0 -0
  72. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml +0 -0
  73. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_volume_template.yaml +0 -0
  74. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/git_sync_template.yaml +0 -0
  75. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.jinja2 +0 -0
  76. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.py +0 -0
  77. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/__init__.py +0 -0
  78. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/configmap.py +0 -0
  79. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/env_variable.py +0 -0
  80. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/secret.py +0 -0
  81. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/secret.py +0 -0
  82. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/__init__.py +0 -0
  83. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/spark_kubernetes.py +0 -0
  84. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/template_rendering.py +0 -0
  85. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/__init__.py +0 -0
  86. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/job.py +0 -0
  87. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/pod.py +0 -0
  88. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/__init__.py +0 -0
  89. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/delete_from.py +0 -0
  90. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py +0 -0
  91. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py +0 -0
  92. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/conftest.py +0 -0
  93. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/__init__.py +0 -0
  94. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/__init__.py +0 -0
  95. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/__init__.py +0 -0
  96. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes.py +0 -0
  97. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_async.py +0 -0
  98. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_decorator.py +0 -0
  99. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_job.py +0 -0
  100. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_kueue.py +0 -0
  101. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_resource.py +0 -0
  102. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes.py +0 -0
  103. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes_spark_pi.yaml +0 -0
  104. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/spark_job_template.yaml +0 -0
  105. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/__init__.py +0 -0
  106. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/__init__.py +0 -0
  107. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/__init__.py +0 -0
  108. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/backcompat/__init__.py +0 -0
  109. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/backcompat/test_backwards_compat_converters.py +0 -0
  110. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/cli/__init__.py +0 -0
  111. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/cli/test_kubernetes_command.py +0 -0
  112. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/conftest.py +0 -0
  113. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/__init__.py +0 -0
  114. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/__init__.py +0 -0
  115. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/basic_template.yaml +0 -0
  116. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/kube_config +0 -0
  117. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/__init__.py +0 -0
  118. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base.yaml +0 -0
  119. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base_with_secrets.yaml +0 -0
  120. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/template.yaml +0 -0
  121. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/__init__.py +0 -0
  122. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_template.yaml +0 -0
  123. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.json +0 -0
  124. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.yaml +0 -0
  125. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test_with_no_name_from_config.json +0 -0
  126. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test_with_no_name_from_config.yaml +0 -0
  127. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/decorators/__init__.py +0 -0
  128. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/__init__.py +0 -0
  129. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/test_kubernetes_executor.py +0 -0
  130. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/test_local_kubernetes_executor.py +0 -0
  131. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/hooks/__init__.py +0 -0
  132. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/hooks/test_kubernetes.py +0 -0
  133. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/log_handlers/__init__.py +0 -0
  134. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py +0 -0
  135. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/models/__init__.py +0 -0
  136. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/models/test_secret.py +0 -0
  137. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/__init__.py +0 -0
  138. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_custom_object_launcher.py +0 -0
  139. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_job.py +0 -0
  140. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_kueue.py +0 -0
  141. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_resource.py +0 -0
  142. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_spark_kubernetes.py +0 -0
  143. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/__init__.py +0 -0
  144. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_configmap.py +0 -0
  145. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_env_variable.py +0 -0
  146. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_secret.py +0 -0
  147. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/sensors/__init__.py +0 -0
  148. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/sensors/test_spark_kubernetes.py +0 -0
  149. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_callbacks.py +0 -0
  150. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_client.py +0 -0
  151. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_kubernetes_helper_functions.py +0 -0
  152. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_pod_generator.py +0 -0
  153. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_template_rendering.py +0 -0
  154. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/__init__.py +0 -0
  155. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/test_job.py +0 -0
  156. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/test_pod.py +0 -0
  157. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/utils/__init__.py +0 -0
  158. {apache_airflow_providers_cncf_kubernetes-10.4.3 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/utils/test_k8s_resource_iterator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-cncf-kubernetes
3
- Version: 10.4.3
3
+ Version: 10.5.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>
@@ -21,14 +21,14 @@ Classifier: Programming Language :: Python :: 3.11
21
21
  Classifier: Programming Language :: Python :: 3.12
22
22
  Classifier: Topic :: System :: Monitoring
23
23
  Requires-Dist: aiofiles>=23.2.0
24
- Requires-Dist: apache-airflow>=2.9.0
24
+ Requires-Dist: apache-airflow>=2.10.0rc1
25
25
  Requires-Dist: asgiref>=3.5.2
26
26
  Requires-Dist: cryptography>=41.0.0
27
27
  Requires-Dist: kubernetes>=29.0.0,<=31.0.0
28
28
  Requires-Dist: kubernetes_asyncio>=29.0.0,<=31.0.0
29
29
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
30
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/changelog.html
31
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3
30
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/changelog.html
31
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0
32
32
  Project-URL: Mastodon, https://fosstodon.org/@airflow
33
33
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
34
34
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -59,7 +59,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
59
59
 
60
60
  Package ``apache-airflow-providers-cncf-kubernetes``
61
61
 
62
- Release: ``10.4.3``
62
+ Release: ``10.5.0``
63
63
 
64
64
 
65
65
  `Kubernetes <https://kubernetes.io/>`__
@@ -72,7 +72,7 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
72
72
  are in ``airflow.providers.cncf.kubernetes`` python package.
73
73
 
74
74
  You can find package information and changelog for the provider
75
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/>`_.
75
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/>`_.
76
76
 
77
77
  Installation
78
78
  ------------
@@ -90,7 +90,7 @@ Requirements
90
90
  PIP package Version required
91
91
  ====================== =====================
92
92
  ``aiofiles`` ``>=23.2.0``
93
- ``apache-airflow`` ``>=2.9.0``
93
+ ``apache-airflow`` ``>=2.10.0``
94
94
  ``asgiref`` ``>=3.5.2``
95
95
  ``cryptography`` ``>=41.0.0``
96
96
  ``kubernetes`` ``>=29.0.0,<=31.0.0``
@@ -98,5 +98,5 @@ PIP package Version required
98
98
  ====================== =====================
99
99
 
100
100
  The changelog for the provider package can be found in the
101
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/changelog.html>`_.
101
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/changelog.html>`_.
102
102
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-cncf-kubernetes``
25
25
 
26
- Release: ``10.4.3``
26
+ Release: ``10.5.0``
27
27
 
28
28
 
29
29
  `Kubernetes <https://kubernetes.io/>`__
@@ -36,7 +36,7 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
36
36
  are in ``airflow.providers.cncf.kubernetes`` python package.
37
37
 
38
38
  You can find package information and changelog for the provider
39
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/>`_.
39
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/>`_.
40
40
 
41
41
  Installation
42
42
  ------------
@@ -54,7 +54,7 @@ Requirements
54
54
  PIP package Version required
55
55
  ====================== =====================
56
56
  ``aiofiles`` ``>=23.2.0``
57
- ``apache-airflow`` ``>=2.9.0``
57
+ ``apache-airflow`` ``>=2.10.0``
58
58
  ``asgiref`` ``>=3.5.2``
59
59
  ``cryptography`` ``>=41.0.0``
60
60
  ``kubernetes`` ``>=29.0.0,<=31.0.0``
@@ -62,4 +62,4 @@ PIP package Version required
62
62
  ====================== =====================
63
63
 
64
64
  The changelog for the provider package can be found in the
65
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/changelog.html>`_.
65
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/changelog.html>`_.
@@ -28,6 +28,35 @@ Changelog
28
28
  ---------
29
29
 
30
30
 
31
+ 10.5.0
32
+ ......
33
+
34
+ .. note::
35
+ This release of provider is only available for Airflow 2.10+ as explained in the
36
+ Apache Airflow providers support policy <https://github.com/apache/airflow/blob/main/PROVIDERS.rst#minimum-supported-version-of-airflow-for-community-managed-providers>_.
37
+
38
+ Features
39
+ ~~~~~~~~
40
+
41
+ * ``Add fast fail for ErrImagePull and InvalidImageName for KubernetesPodOperator (#49867)``
42
+ * ``KubernetesPodOperator uses different timeouts to check for schedule timeout and startup timeout (#49784)``
43
+ * ``Add configurable automountServiceAccountToken for the KubernetesPodOperator (#50223)``
44
+ * ``Add 'test_connection' method to 'KubernetesHook' (#47881)``
45
+ * ``Add '@task.kuberenetes_cmd' (#46913)``
46
+
47
+ Misc
48
+ ~~~~
49
+
50
+ * ``Move SQS message queue to Amazon provider (#50057)``
51
+ * ``Remove AIRFLOW_2_10_PLUS conditions (#49877)``
52
+ * ``Bump min Airflow version in providers to 2.10 (#49843)``
53
+
54
+ .. Below changes are excluded from the changelog. Move them to
55
+ appropriate section above if needed. Do not delete the lines(!):
56
+ * ``Update description of provider.yaml dependencies (#50231)``
57
+ * ``Avoid committing history for providers (#49907)``
58
+ * ``capitalize the term airflow (#49450)``
59
+
31
60
  10.4.3
32
61
  ......
33
62
 
@@ -0,0 +1,35 @@
1
+
2
+ .. Licensed to the Apache Software Foundation (ASF) under one
3
+ or more contributor license agreements. See the NOTICE file
4
+ distributed with this work for additional information
5
+ regarding copyright ownership. The ASF licenses this file
6
+ to you under the Apache License, Version 2.0 (the
7
+ "License"); you may not use this file except in compliance
8
+ with the License. You may obtain a copy of the License at
9
+
10
+ .. http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ .. Unless required by applicable law or agreed to in writing,
13
+ software distributed under the License is distributed on an
14
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ KIND, either express or implied. See the License for the
16
+ specific language governing permissions and limitations
17
+ under the License.
18
+
19
+ .. NOTE! THIS FILE IS AUTOMATICALLY GENERATED AND WILL BE OVERWRITTEN!
20
+
21
+ .. IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE
22
+ `PROVIDER_COMMITS_TEMPLATE.rst.jinja2` IN the `dev/breeze/src/airflow_breeze/templates` DIRECTORY
23
+
24
+ .. THE REMAINDER OF THE FILE IS AUTOMATICALLY GENERATED. IT WILL BE OVERWRITTEN!
25
+
26
+ Package apache-airflow-providers-cncf-kubernetes
27
+ ------------------------------------------------------
28
+
29
+ `Kubernetes <https://kubernetes.io/>`__
30
+
31
+
32
+ This is detailed commit list of changes for versions provider package: ``cncf.kubernetes``.
33
+ For high-level changelog, see :doc:`package information including changelog <index>`.
34
+
35
+ .. airflow-providers-commits::
@@ -87,7 +87,7 @@ apache-airflow-providers-cncf-kubernetes package
87
87
  `Kubernetes <https://kubernetes.io/>`__
88
88
 
89
89
 
90
- Release: 10.4.3
90
+ Release: 10.5.0
91
91
 
92
92
  Provider package
93
93
  ----------------
@@ -105,13 +105,13 @@ For the minimum Airflow version supported, see ``Requirements`` below.
105
105
  Requirements
106
106
  ------------
107
107
 
108
- The minimum Apache Airflow version supported by this provider distribution is ``2.9.0``.
108
+ The minimum Apache Airflow version supported by this provider distribution is ``2.10.0``.
109
109
 
110
110
  ====================== =====================
111
111
  PIP package Version required
112
112
  ====================== =====================
113
113
  ``aiofiles`` ``>=23.2.0``
114
- ``apache-airflow`` ``>=2.9.0``
114
+ ``apache-airflow`` ``>=2.10.0``
115
115
  ``asgiref`` ``>=3.5.2``
116
116
  ``cryptography`` ``>=41.0.0``
117
117
  ``kubernetes`` ``>=29.0.0,<=31.0.0``
@@ -182,6 +182,40 @@ Also for this action you can use operator in the deferrable mode:
182
182
  :start-after: [START howto_operator_k8s_write_xcom_async]
183
183
  :end-before: [END howto_operator_k8s_write_xcom_async]
184
184
 
185
+
186
+ Run command in KubernetesPodOperator from TaskFlow
187
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
188
+ With the usage of the ``@task.kubernetes_cmd`` decorator, you can run a command returned by a function
189
+ in a ``KubernetesPodOperator`` simplifying it's connection to the TaskFlow.
190
+
191
+ Difference between ``@task.kubernetes`` and ``@task.kubernetes_cmd``
192
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
193
+ ``@task.kubernetes`` decorator is designed to run a Python function inside a Kubernetes pod using KPO.
194
+ It does this by serializing the function into a temporary Python script that is executed inside the container.
195
+ This is well-suited for cases where you want to isolate Python code execution and manage complex dependencies,
196
+ as described in the :doc:`TaskFlow documentation <apache-airflow:tutorial/taskflow>`.
197
+
198
+ In contrast, ``@task.kubernetes_cmd`` decorator allows the decorated function to return
199
+ a shell command (as a list of strings), which is then passed as cmds or arguments to
200
+ ``KubernetesPodOperator``.
201
+ This enables executing arbitrary commands available inside a Kubernetes pod --
202
+ without needing to wrap it in Python code.
203
+
204
+ A key benefit here is that Python excels at composing and templating these commands.
205
+ Shell commands can be dynamically generated using Python's string formatting, templating,
206
+ extra function calls and logic. This makes it a flexible tool for orchestrating complex pipelines
207
+ where the task is to invoke CLI-based operations in containers without the need to leave
208
+ a TaskFlow context.
209
+
210
+ How does this decorator work?
211
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
212
+ See the following examples on how the decorator works:
213
+
214
+ .. exampleinclude:: /../tests/system/cncf/kubernetes/example_kubernetes_cmd_decorator.py
215
+ :language: python
216
+ :start-after: [START howto_decorator_kubernetes_cmd]
217
+ :end-before: [END howto_decorator_kubernetes_cmd]
218
+
185
219
  Include error message in email alert
186
220
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
187
221
 
@@ -285,7 +319,7 @@ Never use environment variables to pass secrets (for example connection authenti
285
319
  Kubernetes Pod Operator. Such environment variables will be visible to anyone who has access
286
320
  to see and describe PODs in Kubernetes. Instead, pass your secrets via native Kubernetes ``Secrets`` or
287
321
  use Connections and Variables from Airflow. For the latter, you need to have ``apache-airflow`` package
288
- installed in your image in the same version as airflow you run your Kubernetes Pod Operator from).
322
+ installed in your image in the same version as Airflow you run your Kubernetes Pod Operator from).
289
323
 
290
324
  Reference
291
325
  ^^^^^^^^^
@@ -22,9 +22,13 @@ description: |
22
22
  `Kubernetes <https://kubernetes.io/>`__
23
23
 
24
24
  state: ready
25
- source-date-epoch: 1744788926
26
- # note that those versions are maintained by release manager - do not update them manually
25
+ source-date-epoch: 1747132113
26
+ # Note that those versions are maintained by release manager - do not update them manually
27
+ # with the exception of case where other provider in sources has >= new provider version.
28
+ # In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
29
+ # to be done in the same PR
27
30
  versions:
31
+ - 10.5.0
28
32
  - 10.4.3
29
33
  - 10.4.2
30
34
  - 10.4.1
@@ -147,6 +151,8 @@ connection-types:
147
151
  task-decorators:
148
152
  - class-name: airflow.providers.cncf.kubernetes.decorators.kubernetes.kubernetes_task
149
153
  name: kubernetes
154
+ - class-name: airflow.providers.cncf.kubernetes.decorators.kubernetes_cmd.kubernetes_cmd_task
155
+ name: kubernetes_cmd
150
156
 
151
157
  config:
152
158
  local_kubernetes_executor:
@@ -370,4 +376,4 @@ config:
370
376
  default: "0"
371
377
 
372
378
  executors:
373
- - airflow.providers.cncf.kubernetes.kubernetes_executor.KubernetesExecutor
379
+ - airflow.providers.cncf.kubernetes.executors.kubernetes_executor.KubernetesExecutor
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-cncf-kubernetes"
28
- version = "10.4.3"
28
+ version = "10.5.0rc1"
29
29
  description = "Provider package apache-airflow-providers-cncf-kubernetes for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -58,7 +58,7 @@ requires-python = "~=3.9"
58
58
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
59
59
  dependencies = [
60
60
  "aiofiles>=23.2.0",
61
- "apache-airflow>=2.9.0",
61
+ "apache-airflow>=2.10.0rc1",
62
62
  "asgiref>=3.5.2",
63
63
  "cryptography>=41.0.0",
64
64
  # The Kubernetes API is known to introduce problems when upgraded to a MAJOR version. Airflow Core
@@ -112,8 +112,8 @@ apache-airflow-providers-common-sql = {workspace = true}
112
112
  apache-airflow-providers-standard = {workspace = true}
113
113
 
114
114
  [project.urls]
115
- "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3"
116
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.4.3/changelog.html"
115
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0"
116
+ "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.5.0/changelog.html"
117
117
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
118
118
  "Source Code" = "https://github.com/apache/airflow"
119
119
  "Slack Chat" = "https://s.apache.org/airflow-slack"
@@ -29,11 +29,11 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "10.4.3"
32
+ __version__ = "10.5.0"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
- "2.9.0"
35
+ "2.10.0"
36
36
  ):
37
37
  raise RuntimeError(
38
- f"The package `apache-airflow-providers-cncf-kubernetes:{__version__}` needs Apache Airflow 2.9.0+"
38
+ f"The package `apache-airflow-providers-cncf-kubernetes:{__version__}` needs Apache Airflow 2.10.0+"
39
39
  )
@@ -0,0 +1,123 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+ from __future__ import annotations
18
+
19
+ import warnings
20
+ from collections.abc import Sequence
21
+ from typing import TYPE_CHECKING, Callable
22
+
23
+ from airflow.providers.cncf.kubernetes.version_compat import AIRFLOW_V_3_0_PLUS
24
+
25
+ if AIRFLOW_V_3_0_PLUS:
26
+ from airflow.sdk.bases.decorator import DecoratedOperator, TaskDecorator, task_decorator_factory
27
+ else:
28
+ from airflow.decorators.base import ( # type: ignore[no-redef]
29
+ DecoratedOperator,
30
+ TaskDecorator,
31
+ task_decorator_factory,
32
+ )
33
+ from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperator
34
+ from airflow.utils.context import context_merge
35
+ from airflow.utils.operator_helpers import determine_kwargs
36
+
37
+ if TYPE_CHECKING:
38
+ from airflow.utils.context import Context
39
+
40
+
41
+ class _KubernetesCmdDecoratedOperator(DecoratedOperator, KubernetesPodOperator):
42
+ custom_operator_name = "@task.kubernetes_cmd"
43
+
44
+ template_fields: Sequence[str] = KubernetesPodOperator.template_fields
45
+ overwrite_rtif_after_execution: bool = True
46
+
47
+ def __init__(self, *, python_callable: Callable, args_only: bool = False, **kwargs) -> None:
48
+ self.args_only = args_only
49
+
50
+ cmds = kwargs.pop("cmds", None)
51
+ arguments = kwargs.pop("arguments", None)
52
+
53
+ if cmds is not None or arguments is not None:
54
+ warnings.warn(
55
+ f"The `cmds` and `arguments` are unused in {self.custom_operator_name} decorator. "
56
+ "You should return a list of commands or image entrypoint arguments with "
57
+ "args_only=True from the python_callable.",
58
+ UserWarning,
59
+ stacklevel=3,
60
+ )
61
+
62
+ # If the name was not provided, we generate operator name from the python_callable
63
+ # we also instruct operator to add a random suffix to avoid collisions by default
64
+ op_name = kwargs.pop("name", f"k8s-airflow-pod-{python_callable.__name__}")
65
+ random_name_suffix = kwargs.pop("random_name_suffix", True)
66
+
67
+ super().__init__(
68
+ python_callable=python_callable,
69
+ name=op_name,
70
+ random_name_suffix=random_name_suffix,
71
+ cmds=None,
72
+ arguments=None,
73
+ **kwargs,
74
+ )
75
+
76
+ def execute(self, context: Context):
77
+ generated = self._generate_cmds(context)
78
+ if self.args_only:
79
+ self.cmds = []
80
+ self.arguments = generated
81
+ else:
82
+ self.cmds = generated
83
+ self.arguments = []
84
+ context["ti"].render_templates() # type: ignore[attr-defined]
85
+ return super().execute(context)
86
+
87
+ def _generate_cmds(self, context: Context) -> list[str]:
88
+ context_merge(context, self.op_kwargs)
89
+ kwargs = determine_kwargs(self.python_callable, self.op_args, context)
90
+ generated_cmds = self.python_callable(*self.op_args, **kwargs)
91
+ func_name = self.python_callable.__name__
92
+ if not isinstance(generated_cmds, list):
93
+ raise TypeError(
94
+ f"Expected python_callable to return a list of strings, but got {type(generated_cmds)}"
95
+ )
96
+ if not all(isinstance(cmd, str) for cmd in generated_cmds):
97
+ raise TypeError(f"Expected {func_name} to return a list of strings, but got {generated_cmds}")
98
+ if not generated_cmds:
99
+ raise ValueError(f"The {func_name} returned an empty list of commands")
100
+
101
+ return generated_cmds
102
+
103
+
104
+ def kubernetes_cmd_task(
105
+ python_callable: Callable | None = None,
106
+ **kwargs,
107
+ ) -> TaskDecorator:
108
+ """
109
+ Kubernetes cmd operator decorator.
110
+
111
+ This wraps a function which should return command to be executed
112
+ in K8s using KubernetesPodOperator. The function should return a list of strings.
113
+ If args_only is set to True, the function should return a list of arguments for
114
+ container default command. Also accepts any argument that KubernetesPodOperator
115
+ will via ``kwargs``. Can be reused in a single DAG.
116
+
117
+ :param python_callable: Function to decorate
118
+ """
119
+ return task_decorator_factory(
120
+ python_callable=python_callable,
121
+ decorated_operator_class=_KubernetesCmdDecoratedOperator,
122
+ **kwargs,
123
+ )
@@ -85,7 +85,11 @@ def get_provider_info():
85
85
  {
86
86
  "class-name": "airflow.providers.cncf.kubernetes.decorators.kubernetes.kubernetes_task",
87
87
  "name": "kubernetes",
88
- }
88
+ },
89
+ {
90
+ "class-name": "airflow.providers.cncf.kubernetes.decorators.kubernetes_cmd.kubernetes_cmd_task",
91
+ "name": "kubernetes_cmd",
92
+ },
89
93
  ],
90
94
  "config": {
91
95
  "local_kubernetes_executor": {
@@ -275,5 +279,5 @@ def get_provider_info():
275
279
  },
276
280
  },
277
281
  },
278
- "executors": ["airflow.providers.cncf.kubernetes.kubernetes_executor.KubernetesExecutor"],
282
+ "executors": ["airflow.providers.cncf.kubernetes.executors.kubernetes_executor.KubernetesExecutor"],
279
283
  }
@@ -140,7 +140,8 @@ class KubernetesHook(BaseHook, PodOperatorHookProtocol):
140
140
 
141
141
  def __init__(
142
142
  self,
143
- conn_id: str | None = default_conn_name,
143
+ conn_id: str | None = None,
144
+ kubernetes_conn_id: str | None = default_conn_name,
144
145
  client_configuration: client.Configuration | None = None,
145
146
  cluster_context: str | None = None,
146
147
  config_file: str | None = None,
@@ -149,7 +150,7 @@ class KubernetesHook(BaseHook, PodOperatorHookProtocol):
149
150
  disable_tcp_keepalive: bool | None = None,
150
151
  ) -> None:
151
152
  super().__init__()
152
- self.conn_id = conn_id
153
+ self.conn_id = conn_id or kubernetes_conn_id
153
154
  self.client_configuration = client_configuration
154
155
  self.cluster_context = cluster_context
155
156
  self.config_file = config_file
@@ -706,6 +707,14 @@ class KubernetesHook(BaseHook, PodOperatorHookProtocol):
706
707
 
707
708
  return list(yaml.safe_load_all(response.text))
708
709
 
710
+ def test_connection(self):
711
+ try:
712
+ conn = self.get_conn()
713
+ version: client.VersionInfo = client.VersionApi(conn).get_code()
714
+ return True, f"Connection successful. Version Info: {version.to_dict()}"
715
+ except Exception as e:
716
+ return False, str(e)
717
+
709
718
 
710
719
  def _get_bool(val) -> bool | None:
711
720
  """Convert val to bool if can be done with certainty; if we cannot infer intention we return None."""
@@ -157,8 +157,9 @@ class KubernetesPodOperator(BaseOperator):
157
157
  :param reattach_on_restart: if the worker dies while the pod is running, reattach and monitor
158
158
  during the next try. If False, always create a new pod for each try.
159
159
  :param labels: labels to apply to the Pod. (templated)
160
- :param startup_timeout_seconds: timeout in seconds to startup the pod.
160
+ :param startup_timeout_seconds: timeout in seconds to startup the pod after pod was scheduled.
161
161
  :param startup_check_interval_seconds: interval in seconds to check if the pod has already started
162
+ :param schedule_timeout_seconds: timeout in seconds to schedule pod in cluster.
162
163
  :param get_logs: get the stdout of the base container as logs of the tasks.
163
164
  :param init_container_logs: list of init containers whose logs will be published to stdout
164
165
  Takes a sequence of containers, a single container name or True. If True,
@@ -180,6 +181,7 @@ class KubernetesPodOperator(BaseOperator):
180
181
  If more than one secret is required, provide a
181
182
  comma separated list: secret_a,secret_b
182
183
  :param service_account_name: Name of the service account
184
+ :param automount_service_account_token: indicates whether pods running as this service account should have an API token automatically mounted
183
185
  :param hostnetwork: If True enable host networking on the pod.
184
186
  :param host_aliases: A list of host aliases to apply to the containers in the pod.
185
187
  :param tolerations: A list of kubernetes tolerations.
@@ -289,6 +291,7 @@ class KubernetesPodOperator(BaseOperator):
289
291
  reattach_on_restart: bool = True,
290
292
  startup_timeout_seconds: int = 120,
291
293
  startup_check_interval_seconds: int = 5,
294
+ schedule_timeout_seconds: int | None = None,
292
295
  get_logs: bool = True,
293
296
  base_container_name: str | None = None,
294
297
  base_container_status_polling_interval: float = 1,
@@ -302,6 +305,7 @@ class KubernetesPodOperator(BaseOperator):
302
305
  node_selector: dict | None = None,
303
306
  image_pull_secrets: list[k8s.V1LocalObjectReference] | None = None,
304
307
  service_account_name: str | None = None,
308
+ automount_service_account_token: bool = True,
305
309
  hostnetwork: bool = False,
306
310
  host_aliases: list[k8s.V1HostAlias] | None = None,
307
311
  tolerations: list[k8s.V1Toleration] | None = None,
@@ -347,6 +351,8 @@ class KubernetesPodOperator(BaseOperator):
347
351
  self.labels = labels or {}
348
352
  self.startup_timeout_seconds = startup_timeout_seconds
349
353
  self.startup_check_interval_seconds = startup_check_interval_seconds
354
+ # New parameter startup_timeout_seconds adds breaking change, to handle this as smooth as possible just reuse startup time
355
+ self.schedule_timeout_seconds = schedule_timeout_seconds or startup_timeout_seconds
350
356
  env_vars = convert_env_vars(env_vars) if env_vars else []
351
357
  self.env_vars = env_vars
352
358
  pod_runtime_info_envs = (
@@ -380,6 +386,7 @@ class KubernetesPodOperator(BaseOperator):
380
386
  self.config_file = config_file
381
387
  self.image_pull_secrets = convert_image_pull_secrets(image_pull_secrets) if image_pull_secrets else []
382
388
  self.service_account_name = service_account_name
389
+ self.automount_service_account_token = automount_service_account_token
383
390
  self.hostnetwork = hostnetwork
384
391
  self.host_aliases = host_aliases
385
392
  self.tolerations = (
@@ -574,8 +581,9 @@ class KubernetesPodOperator(BaseOperator):
574
581
  try:
575
582
  self.pod_manager.await_pod_start(
576
583
  pod=pod,
584
+ schedule_timeout=self.schedule_timeout_seconds,
577
585
  startup_timeout=self.startup_timeout_seconds,
578
- startup_check_interval=self.startup_check_interval_seconds,
586
+ check_interval=self.startup_check_interval_seconds,
579
587
  )
580
588
  except PodLaunchFailedException:
581
589
  if self.log_events_on_failure:
@@ -1175,6 +1183,7 @@ class KubernetesPodOperator(BaseOperator):
1175
1183
  ],
1176
1184
  image_pull_secrets=self.image_pull_secrets,
1177
1185
  service_account_name=self.service_account_name,
1186
+ automount_service_account_token=self.automount_service_account_token,
1178
1187
  host_network=self.hostnetwork,
1179
1188
  hostname=self.hostname,
1180
1189
  subdomain=self.subdomain,
@@ -46,8 +46,11 @@ from airflow.utils.timezone import utcnow
46
46
 
47
47
  if TYPE_CHECKING:
48
48
  from kubernetes.client.models.core_v1_event_list import CoreV1EventList
49
+ from kubernetes.client.models.v1_container_state import V1ContainerState
50
+ from kubernetes.client.models.v1_container_state_waiting import V1ContainerStateWaiting
49
51
  from kubernetes.client.models.v1_container_status import V1ContainerStatus
50
52
  from kubernetes.client.models.v1_pod import V1Pod
53
+ from kubernetes.client.models.v1_pod_condition import V1PodCondition
51
54
  from urllib3.response import HTTPResponse
52
55
 
53
56
 
@@ -375,30 +378,68 @@ class PodManager(LoggingMixin):
375
378
  return self.run_pod_async(pod)
376
379
 
377
380
  def await_pod_start(
378
- self, pod: V1Pod, startup_timeout: int = 120, startup_check_interval: int = 1
381
+ self, pod: V1Pod, schedule_timeout: int = 120, startup_timeout: int = 120, check_interval: int = 1
379
382
  ) -> None:
380
383
  """
381
384
  Wait for the pod to reach phase other than ``Pending``.
382
385
 
383
386
  :param pod:
387
+ :param schedule_timeout: Timeout (in seconds) for pod stay in schedule state
388
+ (if pod is taking to long in schedule state, fails task)
384
389
  :param startup_timeout: Timeout (in seconds) for startup of the pod
385
- (if pod is pending for too long, fails task)
386
- :param startup_check_interval: Interval (in seconds) between checks
390
+ (if pod is pending for too long after being scheduled, fails task)
391
+ :param check_interval: Interval (in seconds) between checks
387
392
  :return:
388
393
  """
389
- curr_time = time.time()
394
+ self.log.info("::group::Waiting until %ss to get the POD scheduled...", schedule_timeout)
395
+ pod_was_scheduled = False
396
+ start_check_time = time.time()
390
397
  while True:
391
398
  remote_pod = self.read_pod(pod)
392
- if remote_pod.status.phase != PodPhase.PENDING:
399
+ pod_status = remote_pod.status
400
+ if pod_status.phase != PodPhase.PENDING:
401
+ self.keep_watching_for_events = False
402
+ self.log.info("::endgroup::")
393
403
  break
394
- self.log.warning("Pod not yet started: %s", pod.metadata.name)
395
- if time.time() - curr_time >= startup_timeout:
396
- msg = (
397
- f"Pod took longer than {startup_timeout} seconds to start. "
398
- "Check the pod events in kubernetes to determine why."
399
- )
400
- raise PodLaunchFailedException(msg)
401
- time.sleep(startup_check_interval)
404
+
405
+ # Check for timeout
406
+ pod_conditions: list[V1PodCondition] = pod_status.conditions
407
+ if pod_conditions and any(
408
+ (condition.type == "PodScheduled" and condition.status == "True")
409
+ for condition in pod_conditions
410
+ ):
411
+ if not pod_was_scheduled:
412
+ # POD was initially scheduled update timeout for getting POD launched
413
+ pod_was_scheduled = True
414
+ start_check_time = time.time()
415
+ self.log.info("Waiting %ss to get the POD running...", startup_timeout)
416
+
417
+ if time.time() - start_check_time >= startup_timeout:
418
+ self.log.info("::endgroup::")
419
+ raise PodLaunchFailedException(
420
+ f"Pod took too long to start. More than {startup_timeout}s. Check the pod events in kubernetes."
421
+ )
422
+ else:
423
+ if time.time() - start_check_time >= schedule_timeout:
424
+ self.log.info("::endgroup::")
425
+ raise PodLaunchFailedException(
426
+ f"Pod took too long to be scheduled on the cluster, giving up. More than {schedule_timeout}s. Check the pod events in kubernetes."
427
+ )
428
+
429
+ # Check for general problems to terminate early - ErrImagePull
430
+ if pod_status.container_statuses:
431
+ for container_status in pod_status.container_statuses:
432
+ container_state: V1ContainerState = container_status.state
433
+ container_waiting: V1ContainerStateWaiting | None = container_state.waiting
434
+ if container_waiting:
435
+ if container_waiting.reason in ["ErrImagePull", "InvalidImageName"]:
436
+ self.log.info("::endgroup::")
437
+ raise PodLaunchFailedException(
438
+ f"Pod docker image cannot be pulled, unable to start: {container_waiting.reason}"
439
+ f"\n{container_waiting.message}"
440
+ )
441
+
442
+ time.sleep(check_interval)
402
443
 
403
444
  def fetch_container_logs(
404
445
  self,