Skip to content

Commit 9409446

Browse files
authored
Add cli cmd to list the provider trigger info (#30822)
1 parent 6e80bcd commit 9409446

File tree

10 files changed

+94
-33
lines changed

10 files changed

+94
-33
lines changed

airflow/cli/cli_config.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,12 @@ class GroupCommand(NamedTuple):
17541754
func=lazy_load_command("airflow.cli.commands.provider_command.hooks_list"),
17551755
args=(ARG_OUTPUT, ARG_VERBOSE),
17561756
),
1757+
ActionCommand(
1758+
name="triggers",
1759+
help="List registered provider triggers",
1760+
func=lazy_load_command("airflow.cli.commands.provider_command.triggers_list"),
1761+
args=(ARG_OUTPUT, ARG_VERBOSE),
1762+
),
17571763
ActionCommand(
17581764
name="behaviours",
17591765
help="Get information about registered connection types with custom behaviours",

airflow/cli/commands/provider_command.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,19 @@ def hooks_list(args):
8080
)
8181

8282

83+
@suppress_logs_and_warning
84+
def triggers_list(args):
85+
AirflowConsole().print_as(
86+
data=ProvidersManager().trigger,
87+
output=args.output,
88+
mapper=lambda x: {
89+
"package_name": x.package_name,
90+
"class": x.trigger_class_name,
91+
"integration_name": x.integration_name,
92+
},
93+
)
94+
95+
8396
@suppress_logs_and_warning
8497
def connection_form_widget_list(args):
8598
"""Lists all custom connection form fields at the command line."""

