apache-airflow-providers-cncf-kubernetes 10.4.3rc1__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.
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/PKG-INFO +8 -8
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/README.rst +4 -4
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/changelog.rst +29 -0
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/docs/commits.rst +35 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/index.rst +3 -3
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/operators.rst +35 -1
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/provider.yaml +9 -3
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/pyproject.toml +4 -4
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/__init__.py +3 -3
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/src/airflow/providers/cncf/kubernetes/decorators/kubernetes_cmd.py +123 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/get_provider_info.py +6 -2
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/kubernetes.py +11 -2
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/pod.py +11 -2
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/pod_manager.py +54 -13
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/version_compat.py +0 -1
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/system/cncf/kubernetes/example_kubernetes_cmd_decorator.py +76 -0
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes.py +126 -0
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes_cmd.py +390 -0
- apache_airflow_providers_cncf_kubernetes-10.5.0rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes_commons.py +280 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_pod.py +13 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/utils/test_pod_manager.py +59 -7
- apache_airflow_providers_cncf_kubernetes-10.4.3rc1/docs/commits.rst +0 -1537
- apache_airflow_providers_cncf_kubernetes-10.4.3rc1/tests/unit/cncf/kubernetes/decorators/test_kubernetes.py +0 -328
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/cli-ref.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/conf.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/configurations-ref.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/connections/kubernetes.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/arch-diag-kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/arch-diag-kubernetes2.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/k8s-failed-pod.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/img/k8s-happy-path.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/integration-logos/Kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/integration-logos/Spark-On-Kubernetes.png +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/kubernetes_executor.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/local_kubernetes_executor.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/redirects.txt +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/docs/security.rst +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/LICENSE +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/callbacks.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/cli/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/cli/kubernetes_command.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/decorators/kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/exceptions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/executors/local_kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/hooks/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/k8s_model.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kube_client.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kube_config.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/kubernetes_helper_functions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/custom_object_launcher.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/kueue.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_generator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_volume_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/pod_template_file_examples/git_sync_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.jinja2 +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/python_kubernetes_script.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/configmap.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/env_variable.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/resource_convert/secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/sensors/spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/template_rendering.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/triggers/pod.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/delete_from.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/src/airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/conftest.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_async.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_decorator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_kueue.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_kubernetes_resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/example_spark_kubernetes_spark_pi.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/system/cncf/kubernetes/spark_job_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/backcompat/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/backcompat/test_backwards_compat_converters.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/cli/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/cli/test_kubernetes_command.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/conftest.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/executor/basic_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/kube_config +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/generator_base_with_secrets.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/pods/template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_template.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.json +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/data_files/spark/application_test.yaml +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → 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
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → 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
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/decorators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/test_kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/executors/test_local_kubernetes_executor.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/hooks/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/hooks/test_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/log_handlers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/log_handlers/test_log_handlers.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/models/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/models/test_secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_custom_object_launcher.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_kueue.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_resource.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/operators/test_spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_configmap.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_env_variable.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/resource_convert/test_secret.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/sensors/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/sensors/test_spark_kubernetes.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_callbacks.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_client.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_kubernetes_helper_functions.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_pod_generator.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/test_template_rendering.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/test_job.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/triggers/test_pod.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → apache_airflow_providers_cncf_kubernetes-10.5.0rc1}/tests/unit/cncf/kubernetes/utils/__init__.py +0 -0
- {apache_airflow_providers_cncf_kubernetes-10.4.3rc1 → 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.
|
|
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.
|
|
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.
|
|
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.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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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:
|
|
26
|
-
#
|
|
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.
|
|
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.
|
|
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.
|
|
116
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/10.
|
|
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.
|
|
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.
|
|
35
|
+
"2.10.0"
|
|
36
36
|
):
|
|
37
37
|
raise RuntimeError(
|
|
38
|
-
f"The package `apache-airflow-providers-cncf-kubernetes:{__version__}` needs Apache Airflow 2.
|
|
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 =
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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,
|