diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 86655b9135da2..819c1b160df38 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -610,6 +610,14 @@ repos:
language: python
files: ^.*LICENSE.*$|^.*LICENCE.*$
pass_filenames: false
+ - id: check-aiobotocore-optional
+ name: Check if aiobotocore is an optional dependency only
+ entry: ./scripts/ci/pre_commit/pre_commit_check_aiobotocore_optional.py
+ language: python
+ files: ^airflow/providers/.*/provider\.yaml$
+ pass_filenames: true
+ additional_dependencies: ['click', 'rich>=12.4.4', 'pyyaml']
+ require_serial: true
- id: check-airflow-config-yaml-consistent
name: Checks for consistency between config.yml and default_config.cfg
language: python
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index 0182a44cd8e67..7ce128ac9408d 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -144,6 +144,8 @@ require Breeze Docker image to be build locally.
+-----------------------------------------------------------+------------------------------------------------------------------+---------+
| blacken-docs | Run black on Python code blocks in documentation files | |
+-----------------------------------------------------------+------------------------------------------------------------------+---------+
+| check-aiobotocore-optional | Check if aiobotocore is an optional dependency only | |
++-----------------------------------------------------------+------------------------------------------------------------------+---------+
| check-airflow-config-yaml-consistent | Checks for consistency between config.yml and default_config.cfg | |
+-----------------------------------------------------------+------------------------------------------------------------------+---------+
| check-airflow-provider-compatibility | Check compatibility of Providers with Airflow | |
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index bf5bc148c5d0b..b4c713360ed86 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -26,6 +26,7 @@
"all",
"black",
"blacken-docs",
+ "check-aiobotocore-optional",
"check-airflow-config-yaml-consistent",
"check-airflow-provider-compatibility",
"check-apache-license-rat",
diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt
index 857c3dd3281ba..5a3625662baa8 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -55,7 +55,7 @@ setup:version:123b462a421884dc2320ffc5e54b2478
setup:26f37743534e14f5aad5300aad920301
shell:bd3e004a92ebcec8feb40fc5cd95872d
start-airflow:ee5066f1420a489864b48bc4e5e472da
-static-checks:cb1029ee6292860bb9fc425ef67b656d
+static-checks:c22e24fc35d2f82135b30998e4f352c4
stop:e5aa686b4e53707ced4039d8414d5cd6
testing:docker-compose-tests:b86c044b24138af0659a05ed6331576c
testing:helm-tests:936cf28fd84ce4ff5113795fdae9624b
diff --git a/images/breeze/output_setup.svg b/images/breeze/output_setup.svg
index 65185a603f97a..c313db50bab0c 100644
--- a/images/breeze/output_setup.svg
+++ b/images/breeze/output_setup.svg
@@ -35,8 +35,8 @@
.breeze-setup-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-setup-r2 { fill: #c5c8c6 }
.breeze-setup-r3 { fill: #d0b344;font-weight: bold }
-.breeze-setup-r4 { fill: #868887 }
-.breeze-setup-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-r5 { fill: #868887 }
.breeze-setup-r6 { fill: #98a84b;font-weight: bold }
@@ -102,21 +102,21 @@
-Usage: breeze setup [OPTIONS] COMMAND [ARGS]...
+Usage: breeze setup [OPTIONS] COMMAND [ARGS]...
Tools that developers can use to configure Breeze
-╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
-│--help-hShow this message and exit.│
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
-╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
-│autocomplete Enables autocompletion of breeze commands. │
-│check-all-params-in-groups Check that all parameters are put in groups. │
-│config Show/update configuration (Python, Backend, Cheatsheet, ASCIIART). │
-│regenerate-command-images Regenerate breeze command images. │
-│self-upgrade Self upgrade Breeze. │
-│version Print information about version of apache-airflow-breeze. │
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
+│--help-hShow this message and exit.│
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
+│autocomplete Enables autocompletion of breeze commands. │
+│check-all-params-in-groups Check that all parameters are put in groups. │
+│config Show/update configuration (Python, Backend, Cheatsheet, ASCIIART). │
+│regenerate-command-images Regenerate breeze command images. │
+│self-upgrade Self upgrade Breeze. │
+│version Print information about version of apache-airflow-breeze. │
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
diff --git a/images/breeze/output_setup_check-all-params-in-groups.svg b/images/breeze/output_setup_check-all-params-in-groups.svg
index 1ed51d446efa8..096285f97fb7c 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -35,8 +35,8 @@
.breeze-setup-check-all-params-in-groups-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-setup-check-all-params-in-groups-r2 { fill: #c5c8c6 }
.breeze-setup-check-all-params-in-groups-r3 { fill: #d0b344;font-weight: bold }
-.breeze-setup-check-all-params-in-groups-r4 { fill: #868887 }
-.breeze-setup-check-all-params-in-groups-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-check-all-params-in-groups-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-check-all-params-in-groups-r5 { fill: #868887 }
.breeze-setup-check-all-params-in-groups-r6 { fill: #8d7b39 }
.breeze-setup-check-all-params-in-groups-r7 { fill: #98a84b;font-weight: bold }
@@ -139,33 +139,33 @@
-Usage: breeze setup check-all-params-in-groups [OPTIONS]
+Usage: breeze setup check-all-params-in-groups [OPTIONS]
Check that all parameters are put in groups.
-╭─ Check all params in groups flags ───────────────────────────────────────────────────────────────────────────────────╮
-│--commandCommand(s) to regenerate images for (optional, might be repeated) │
-│(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check | │
-│ci:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup | │
-│compile-www-assets | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster | │
-│k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | k8s:setup-env |│
-│k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pull | │
-│prod-image:verify | prod-image | release-management:create-minor-branch | │
-│release-management:generate-constraints | release-management:generate-issue-content-providers | │
-│release-management:install-provider-packages | release-management:prepare-airflow-package | │
-│release-management:prepare-provider-documentation | release-management:prepare-provider-packages | │
-│release-management:release-prod-images | release-management:start-rc-process | │
-│release-management:start-release | release-management:verify-provider-packages | release-management | │
-│setup:autocomplete | setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images │
-│| setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks | stop | │
-│testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests | │
-│testing) │
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
-╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
-│--verbose-vPrint verbose information about performed steps.│
-│--dry-run-DIf dry-run is set, commands are only printed, not executed.│
-│--help-hShow this message and exit.│
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Check all params in groups flags ───────────────────────────────────────────────────────────────────────────────────╮
+│--commandCommand(s) to regenerate images for (optional, might be repeated) │
+│(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check | │
+│ci:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup | │
+│compile-www-assets | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster | │
+│k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | k8s:setup-env |│
+│k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build | prod-image:pull | │
+│prod-image:verify | prod-image | release-management:create-minor-branch | │
+│release-management:generate-constraints | release-management:generate-issue-content-providers | │
+│release-management:install-provider-packages | release-management:prepare-airflow-package | │
+│release-management:prepare-provider-documentation | release-management:prepare-provider-packages | │
+│release-management:release-prod-images | release-management:start-rc-process | │
+│release-management:start-release | release-management:verify-provider-packages | release-management | │
+│setup:autocomplete | setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images │
+│| setup:self-upgrade | setup:version | setup | shell | start-airflow | static-checks | stop | │
+│testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:tests | │
+│testing) │
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
+│--verbose-vPrint verbose information about performed steps.│
+│--dry-run-DIf dry-run is set, commands are only printed, not executed.│
+│--help-hShow this message and exit.│
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
diff --git a/images/breeze/output_setup_regenerate-command-images.svg b/images/breeze/output_setup_regenerate-command-images.svg
index 5bb38f1c124b7..b8bcafe739900 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -35,8 +35,8 @@
.breeze-setup-regenerate-command-images-r1 { fill: #c5c8c6;font-weight: bold }
.breeze-setup-regenerate-command-images-r2 { fill: #c5c8c6 }
.breeze-setup-regenerate-command-images-r3 { fill: #d0b344;font-weight: bold }
-.breeze-setup-regenerate-command-images-r4 { fill: #868887 }
-.breeze-setup-regenerate-command-images-r5 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-regenerate-command-images-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-setup-regenerate-command-images-r5 { fill: #868887 }
.breeze-setup-regenerate-command-images-r6 { fill: #8d7b39 }
.breeze-setup-regenerate-command-images-r7 { fill: #98a84b;font-weight: bold }
@@ -148,36 +148,36 @@
-Usage: breeze setup regenerate-command-images [OPTIONS]
+Usage: breeze setup regenerate-command-images [OPTIONS]
Regenerate breeze command images.
-╭─ Image regeneration option ──────────────────────────────────────────────────────────────────────────────────────────╮
-│--forceForces regeneration of all images│
-│--commandCommand(s) to regenerate images for (optional, might be repeated) │
-│(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check | │
-│ci:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup | │
-│compile-www-assets | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster | │
-│k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | │
-│k8s:setup-env | k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build |│
-│prod-image:pull | prod-image:verify | prod-image | release-management:create-minor-branch | │
-│release-management:generate-constraints | release-management:generate-issue-content-providers | │
-│release-management:install-provider-packages | release-management:prepare-airflow-package | │
-│release-management:prepare-provider-documentation | release-management:prepare-provider-packages | │
-│release-management:release-prod-images | release-management:start-rc-process | │
-│release-management:start-release | release-management:verify-provider-packages | release-management │
-│| setup:autocomplete | setup:check-all-params-in-groups | setup:config | │
-│setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell | start-airflow│
-│| static-checks | stop | testing:docker-compose-tests | testing:helm-tests | │
-│testing:integration-tests | testing:tests | testing) │
-│--check-onlyOnly check if some images need to be regenerated. Return 0 if no need or 1 if needed. Cannot be used│
-│together with --command flag or --force. │
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
-╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
-│--verbose-vPrint verbose information about performed steps.│
-│--dry-run-DIf dry-run is set, commands are only printed, not executed.│
-│--help-hShow this message and exit.│
-╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Image regeneration option ──────────────────────────────────────────────────────────────────────────────────────────╮
+│--forceForces regeneration of all images│
+│--commandCommand(s) to regenerate images for (optional, might be repeated) │
+│(main | build-docs | ci:fix-ownership | ci:free-space | ci:get-workflow-info | ci:resource-check | │
+│ci:selective-check | ci | ci-image:build | ci-image:pull | ci-image:verify | ci-image | cleanup | │
+│compile-www-assets | exec | k8s:build-k8s-image | k8s:configure-cluster | k8s:create-cluster | │
+│k8s:delete-cluster | k8s:deploy-airflow | k8s:k9s | k8s:logs | k8s:run-complete-tests | │
+│k8s:setup-env | k8s:shell | k8s:status | k8s:tests | k8s:upload-k8s-image | k8s | prod-image:build |│
+│prod-image:pull | prod-image:verify | prod-image | release-management:create-minor-branch | │
+│release-management:generate-constraints | release-management:generate-issue-content-providers | │
+│release-management:install-provider-packages | release-management:prepare-airflow-package | │
+│release-management:prepare-provider-documentation | release-management:prepare-provider-packages | │
+│release-management:release-prod-images | release-management:start-rc-process | │
+│release-management:start-release | release-management:verify-provider-packages | release-management │
+│| setup:autocomplete | setup:check-all-params-in-groups | setup:config | │
+│setup:regenerate-command-images | setup:self-upgrade | setup:version | setup | shell | start-airflow│
+│| static-checks | stop | testing:docker-compose-tests | testing:helm-tests | │
+│testing:integration-tests | testing:tests | testing) │
+│--check-onlyOnly check if some images need to be regenerated. Return 0 if no need or 1 if needed. Cannot be used│
+│together with --command flag or --force. │
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
+╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮
+│--verbose-vPrint verbose information about performed steps.│
+│--dry-run-DIf dry-run is set, commands are only printed, not executed.│
+│--help-hShow this message and exit.│
+╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
diff --git a/images/breeze/output_static-checks.svg b/images/breeze/output_static-checks.svg
index 7b2f1210c04e9..83ad572819e79 100644
--- a/images/breeze/output_static-checks.svg
+++ b/images/breeze/output_static-checks.svg
@@ -229,15 +229,15 @@
╭─ Pre-commit flags ───────────────────────────────────────────────────────────────────────────────────────────────────╮
│--type-tType(s) of the static checks to run. │
-│(all | black | blacken-docs | check-airflow-config-yaml-consistent | │
-│check-airflow-provider-compatibility | check-apache-license-rat | │
-│check-base-operator-partial-arguments | check-base-operator-usage | │
-│check-boring-cyborg-configuration | check-breeze-top-dependencies-limited | │
-│check-builtin-literals | check-changelog-has-no-duplicates | │
-│check-core-deprecation-classes | check-daysago-import-from-utils | │
-│check-decorated-operator-implements-custom-name | check-docstring-param-types | │
-│check-example-dags-urls | check-executables-have-shebangs | │
-│check-extra-packages-references | check-extras-order | check-for-inclusive-language | │
+│(all | black | blacken-docs | check-aiobotocore-optional | │
+│check-airflow-config-yaml-consistent | check-airflow-provider-compatibility | │
+│check-apache-license-rat | check-base-operator-partial-arguments | │
+│check-base-operator-usage | check-boring-cyborg-configuration | │
+│check-breeze-top-dependencies-limited | check-builtin-literals | │
+│check-changelog-has-no-duplicates | check-core-deprecation-classes | │
+│check-daysago-import-from-utils | check-decorated-operator-implements-custom-name | │
+│check-docstring-param-types | check-example-dags-urls | check-executables-have-shebangs │
+│| check-extra-packages-references | check-extras-order | check-for-inclusive-language | │
│check-hooks-apply | check-incorrect-use-of-LoggingMixin | check-init-decorator-arguments│
│| check-lazy-logging | check-links-to-example-dags-do-not-use-hardcoded-versions | │
│check-merge-conflict | check-newsfragments-are-valid | │
diff --git a/scripts/ci/pre_commit/pre_commit_check_aiobotocore_optional.py b/scripts/ci/pre_commit/pre_commit_check_aiobotocore_optional.py
new file mode 100755
index 0000000000000..5c222ebada558
--- /dev/null
+++ b/scripts/ci/pre_commit/pre_commit_check_aiobotocore_optional.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+from __future__ import annotations
+
+import sys
+from pathlib import Path
+
+import yaml
+from rich.console import Console
+
+AIRFLOW_SOURCES = Path(__file__).parents[3]
+
+console = Console(color_system="standard", width=200)
+
+if __name__ == "__main__":
+ errors = []
+ for file in sys.argv[1:]:
+ console.print(f"[blue]Checking[/blue]: {file}")
+ provider_yaml_content = yaml.safe_load(Path(file).read_text())
+ dependencies = provider_yaml_content.get("dependencies")
+ if dependencies and any(dependency.startswith("aiobotocore") for dependency in dependencies):
+ errors.append(
+ f"\n[red]Error: the aibotocore cannot be a required dependency, "
+ f"because it restricts botocore too much[/]\n\n"
+ f"The [magenta]{file}[/] file has aiobotocore dependency set at top level.\n\n"
+ f"[yellow]Please remove it and make sure it is added only as "
+ f"an optional dependency in additional-extras[/n]\n"
+ )
+ if errors:
+ for error in errors:
+ console.print(error)
+ sys.exit(1)