apache-airflow-providers-cncf-kubernetes 8.3.1__tar.gz → 8.3.2__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.

Potentially problematic release.


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

Files changed (59) hide show
  1. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/PKG-INFO +10 -10
  2. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/README.rst +5 -5
  3. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/__init__.py +1 -1
  4. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/executors/kubernetes_executor.py +1 -10
  5. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_utils.py +6 -9
  6. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/get_provider_info.py +4 -3
  7. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/pyproject.toml +5 -5
  8. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/LICENSE +0 -0
  9. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/backcompat/__init__.py +0 -0
  10. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/backcompat/backwards_compat_converters.py +0 -0
  11. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/callbacks.py +0 -0
  12. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/cli/__init__.py +0 -0
  13. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/cli/kubernetes_command.py +0 -0
  14. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/decorators/__init__.py +0 -0
  15. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/decorators/kubernetes.py +0 -0
  16. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/executors/__init__.py +0 -0
  17. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/executors/kubernetes_executor_types.py +0 -0
  18. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/executors/local_kubernetes_executor.py +0 -0
  19. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/hooks/__init__.py +0 -0
  20. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/hooks/kubernetes.py +0 -0
  21. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/k8s_model.py +0 -0
  22. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/kube_client.py +0 -0
  23. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/kube_config.py +0 -0
  24. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/__init__.py +0 -0
  25. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/kubernetes_executor_templates/basic_template.yaml +0 -0
  26. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/kubernetes_helper_functions.py +0 -0
  27. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/__init__.py +0 -0
  28. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/custom_object_launcher.py +0 -0
  29. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/job.py +0 -0
  30. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/kubernetes_pod.py +0 -0
  31. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/pod.py +0 -0
  32. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/resource.py +0 -0
  33. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/operators/spark_kubernetes.py +0 -0
  34. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_generator.py +0 -0
  35. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_generator_deprecated.py +0 -0
  36. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_launcher_deprecated.py +0 -0
  37. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_template_file_examples/__init__.py +0 -0
  38. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_image_template.yaml +0 -0
  39. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_template_file_examples/dags_in_volume_template.yaml +0 -0
  40. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/pod_template_file_examples/git_sync_template.yaml +0 -0
  41. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/python_kubernetes_script.jinja2 +0 -0
  42. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/python_kubernetes_script.py +0 -0
  43. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/resource_convert/__init__.py +0 -0
  44. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/resource_convert/configmap.py +0 -0
  45. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/resource_convert/env_variable.py +0 -0
  46. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/resource_convert/secret.py +0 -0
  47. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/secret.py +0 -0
  48. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/sensors/__init__.py +0 -0
  49. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/sensors/spark_kubernetes.py +0 -0
  50. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/template_rendering.py +0 -0
  51. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/triggers/__init__.py +0 -0
  52. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/triggers/job.py +0 -0
  53. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/triggers/kubernetes_pod.py +0 -0
  54. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/triggers/pod.py +0 -0
  55. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/utils/__init__.py +0 -0
  56. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/utils/delete_from.py +0 -0
  57. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/utils/k8s_resource_iterator.py +0 -0
  58. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/utils/pod_manager.py +0 -0
  59. {apache_airflow_providers_cncf_kubernetes-8.3.1 → apache_airflow_providers_cncf_kubernetes-8.3.2}/airflow/providers/cncf/kubernetes/utils/xcom_sidecar.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apache-airflow-providers-cncf-kubernetes
3
- Version: 8.3.1
3
+ Version: 8.3.2
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>
@@ -26,11 +26,11 @@ Requires-Dist: apache-airflow>=2.7.0
26
26
  Requires-Dist: asgiref>=3.5.2
27
27
  Requires-Dist: cryptography>=41.0.0
28
28
  Requires-Dist: google-re2>=1.0
29
- Requires-Dist: kubernetes>=28.1.0,<=29.0.0
30
- Requires-Dist: kubernetes_asyncio>=28.1.0,<=29.0.0
29
+ Requires-Dist: kubernetes>=29.0.0,<=30.1.0
30
+ Requires-Dist: kubernetes_asyncio>=29.0.0,<=30.1.0
31
31
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
32
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/changelog.html
33
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1
32
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/changelog.html
33
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2
34
34
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
35
35
  Project-URL: Source Code, https://github.com/apache/airflow
