apache-airflow-providers-cncf-kubernetes 10.7.0__tar.gz → 10.8.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.
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/PKG-INFO +8 -9
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/README.rst +4 -5
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/changelog.rst +45 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/index.rst +3 -5
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/kubernetes_executor.rst +13 -13
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/operators.rst +1 -1
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/provider.yaml +2 -1
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/pyproject.toml +5 -5
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/__init__.py +1 -1
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/cli/kubernetes_command.py +8 -4
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/kubernetes_cmd.py +1 -1
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py +80 -30
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py +50 -10
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py +200 -30
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/kueue.py +17 -2
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/pod.py +52 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py +69 -17
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/version_compat.py +3 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/decorators/test_kubernetes.py +2 -2
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/decorators/test_kubernetes_cmd.py +9 -9
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/decorators/test_kubernetes_commons.py +7 -9
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/executors/test_kubernetes_executor.py +72 -18
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/hooks/test_kubernetes.py +5 -7
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py +13 -11
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_job.py +19 -17
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_kueue.py +23 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_pod.py +61 -15
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_spark_kubernetes.py +5 -2
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/test_template_rendering.py +27 -35
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/cli-ref.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/commits.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/conf.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/configurations-ref.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/connections/kubernetes.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/img/arch-diag-kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/img/arch-diag-kubernetes2.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/img/k8s-failed-pod.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/img/k8s-happy-path.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/integration-logos/Kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/integration-logos/Spark-On-Kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/local_kubernetes_executor.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/redirects.txt +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/docs/security.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/LICENSE +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/callbacks.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/cli/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/exceptions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/executors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/executors/local_kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/get_provider_info.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/k8s_model.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/kube_client.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/kube_config.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_helper_functions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/custom_object_launcher.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/pod_generator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_volume_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/git_sync_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.jinja2 +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/configmap.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/env_variable.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/template_rendering.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/pod.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/utils/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/utils/delete_from.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/src/airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/conftest.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_async.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_cmd_decorator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_decorator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_kueue.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes_spark_pi.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/system/cncf/kubernetes/spark_job_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/backcompat/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/backcompat/test_backwards_compat_converters.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/cli/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/cli/test_kubernetes_command.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/conftest.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/basic_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/kube_config +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base_with_secrets.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.json +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test_with_no_name_from_config.json +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test_with_no_name_from_config.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/decorators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/executors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/executors/test_local_kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/hooks/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/log_handlers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/models/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/models/test_secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_custom_object_launcher.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/operators/test_resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/resource_convert/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_configmap.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_env_variable.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/sensors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/sensors/test_spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/test_callbacks.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/test_client.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/test_kubernetes_helper_functions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/test_pod_generator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/triggers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/triggers/test_job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/triggers/test_pod.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/utils/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/utils/test_k8s_resource_iterator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.7.0 → apache_airflow_providers_cncf_kubernetes-10.8.0rc1}/tests/unit/cncf/kubernetes/utils/test_pod_manager.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: apache-airflow-providers-cncf-kubernetes
|
3
|
-
Version: 10.
|
3
|
+
Version: 10.8.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.12
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.13
|
22
22
|
Classifier: Topic :: System :: Monitoring
|
23
23
|
Requires-Dist: aiofiles>=23.2.0
|
24
|
-
Requires-Dist: apache-airflow>=2.10.
|
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>=32.0.0,<33.0.0
|
28
28
|
Requires-Dist: kubernetes_asyncio>=32.0.0,<33.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.
|
31
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
30
|
+
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/changelog.html
|
31
|
+
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.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,9 +59,8 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
|
|
59
59
|
|
60
60
|
Package ``apache-airflow-providers-cncf-kubernetes``
|
61
61
|
|
62
|
-
Release: ``10.
|
62
|
+
Release: ``10.8.0``
|
63
63
|
|
64
|
-
Release Date: ``|PypiReleaseDate|``
|
65
64
|
|
66
65
|
`Kubernetes <https://kubernetes.io/>`__
|
67
66
|
|
@@ -73,12 +72,12 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
|
|
73
72
|
are in ``airflow.providers.cncf.kubernetes`` python package.
|
74
73
|
|
75
74
|
You can find package information and changelog for the provider
|
76
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
75
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/>`_.
|
77
76
|
|
78
77
|
Installation
|
79
78
|
------------
|
80
79
|
|
81
|
-
You can install this package on top of an existing Airflow
|
80
|
+
You can install this package on top of an existing Airflow installation (see ``Requirements`` below
|
82
81
|
for the minimum Airflow version supported) via
|
83
82
|
``pip install apache-airflow-providers-cncf-kubernetes``
|
84
83
|
|
@@ -99,5 +98,5 @@ PIP package Version required
|
|
99
98
|
====================== ====================
|
100
99
|
|
101
100
|
The changelog for the provider package can be found in the
|
102
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
101
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/changelog.html>`_.
|
103
102
|
|
@@ -23,9 +23,8 @@
|
|
23
23
|
|
24
24
|
Package ``apache-airflow-providers-cncf-kubernetes``
|
25
25
|
|
26
|
-
Release: ``10.
|
26
|
+
Release: ``10.8.0``
|
27
27
|
|
28
|
-
Release Date: ``|PypiReleaseDate|``
|
29
28
|
|
30
29
|
`Kubernetes <https://kubernetes.io/>`__
|
31
30
|
|
@@ -37,12 +36,12 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
|
|
37
36
|
are in ``airflow.providers.cncf.kubernetes`` python package.
|
38
37
|
|
39
38
|
You can find package information and changelog for the provider
|
40
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/>`_.
|
41
40
|
|
42
41
|
Installation
|
43
42
|
------------
|
44
43
|
|
45
|
-
You can install this package on top of an existing Airflow
|
44
|
+
You can install this package on top of an existing Airflow installation (see ``Requirements`` below
|
46
45
|
for the minimum Airflow version supported) via
|
47
46
|
``pip install apache-airflow-providers-cncf-kubernetes``
|
48
47
|
|
@@ -63,4 +62,4 @@ PIP package Version required
|
|
63
62
|
====================== ====================
|
64
63
|
|
65
64
|
The changelog for the provider package can be found in the
|
66
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
65
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/changelog.html>`_.
|
@@ -28,6 +28,51 @@ Changelog
|
|
28
28
|
---------
|
29
29
|
|
30
30
|
|
31
|
+
10.8.0
|
32
|
+
......
|
33
|
+
|
34
|
+
|
35
|
+
Release Date: ``|PypiReleaseDate|``
|
36
|
+
|
37
|
+
Features
|
38
|
+
~~~~~~~~
|
39
|
+
|
40
|
+
* ``Add customizable log prefix and formatter to KubernetesPodOperator (#53598)``
|
41
|
+
* ``Enhanced Pod Failure Logging in KubernetesExecutor (#54115)``
|
42
|
+
|
43
|
+
Bug Fixes
|
44
|
+
~~~~~~~~~
|
45
|
+
|
46
|
+
* ``fix: Handle Kubernetes API responses with non-JSON bodies (#55107)``
|
47
|
+
* ``Fix KubernetesExecutor retry on 409 conflict (#54777)``
|
48
|
+
* ``KubernetesPodOperator logs pod and container state after error occurred (#54828)``
|
49
|
+
* ``Throttle HTTPError during consume pod logs (#54761)``
|
50
|
+
|
51
|
+
Misc
|
52
|
+
~~~~
|
53
|
+
|
54
|
+
* ``Remove airflow.models.DAG (#54383)``
|
55
|
+
* ``Refactor Kubernetes Executor Types to NamedTuples (#54858)``
|
56
|
+
* ``Move some items in 'airflow.utils.context' to appropriate places (#53600)``
|
57
|
+
|
58
|
+
Doc-only
|
59
|
+
~~~~~~~~
|
60
|
+
|
61
|
+
* ``Make term Dag consistent in providers docs (#55101)``
|
62
|
+
|
63
|
+
.. Below changes are excluded from the changelog. Move them to
|
64
|
+
appropriate section above if needed. Do not delete the lines(!):
|
65
|
+
* ``Remove Legacy Query Object Usage from airflow-models (#52325)``
|
66
|
+
* ``Fix k8s pod yaml test to expect redacted sensitive data (#54883)``
|
67
|
+
* ``Move secrets_masker over to airflow_shared distribution (#54449)``
|
68
|
+
* ``Replace API server's direct Connection access workaround in BaseHook (#54083)``
|
69
|
+
* ``Switch pre-commit to prek (#54258)``
|
70
|
+
* ``make bundle_name not nullable (#47592)``
|
71
|
+
* ``Bump pytest-asyncio to 1.1.0 (#54123)``
|
72
|
+
|
73
|
+
.. Review and move the new changes to one of the sections above:
|
74
|
+
* ``Fix Airflow 2 reference in README/index of providers (#55240)``
|
75
|
+
|
31
76
|
10.7.0
|
32
77
|
......
|
33
78
|
|
@@ -66,7 +66,7 @@
|
|
66
66
|
:maxdepth: 1
|
67
67
|
:caption: Resources
|
68
68
|
|
69
|
-
Example
|
69
|
+
Example Dags <https://github.com/apache/airflow/tree/providers-cncf-kubernetes/|version|/providers/cncf/kubernetes/tests/system/cncf/kubernetes>
|
70
70
|
PyPI Repository <https://pypi.org/project/apache-airflow-providers-cncf-kubernetes/>
|
71
71
|
Installing from sources <installing-providers-from-sources>
|
72
72
|
|
@@ -87,9 +87,7 @@ apache-airflow-providers-cncf-kubernetes package
|
|
87
87
|
`Kubernetes <https://kubernetes.io/>`__
|
88
88
|
|
89
89
|
|
90
|
-
Release: 10.
|
91
|
-
|
92
|
-
Release Date: ``|PypiReleaseDate|``
|
90
|
+
Release: 10.8.0
|
93
91
|
|
94
92
|
Provider package
|
95
93
|
----------------
|
@@ -100,7 +98,7 @@ All classes for this package are included in the ``airflow.providers.cncf.kubern
|
|
100
98
|
Installation
|
101
99
|
------------
|
102
100
|
|
103
|
-
You can install this package on top of an existing Airflow
|
101
|
+
You can install this package on top of an existing Airflow installation via
|
104
102
|
``pip install apache-airflow-providers-cncf-kubernetes``.
|
105
103
|
For the minimum Airflow version supported, see ``Requirements`` below.
|
106
104
|
|
@@ -36,7 +36,7 @@ not necessarily need to be running on Kubernetes, but does need access to a Kube
|
|
36
36
|
|
37
37
|
KubernetesExecutor requires a non-sqlite database in the backend.
|
38
38
|
|
39
|
-
When a
|
39
|
+
When a Dag submits a task, the KubernetesExecutor requests a worker pod from the Kubernetes API. The worker pod then runs the task, reports the result, and terminates.
|
40
40
|
|
41
41
|
.. image:: img/arch-diag-kubernetes.png
|
42
42
|
|
@@ -45,7 +45,7 @@ One example of an Airflow deployment running on a distributed set of five nodes
|
|
45
45
|
|
46
46
|
.. image:: img/arch-diag-kubernetes2.png
|
47
47
|
|
48
|
-
Consistent with the regular Airflow architecture, the Workers need access to the
|
48
|
+
Consistent with the regular Airflow architecture, the Workers need access to the Dag files to execute the tasks within those Dags and interact with the Metadata repository. Also, configuration information specific to the Kubernetes Executor, such as the worker namespace and image information, needs to be specified in the Airflow Configuration file.
|
49
49
|
|
50
50
|
Additionally, the Kubernetes Executor enables specification of additional features on a per-task basis using the Executor config.
|
51
51
|
|
@@ -103,24 +103,24 @@ With these requirements in mind, here are some examples of basic ``pod_template_
|
|
103
103
|
|
104
104
|
The examples below should work when using default Airflow configuration values. However, many custom
|
105
105
|
configuration values need to be explicitly passed to the pod via this template too. This includes,
|
106
|
-
but is not limited to, sql configuration, required Airflow connections,
|
106
|
+
but is not limited to, sql configuration, required Airflow connections, Dags folder path and
|
107
107
|
logging settings. See :doc:`../../configurations-ref` for details.
|
108
108
|
|
109
|
-
Storing
|
109
|
+
Storing Dags in the image:
|
110
110
|
|
111
111
|
.. literalinclude:: /../src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml
|
112
112
|
:language: yaml
|
113
113
|
:start-after: [START template_with_dags_in_image]
|
114
114
|
:end-before: [END template_with_dags_in_image]
|
115
115
|
|
116
|
-
Storing
|
116
|
+
Storing Dags in a ``persistentVolume``:
|
117
117
|
|
118
118
|
.. literalinclude:: /../src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_volume_template.yaml
|
119
119
|
:language: yaml
|
120
120
|
:start-after: [START template_with_dags_in_volume]
|
121
121
|
:end-before: [END template_with_dags_in_volume]
|
122
122
|
|
123
|
-
Pulling
|
123
|
+
Pulling Dags from ``git``:
|
124
124
|
|
125
125
|
.. literalinclude:: /../src/airflow/providers/cncf/kubernetes/pod_template_file_examples/git_sync_template.yaml
|
126
126
|
:language: yaml
|
@@ -165,14 +165,14 @@ Here is an example of a task with both features:
|
|
165
165
|
|
166
166
|
import pendulum
|
167
167
|
|
168
|
-
from airflow import
|
168
|
+
from airflow import Dag
|
169
169
|
from airflow.decorators import task
|
170
170
|
from airflow.example_dags.libs.helper import print_stuff
|
171
171
|
from airflow.settings import AIRFLOW_HOME
|
172
172
|
|
173
173
|
from kubernetes.client import models as k8s
|
174
174
|
|
175
|
-
with
|
175
|
+
with Dag(
|
176
176
|
dag_id="example_pod_template_file",
|
177
177
|
schedule=None,
|
178
178
|
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
|
@@ -189,18 +189,18 @@ Here is an example of a task with both features:
|
|
189
189
|
print_stuff()
|
190
190
|
|
191
191
|
|
192
|
-
Managing
|
192
|
+
Managing Dags and logs
|
193
193
|
~~~~~~~~~~~~~~~~~~~~~~
|
194
194
|
|
195
195
|
Use of persistent volumes is optional and depends on your configuration.
|
196
196
|
|
197
197
|
- **Dags**:
|
198
198
|
|
199
|
-
To get the
|
199
|
+
To get the Dags into the workers, you can:
|
200
200
|
|
201
|
-
- Include
|
202
|
-
- Use ``git-sync`` which, before starting the worker container, will run a ``git pull`` of the
|
203
|
-
- Storing
|
201
|
+
- Include Dags in the image.
|
202
|
+
- Use ``git-sync`` which, before starting the worker container, will run a ``git pull`` of the Dags repository.
|
203
|
+
- Storing Dags on a persistent volume, which can be mounted on all workers.
|
204
204
|
|
205
205
|
- **Logs**:
|
206
206
|
|
@@ -111,7 +111,7 @@ Difference between ``KubernetesPodOperator`` and Kubernetes object spec
|
|
111
111
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
112
112
|
The :class:`~airflow.providers.cncf.kubernetes.operators.pod.KubernetesPodOperator` can be considered
|
113
113
|
a substitute for a Kubernetes object spec definition that is able
|
114
|
-
to be run in the Airflow scheduler in the
|
114
|
+
to be run in the Airflow scheduler in the Dag context. If using the operator, there is no need to create the
|
115
115
|
equivalent YAML/JSON object spec for the Pod you would like to run.
|
116
116
|
The YAML file can still be provided with the ``pod_template_file`` or even the Pod Spec constructed in Python via
|
117
117
|
the ``full_pod_spec`` parameter which requires a Kubernetes ``V1Pod``.
|
@@ -22,12 +22,13 @@ description: |
|
|
22
22
|
`Kubernetes <https://kubernetes.io/>`__
|
23
23
|
|
24
24
|
state: ready
|
25
|
-
source-date-epoch:
|
25
|
+
source-date-epoch: 1756876671
|
26
26
|
# Note that those versions are maintained by release manager - do not update them manually
|
27
27
|
# with the exception of case where other provider in sources has >= new provider version.
|
28
28
|
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
29
29
|
# to be done in the same PR
|
30
30
|
versions:
|
31
|
+
- 10.8.0
|
31
32
|
- 10.7.0
|
32
33
|
- 10.6.2
|
33
34
|
- 10.6.1
|
@@ -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.
|
28
|
+
version = "10.8.0rc1"
|
29
29
|
description = "Provider package apache-airflow-providers-cncf-kubernetes for Apache Airflow"
|
30
30
|
readme = "README.rst"
|
31
31
|
authors = [
|
@@ -54,11 +54,11 @@ requires-python = ">=3.10"
|
|
54
54
|
|
55
55
|
# The dependencies should be modified in place in the generated file.
|
56
56
|
# Any change in the dependencies is preserved when the file is regenerated
|
57
|
-
# Make sure to run ``
|
57
|
+
# Make sure to run ``prek update-providers-dependencies --all-files``
|
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.10.
|
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
|
@@ -108,8 +108,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
108
108
|
apache-airflow-providers-standard = {workspace = true}
|
109
109
|
|
110
110
|
[project.urls]
|
111
|
-
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
112
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
111
|
+
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0"
|
112
|
+
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.8.0/changelog.html"
|
113
113
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
114
114
|
"Source Code" = "https://github.com/apache/airflow"
|
115
115
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
29
29
|
|
30
30
|
__all__ = ["__version__"]
|
31
31
|
|
32
|
-
__version__ = "10.
|
32
|
+
__version__ = "10.8.0"
|
33
33
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
35
35
|
"2.10.0"
|
@@ -32,12 +32,16 @@ from airflow.providers.cncf.kubernetes.executors.kubernetes_executor import Kube
|
|
32
32
|
from airflow.providers.cncf.kubernetes.kube_client import get_kube_client
|
33
33
|
from airflow.providers.cncf.kubernetes.kubernetes_helper_functions import create_unique_id
|
34
34
|
from airflow.providers.cncf.kubernetes.pod_generator import PodGenerator, generate_pod_command_args
|
35
|
-
from airflow.providers.cncf.kubernetes.version_compat import AIRFLOW_V_3_0_PLUS
|
35
|
+
from airflow.providers.cncf.kubernetes.version_compat import AIRFLOW_V_3_0_PLUS, AIRFLOW_V_3_1_PLUS
|
36
36
|
from airflow.utils import cli as cli_utils, yaml
|
37
|
-
from airflow.utils.cli import get_dag
|
38
37
|
from airflow.utils.providers_configuration_loader import providers_configuration_loaded
|
39
38
|
from airflow.utils.types import DagRunType
|
40
39
|
|
40
|
+
if AIRFLOW_V_3_1_PLUS:
|
41
|
+
from airflow.utils.cli import get_bagged_dag
|
42
|
+
else:
|
43
|
+
from airflow.utils.cli import get_dag as get_bagged_dag # type: ignore[attr-defined,no-redef]
|
44
|
+
|
41
45
|
|
42
46
|
@cli_utils.action_cli
|
43
47
|
@providers_configuration_loaded
|
@@ -45,9 +49,9 @@ def generate_pod_yaml(args):
|
|
45
49
|
"""Generate yaml files for each task in the DAG. Used for testing output of KubernetesExecutor."""
|
46
50
|
logical_date = args.logical_date if AIRFLOW_V_3_0_PLUS else args.execution_date
|
47
51
|
if AIRFLOW_V_3_0_PLUS:
|
48
|
-
dag =
|
52
|
+
dag = get_bagged_dag(bundle_names=args.bundle_name, dag_id=args.dag_id)
|
49
53
|
else:
|
50
|
-
dag =
|
54
|
+
dag = get_bagged_dag(subdir=args.subdir, dag_id=args.dag_id)
|
51
55
|
yaml_output_path = args.output_path
|
52
56
|
|
53
57
|
dm = DagModel(dag_id=dag.dag_id)
|
@@ -24,9 +24,9 @@ from airflow.providers.cncf.kubernetes.operators.pod import KubernetesPodOperato
|
|
24
24
|
from airflow.providers.cncf.kubernetes.version_compat import (
|
25
25
|
DecoratedOperator,
|
26
26
|
TaskDecorator,
|
27
|
+
context_merge,
|
27
28
|
task_decorator_factory,
|
28
29
|
)
|
29
|
-
from airflow.utils.context import context_merge
|
30
30
|
from airflow.utils.operator_helpers import determine_kwargs
|
31
31
|
|
32
32
|
if TYPE_CHECKING:
|
@@ -66,6 +66,8 @@ from airflow.providers.cncf.kubernetes.exceptions import PodMutationHookExceptio
|
|
66
66
|
from airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types import (
|
67
67
|
ADOPTED,
|
68
68
|
POD_EXECUTOR_DONE_KEY,
|
69
|
+
KubernetesJob,
|
70
|
+
KubernetesResults,
|
69
71
|
)
|
70
72
|
from airflow.providers.cncf.kubernetes.kube_config import KubeConfig
|
71
73
|
from airflow.providers.cncf.kubernetes.kubernetes_helper_functions import annotations_to_key
|
@@ -85,10 +87,6 @@ if TYPE_CHECKING:
|
|
85
87
|
from airflow.executors import workloads
|
86
88
|
from airflow.models.taskinstance import TaskInstance
|
87
89
|
from airflow.models.taskinstancekey import TaskInstanceKey
|
88
|
-
from airflow.providers.cncf.kubernetes.executors.kubernetes_executor_types import (
|
89
|
-
KubernetesJobType,
|
90
|
-
KubernetesResultsType,
|
91
|
-
)
|
92
90
|
from airflow.providers.cncf.kubernetes.executors.kubernetes_executor_utils import (
|
93
91
|
AirflowKubernetesScheduler,
|
94
92
|
)
|
@@ -156,8 +154,8 @@ class KubernetesExecutor(BaseExecutor):
|
|
156
154
|
def __init__(self):
|
157
155
|
self.kube_config = KubeConfig()
|
158
156
|
self._manager = multiprocessing.Manager()
|
159
|
-
self.task_queue: Queue[
|
160
|
-
self.result_queue: Queue[
|
157
|
+
self.task_queue: Queue[KubernetesJob] = self._manager.Queue()
|
158
|
+
self.result_queue: Queue[KubernetesResults] = self._manager.Queue()
|
161
159
|
self.kube_scheduler: AirflowKubernetesScheduler | None = None
|
162
160
|
self.kube_client: client.CoreV1Api | None = None
|
163
161
|
self.scheduler_job_id: str | None = None
|
@@ -279,7 +277,7 @@ class KubernetesExecutor(BaseExecutor):
|
|
279
277
|
else:
|
280
278
|
pod_template_file = None
|
281
279
|
self.event_buffer[key] = (TaskInstanceState.QUEUED, self.scheduler_job_id)
|
282
|
-
self.task_queue.put((key, command, kube_executor_config, pod_template_file))
|
280
|
+
self.task_queue.put(KubernetesJob(key, command, kube_executor_config, pod_template_file))
|
283
281
|
# We keep a temporary local record that we've handled this so we don't
|
284
282
|
# try and remove it from the QUEUED state while we process it
|
285
283
|
self.last_handled[key] = time.time()
|
@@ -330,17 +328,16 @@ class KubernetesExecutor(BaseExecutor):
|
|
330
328
|
while True:
|
331
329
|
results = self.result_queue.get_nowait()
|
332
330
|
try:
|
333
|
-
|
334
|
-
|
335
|
-
self.log.info("Changing state of %s to %s", results, state)
|
331
|
+
last_resource_version[results.namespace] = results.resource_version
|
332
|
+
self.log.info("Changing state of %s to %s", results, results.state)
|
336
333
|
try:
|
337
|
-
self._change_state(
|
334
|
+
self._change_state(results)
|
338
335
|
except Exception as e:
|
339
336
|
self.log.exception(
|
340
337
|
"Exception: %s when attempting to change state of %s to %s, re-queueing.",
|
341
338
|
e,
|
342
339
|
results,
|
343
|
-
state,
|
340
|
+
results.state,
|
344
341
|
)
|
345
342
|
self.result_queue.put(results)
|
346
343
|
finally:
|
@@ -361,7 +358,7 @@ class KubernetesExecutor(BaseExecutor):
|
|
361
358
|
task = self.task_queue.get_nowait()
|
362
359
|
|
363
360
|
try:
|
364
|
-
key
|
361
|
+
key = task.key
|
365
362
|
self.kube_scheduler.run_next(task)
|
366
363
|
self.task_publish_retries.pop(key, None)
|
367
364
|
except PodReconciliationError as e:
|
@@ -371,31 +368,41 @@ class KubernetesExecutor(BaseExecutor):
|
|
371
368
|
)
|
372
369
|
self.fail(task[0], e)
|
373
370
|
except ApiException as e:
|
374
|
-
|
371
|
+
try:
|
372
|
+
if e.body:
|
373
|
+
body = json.loads(e.body)
|
374
|
+
else:
|
375
|
+
# If no body content, use reason as the message
|
376
|
+
body = {"message": e.reason}
|
377
|
+
except (json.JSONDecodeError, ValueError, TypeError):
|
378
|
+
# If the body is a string (e.g., in a 429 error), it can't be parsed as JSON.
|
379
|
+
# Use the body directly as the message instead.
|
380
|
+
body = {"message": e.body}
|
381
|
+
|
375
382
|
retries = self.task_publish_retries[key]
|
376
|
-
# In case of exceeded quota errors, requeue the task as per the task_publish_max_retries
|
383
|
+
# In case of exceeded quota or conflict errors, requeue the task as per the task_publish_max_retries
|
384
|
+
message = body.get("message", "")
|
377
385
|
if (
|
378
|
-
str(e.status) == "403"
|
379
|
-
and "
|
380
|
-
|
381
|
-
):
|
386
|
+
(str(e.status) == "403" and "exceeded quota" in message)
|
387
|
+
or (str(e.status) == "409" and "object has been modified" in message)
|
388
|
+
) and (self.task_publish_max_retries == -1 or retries < self.task_publish_max_retries):
|
382
389
|
self.log.warning(
|
383
390
|
"[Try %s of %s] Kube ApiException for Task: (%s). Reason: %r. Message: %s",
|
384
391
|
self.task_publish_retries[key] + 1,
|
385
392
|
self.task_publish_max_retries,
|
386
393
|
key,
|
387
394
|
e.reason,
|
388
|
-
|
395
|
+
message,
|
389
396
|
)
|
390
397
|
self.task_queue.put(task)
|
391
398
|
self.task_publish_retries[key] = retries + 1
|
392
399
|
else:
|
393
400
|
self.log.error("Pod creation failed with reason %r. Failing task", e.reason)
|
394
|
-
key
|
401
|
+
key = task.key
|
395
402
|
self.fail(key, e)
|
396
403
|
self.task_publish_retries.pop(key, None)
|
397
404
|
except PodMutationHookException as e:
|
398
|
-
key
|
405
|
+
key = task.key
|
399
406
|
self.log.error(
|
400
407
|
"Pod Mutation Hook failed for the task %s. Failing task. Details: %s",
|
401
408
|
key,
|
@@ -408,15 +415,56 @@ class KubernetesExecutor(BaseExecutor):
|
|
408
415
|
@provide_session
|
409
416
|
def _change_state(
|
410
417
|
self,
|
411
|
-
|
412
|
-
state: TaskInstanceState | str | None,
|
413
|
-
pod_name: str,
|
414
|
-
namespace: str,
|
418
|
+
results: KubernetesResults,
|
415
419
|
session: Session = NEW_SESSION,
|
416
420
|
) -> None:
|
421
|
+
"""Change state of the task based on KubernetesResults."""
|
417
422
|
if TYPE_CHECKING:
|
418
423
|
assert self.kube_scheduler
|
419
424
|
|
425
|
+
key = results.key
|
426
|
+
state = results.state
|
427
|
+
pod_name = results.pod_name
|
428
|
+
namespace = results.namespace
|
429
|
+
failure_details = results.failure_details
|
430
|
+
|
431
|
+
if state == TaskInstanceState.FAILED:
|
432
|
+
# Use pre-collected failure details from the watcher to avoid additional API calls
|
433
|
+
if failure_details:
|
434
|
+
pod_status = failure_details.get("pod_status")
|
435
|
+
pod_reason = failure_details.get("pod_reason")
|
436
|
+
pod_message = failure_details.get("pod_message")
|
437
|
+
container_state = failure_details.get("container_state")
|
438
|
+
container_reason = failure_details.get("container_reason")
|
439
|
+
container_message = failure_details.get("container_message")
|
440
|
+
exit_code = failure_details.get("exit_code")
|
441
|
+
container_type = failure_details.get("container_type")
|
442
|
+
container_name = failure_details.get("container_name")
|
443
|
+
|
444
|
+
task_key_str = f"{key.dag_id}.{key.task_id}.{key.try_number}"
|
445
|
+
self.log.warning(
|
446
|
+
"Task %s failed in pod %s/%s. Pod phase: %s, reason: %s, message: %s, "
|
447
|
+
"container_type: %s, container_name: %s, container_state: %s, container_reason: %s, "
|
448
|
+
"container_message: %s, exit_code: %s",
|
449
|
+
task_key_str,
|
450
|
+
namespace,
|
451
|
+
pod_name,
|
452
|
+
pod_status,
|
453
|
+
pod_reason,
|
454
|
+
pod_message,
|
455
|
+
container_type,
|
456
|
+
container_name,
|
457
|
+
container_state,
|
458
|
+
container_reason,
|
459
|
+
container_message,
|
460
|
+
exit_code,
|
461
|
+
)
|
462
|
+
else:
|
463
|
+
task_key_str = f"{key.dag_id}.{key.task_id}.{key.try_number}"
|
464
|
+
self.log.warning(
|
465
|
+
"Task %s failed in pod %s/%s (no details available)", task_key_str, namespace, pod_name
|
466
|
+
)
|
467
|
+
|
420
468
|
if state == ADOPTED:
|
421
469
|
# When the task pod is adopted by another executor,
|
422
470
|
# then remove the task from the current executor running queue.
|
@@ -696,18 +744,20 @@ class KubernetesExecutor(BaseExecutor):
|
|
696
744
|
results = self.result_queue.get_nowait()
|
697
745
|
self.log.warning("Executor shutting down, flushing results=%s", results)
|
698
746
|
try:
|
699
|
-
key, state, pod_name, namespace, resource_version = results
|
700
747
|
self.log.info(
|
701
|
-
"Changing state of %s to %s : resource_version=%
|
748
|
+
"Changing state of %s to %s : resource_version=%s",
|
749
|
+
results,
|
750
|
+
results.state,
|
751
|
+
results.resource_version,
|
702
752
|
)
|
703
753
|
try:
|
704
|
-
self._change_state(
|
754
|
+
self._change_state(results)
|
705
755
|
except Exception as e:
|
706
756
|
self.log.exception(
|
707
757
|
"Ignoring exception: %s when attempting to change state of %s to %s.",
|
708
758
|
e,
|
709
759
|
results,
|
710
|
-
state,
|
760
|
+
results.state,
|
711
761
|
)
|
712
762
|
finally:
|
713
763
|
self.result_queue.task_done()
|
@@ -16,26 +16,66 @@
|
|
16
16
|
# under the License.
|
17
17
|
from __future__ import annotations
|
18
18
|
|
19
|
-
from typing import TYPE_CHECKING, Any
|
19
|
+
from typing import TYPE_CHECKING, Any, Literal, NamedTuple, TypedDict
|
20
20
|
|
21
|
-
ADOPTED = "adopted"
|
22
21
|
if TYPE_CHECKING:
|
23
22
|
from collections.abc import Sequence
|
24
23
|
|
25
24
|
from airflow.models.taskinstance import TaskInstanceKey
|
26
25
|
from airflow.utils.state import TaskInstanceState
|
27
26
|
|
28
|
-
# TODO: Remove after Airflow 2 support is removed
|
29
|
-
CommandType = Sequence[str]
|
30
27
|
|
31
|
-
|
32
|
-
|
28
|
+
ADOPTED = "adopted"
|
29
|
+
|
30
|
+
|
31
|
+
class FailureDetails(TypedDict, total=False):
|
32
|
+
"""Detailed information about pod/container failure."""
|
33
|
+
|
34
|
+
pod_status: str | None
|
35
|
+
pod_reason: str | None
|
36
|
+
pod_message: str | None
|
37
|
+
container_state: str | None
|
38
|
+
container_reason: str | None
|
39
|
+
container_message: str | None
|
40
|
+
exit_code: int | None
|
41
|
+
container_type: Literal["init", "main"] | None
|
42
|
+
container_name: str | None
|
43
|
+
|
44
|
+
|
45
|
+
class KubernetesResults(NamedTuple):
|
46
|
+
"""Results from Kubernetes task execution."""
|
47
|
+
|
48
|
+
key: TaskInstanceKey
|
49
|
+
state: TaskInstanceState | str | None
|
50
|
+
pod_name: str
|
51
|
+
namespace: str
|
52
|
+
resource_version: str
|
53
|
+
failure_details: FailureDetails | None
|
54
|
+
|
55
|
+
|
56
|
+
class KubernetesWatch(NamedTuple):
|
57
|
+
"""Watch event data from Kubernetes pods."""
|
58
|
+
|
59
|
+
pod_name: str
|
60
|
+
namespace: str
|
61
|
+
state: TaskInstanceState | str | None
|
62
|
+
annotations: dict[str, str]
|
63
|
+
resource_version: str
|
64
|
+
failure_details: FailureDetails | None
|
65
|
+
|
66
|
+
|
67
|
+
# TODO: Remove after Airflow 2 support is removed
|
68
|
+
CommandType = "Sequence[str]"
|
69
|
+
|
70
|
+
|
71
|
+
class KubernetesJob(NamedTuple):
|
72
|
+
"""Job definition for Kubernetes execution."""
|
33
73
|
|
34
|
-
|
35
|
-
|
74
|
+
key: TaskInstanceKey
|
75
|
+
command: Sequence[str]
|
76
|
+
kube_executor_config: Any
|
77
|
+
pod_template_file: str | None
|
36
78
|
|
37
|
-
# pod_name, namespace, pod state, annotations, resource_version
|
38
|
-
KubernetesWatchType = tuple[str, str, TaskInstanceState | str | None, dict[str, str], str]
|
39
79
|
|
40
80
|
ALL_NAMESPACES = "ALL_NAMESPACES"
|
41
81
|
POD_EXECUTOR_DONE_KEY = "airflow_executor_done"
|