airflow/provider.yaml.schema.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@
208208
"type": "string",
209209
"description": "Integration name. It must have a matching item in the 'integration' section of any provider."
210210
},
211-
"python-modules": {
212-
"description": "List of python modules containing the triggers.",
211+
"class-names": {
212+
"description": "List of the trigger class name that implements trigger.",
213213
"type": "array",
214214
"items": {
215215
"type": "string"
@@ -219,7 +219,7 @@
219219
"additionalProperties": false,
220220
"required": [
221221
"integration-name",
222-
"python-modules"
222+
"class-names"
223223
]
224224
}
225225
},

airflow/providers/apache/kafka/provider.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ sensors:
5757

5858
triggers:
5959
- integration-name: Apache Kafka
60-
python-modules:
61-
- airflow.providers.apache.kafka.triggers.await_message
60+
class-names:
61+
- airflow.providers.apache.kafka.triggers.await_message.AwaitMessageTrigger
6262

6363
connection-types:
6464
- hook-class-name: airflow.providers.apache.kafka.hooks.base.KafkaBaseHook

airflow/providers/apache/livy/provider.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ hooks:
6969

7070
triggers:
7171
- integration-name: Apache Livy
72-
python-modules:
73-
- airflow.providers.apache.livy.triggers.livy
72+
class-names:
73+
- airflow.providers.apache.livy.triggers.livy.LivyTrigger
7474

7575

7676
connection-types:

airflow/providers/cncf/kubernetes/provider.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ hooks:
108108

109109
triggers:
110110
- integration-name: Kubernetes
111-
python-modules:
112-
- airflow.providers.cncf.kubernetes.triggers.pod
111+
class-names:
112+
- airflow.providers.cncf.kubernetes.triggers.pod.KubernetesPodTrigger
113113

114114

115115
connection-types:

airflow/providers/databricks/provider.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ hooks:
9797

9898
triggers:
9999
- integration-name: Databricks
100-
python-modules:
101-
- airflow.providers.databricks.triggers.databricks
100+
class-names:
101+
- airflow.providers.databricks.triggers.databricks.DatabricksExecutionTrigger
102102

103103
sensors:
104104
- integration-name: Databricks

airflow/providers/dbt/cloud/provider.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ hooks:
6666

6767
triggers:
6868
- integration-name: dbt Cloud
69-
python-modules:
70-
- airflow.providers.dbt.cloud.triggers.dbt
69+
class-names:
70+
- airflow.providers.dbt.cloud.triggers.dbt.DbtCloudRunJobTrigger
7171

7272

7373
connection-types:

airflow/providers/google/provider.yaml

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -845,35 +845,47 @@ hooks:
845845

846846
triggers:
847847
- integration-name: Google BigQuery Data Transfer Service
848-
python-modules:
849-
- airflow.providers.google.cloud.triggers.bigquery_dts
848+
class-names:
849+
- airflow.providers.google.cloud.triggers.bigquery_dts.BigQueryDataTransferRunTrigger
850850
- integration-name: Google BigQuery
851-
python-modules:
852-
- airflow.providers.google.cloud.triggers.bigquery
851+
class-names:
852+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryInsertJobTrigger
853+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryCheckTrigger
854+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryGetDataTrigger
855+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryIntervalCheckTrigger
856+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryValueCheckTrigger
857+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryTableExistenceTrigger
858+
- airflow.providers.google.cloud.triggers.bigquery.BigQueryTablePartitionExistenceTrigger
853859
- integration-name: Google Cloud Build
854-
python-modules:
855-
- airflow.providers.google.cloud.triggers.cloud_build
860+
class-names:
861+
- airflow.providers.google.cloud.triggers.cloud_build.CloudBuildCreateBuildTrigger
856862
- integration-name: Google Cloud Composer
857-
python-modules:
858-
- airflow.providers.google.cloud.triggers.cloud_composer
863+
class-names:
864+
- airflow.providers.google.cloud.triggers.cloud_composer.CloudComposerExecutionTrigger
859865
- integration-name: Google Dataflow
860-
python-modules:
861-
- airflow.providers.google.cloud.triggers.dataflow
866+
class-names:
867+
- airflow.providers.google.cloud.triggers.dataflow.TemplateJobStartTrigger
862868
- integration-name: Google Data Fusion
863-
python-modules:
864-
- airflow.providers.google.cloud.triggers.datafusion
869+
class-names:
870+
- airflow.providers.google.cloud.triggers.datafusion.DataFusionStartPipelineTrigger
865871
- integration-name: Google Dataproc
866-
python-modules:
867-
- airflow.providers.google.cloud.triggers.dataproc
872+
class-names:
873+
- airflow.providers.google.cloud.triggers.dataproc.DataprocBaseTrigger
874+
- airflow.providers.google.cloud.triggers.dataproc.DataprocSubmitTrigger
875+
- airflow.providers.google.cloud.triggers.dataproc.DataprocClusterTrigger
876+
- airflow.providers.google.cloud.triggers.dataproc.DataprocBatchTrigger
877+
- airflow.providers.google.cloud.triggers.dataproc.DataprocDeleteClusterTrigger
878+
- airflow.providers.google.cloud.triggers.dataproc.DataprocWorkflowTrigger
868879
- integration-name: Google Cloud Storage (GCS)
869-
python-modules:
870-
- airflow.providers.google.cloud.triggers.gcs
880+
class-names:
881+
- airflow.providers.google.cloud.triggers.gcs.GCSBlobTrigger
871882
- integration-name: Google Kubernetes Engine
872-
python-modules:
873-
- airflow.providers.google.cloud.triggers.kubernetes_engine
883+
class-names:
884+
- airflow.providers.google.cloud.triggers.kubernetes_engine.GKEStartPodTrigger
885+
- airflow.providers.google.cloud.triggers.kubernetes_engine.GKEOperationTrigger
874886
- integration-name: Google Machine Learning Engine
875-
python-modules:
876-
- airflow.providers.google.cloud.triggers.mlengine
887+
class-names:
888+
- airflow.providers.google.cloud.triggers.mlengine.MLEngineStartTrainingJobTrigger
877889

878890
transfers:
879891
- source-integration-name: Presto

airflow/providers_manager.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ class HookClassProvider(NamedTuple):
197197
package_name: str
198198

199199

200+
class TriggerInfo(NamedTuple):
201+
"""Trigger class and provider it comes from."""
202+
203+
trigger_class_name: str
204+
package_name: str
205+
integration_name: str
206+
207+
200208
class HookInfo(NamedTuple):
201209
"""Hook information."""
202210

@@ -387,6 +395,7 @@ def __init__(self):
387395
self._logging_class_name_set: set[str] = set()
388396
self._secrets_backend_class_name_set: set[str] = set()
389397
self._api_auth_backend_module_names: set[str] = set()
398+
self._trigger_info_set: set[TriggerInfo] = set()
390399
self._provider_schema_validator = _create_provider_info_schema_validator()
391400
self._customized_form_fields_schema_validator = (
392401
_create_customized_form_field_behaviours_schema_validator()
@@ -941,6 +950,27 @@ def _discover_auth_backends(self) -> None:
941950
if _sanity_check(provider_package, auth_backend_module_name + ".init_app", provider):
942951
self._api_auth_backend_module_names.add(auth_backend_module_name)
943952

953+
@provider_info_cache("triggers")
954+
def initialize_providers_triggers(self):
955+
"""Initialization of providers triggers."""
956+
self.initialize_providers_list()
957+
for provider_package, provider in self._provider_dict.items():
958+
for trigger in provider.data.get("triggers", []):
959+
for trigger_class_name in trigger.get("class-names"):
960+
self._trigger_info_set.add(
961+
TriggerInfo(
962+
package_name=provider_package,
963+
trigger_class_name=trigger_class_name,
964+
integration_name=trigger.get("integration-name", ""),
965+
)
966+
)
967+
968+
@property
969+
def trigger(self) -> list[TriggerInfo]:
970+
"""Returns information about available providers trigger class."""
971+
self.initialize_providers_triggers()
972+
return sorted(self._trigger_info_set, key=lambda x: x.package_name)
973+
944974
@property
945975
def providers(self) -> dict[str, ProviderInfo]:
946976
"""Returns information about available providers."""

0 commit comments

Comments
 (0)