36
36
  Project-URL: Twitter, https://twitter.com/ApacheAirflow
@@ -80,7 +80,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
80
80
 
81
81
  Package ``apache-airflow-providers-cncf-kubernetes``
82
82
 
83
- Release: ``8.3.1``
83
+ Release: ``8.3.2``
84
84
 
85
85
 
86
86
  `Kubernetes <https://kubernetes.io/>`__
@@ -93,7 +93,7 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
93
93
  are in ``airflow.providers.cncf.kubernetes`` python package.
94
94
 
95
95
  You can find package information and changelog for the provider
96
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/>`_.
96
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/>`_.
97
97
 
98
98
  Installation
99
99
  ------------
@@ -114,10 +114,10 @@ PIP package Version required
114
114
  ``apache-airflow`` ``>=2.7.0``
115
115
  ``asgiref`` ``>=3.5.2``
116
116
  ``cryptography`` ``>=41.0.0``
117
- ``kubernetes`` ``>=28.1.0,<=29.0.0``
118
- ``kubernetes_asyncio`` ``>=28.1.0,<=29.0.0``
117
+ ``kubernetes`` ``>=29.0.0,<=30.1.0``
118
+ ``kubernetes_asyncio`` ``>=29.0.0,<=30.1.0``
119
119
  ``google-re2`` ``>=1.0``
120
120
  ====================== =====================
121
121
 
122
122
  The changelog for the provider package can be found in the
123
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/changelog.html>`_.
123
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/changelog.html>`_.
@@ -42,7 +42,7 @@
42
42
 
43
43
  Package ``apache-airflow-providers-cncf-kubernetes``
44
44
 
45
- Release: ``8.3.1``
45
+ Release: ``8.3.2``
46
46
 
47
47
 
48
48
  `Kubernetes <https://kubernetes.io/>`__
@@ -55,7 +55,7 @@ This is a provider package for ``cncf.kubernetes`` provider. All classes for thi
55
55
  are in ``airflow.providers.cncf.kubernetes`` python package.
56
56
 
57
57
  You can find package information and changelog for the provider
58
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/>`_.
58
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/>`_.
59
59
 
60
60
  Installation
61
61
  ------------
@@ -76,10 +76,10 @@ PIP package Version required
76
76
  ``apache-airflow`` ``>=2.7.0``
77
77
  ``asgiref`` ``>=3.5.2``
78
78
  ``cryptography`` ``>=41.0.0``
79
- ``kubernetes`` ``>=28.1.0,<=29.0.0``
80
- ``kubernetes_asyncio`` ``>=28.1.0,<=29.0.0``
79
+ ``kubernetes`` ``>=29.0.0,<=30.1.0``
80
+ ``kubernetes_asyncio`` ``>=29.0.0,<=30.1.0``
81
81
  ``google-re2`` ``>=1.0``
82
82
  ====================== =====================
83
83
 
84
84
  The changelog for the provider package can be found in the
85
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/changelog.html>`_.
85
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/changelog.html>`_.
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "8.3.1"
32
+ __version__ = "8.3.2"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.7.0"
@@ -159,16 +159,7 @@ class KubernetesExecutor(BaseExecutor):
159
159
 
160
160
  pods = []
161
161
  for namespace in namespaces:
162
- # Dynamic Client list pods is throwing TypeError when there are no matching pods to return
163
- # This bug was fixed in MR https://github.com/kubernetes-client/python/pull/2155
164
- # TODO: Remove the try-except clause once we upgrade the K8 Python client version which
165
- # includes the above MR
166
- try:
167
- pods.extend(
168
- dynamic_client.get(resource=pod_resource, namespace=namespace, **query_kwargs).items
169
- )
170
- except TypeError:
171
- continue
162
+ pods.extend(dynamic_client.get(resource=pod_resource, namespace=namespace, **query_kwargs).items)
172
163
 
173
164
  return pods
174
165
 
@@ -139,7 +139,9 @@ class KubernetesJobWatcher(multiprocessing.Process, LoggingMixin):
139
139
  ) -> str | None:
140
140
  self.log.info("Event: and now my watch begins starting at resource_version: %s", resource_version)
141
141
 
142
- kwargs: dict[str, Any] = {"label_selector": f"airflow-worker={scheduler_job_id}"}
142
+ kwargs: dict[str, Any] = {
143
+ "label_selector": f"airflow-worker={scheduler_job_id},{POD_EXECUTOR_DONE_KEY}!=True",
144
+ }
143
145
  if resource_version:
144
146
  kwargs["resource_version"] = resource_version
145
147
  if kube_config.kube_client_request_args:
@@ -271,14 +273,9 @@ class KubernetesJobWatcher(multiprocessing.Process, LoggingMixin):
271
273
  elif status == "Succeeded":
272
274
  # We get multiple events once the pod hits a terminal state, and we only want to
273
275
  # send it along to the scheduler once.
274
- # If our event type is DELETED, we have the POD_EXECUTOR_DONE_KEY, or the pod has
275
- # a deletion timestamp, we've already seen the initial Succeeded event and sent it
276
- # along to the scheduler.
277
- if (
278
- event["type"] == "DELETED"
279
- or POD_EXECUTOR_DONE_KEY in pod.metadata.labels
280
- or pod.metadata.deletion_timestamp
281
- ):
276
+ # If our event type is DELETED, or the pod has a deletion timestamp, we've already
277
+ # seen the initial Succeeded event and sent it along to the scheduler.
278
+ if event["type"] == "DELETED" or pod.metadata.deletion_timestamp:
282
279
  self.log.info(
283
280
  "Skipping event for Succeeded pod %s - event for this pod already sent to executor",
284
281
  pod_name,
@@ -28,8 +28,9 @@ def get_provider_info():
28
28
  "name": "Kubernetes",
29
29
  "description": "`Kubernetes <https://kubernetes.io/>`__\n",
30
30
  "state": "ready",
31
- "source-date-epoch": 1717567104,
31
+ "source-date-epoch": 1718604007,
32
32
  "versions": [
33
+ "8.3.2",
33
34
  "8.3.1",
34
35
  "8.3.0",
35
36
  "8.2.0",
@@ -94,8 +95,8 @@ def get_provider_info():
94
95
  "apache-airflow>=2.7.0",
95
96
  "asgiref>=3.5.2",
96
97
  "cryptography>=41.0.0",
97
- "kubernetes>=28.1.0,<=29.0.0",
98
- "kubernetes_asyncio>=28.1.0,<=29.0.0",
98
+ "kubernetes>=29.0.0,<=30.1.0",
99
+ "kubernetes_asyncio>=29.0.0,<=30.1.0",
99
100
  "google-re2>=1.0",
100
101
  ],
101
102
  "integrations": [
@@ -28,7 +28,7 @@ build-backend = "flit_core.buildapi"
28
28
 
29
29
  [project]
30
30
  name = "apache-airflow-providers-cncf-kubernetes"
31
- version = "8.3.1"
31
+ version = "8.3.2"
32
32
  description = "Provider package apache-airflow-providers-cncf-kubernetes for Apache Airflow"
33
33
  readme = "README.rst"
34
34
  authors = [
@@ -61,13 +61,13 @@ dependencies = [
61
61
  "asgiref>=3.5.2",
62
62
  "cryptography>=41.0.0",
63
63
  "google-re2>=1.0",
64
- "kubernetes>=28.1.0,<=29.0.0",
65
- "kubernetes_asyncio>=28.1.0,<=29.0.0",
64
+ "kubernetes>=29.0.0,<=30.1.0",
65
+ "kubernetes_asyncio>=29.0.0,<=30.1.0",
66
66
  ]
67
67
 
68
68
  [project.urls]
69
- "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1"
70
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.1/changelog.html"
69
+ "Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2"
70
+ "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-cncf-kubernetes/8.3.2/changelog.html"
71
71
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
72
72
  "Source Code" = "https://github.com/apache/airflow"
73
73
  "Slack Chat" = "https://s.apache.org/airflow-slack"