From 5d696fd52f93622023f6d79b0624e6aaed5b32c6 Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Mon, 16 Feb 2026 17:00:55 +0530 Subject: [PATCH 1/4] Migrate connection UI metadata to YAML for some providers --- .pre-commit-config.yaml | 4 + providers/amazon/provider.yaml | 91 ++++++++++ .../providers/amazon/get_provider_info.py | 40 ++++- providers/google/provider.yaml | 13 ++ .../providers/google/get_provider_info.py | 15 ++ providers/hashicorp/provider.yaml | 2 + .../providers/hashicorp/get_provider_info.py | 1 + providers/microsoft/azure/provider.yaml | 145 ++++++++++++++++ .../microsoft/azure/get_provider_info.py | 156 ++++++++++++++++++ providers/snowflake/provider.yaml | 35 ++++ .../providers/snowflake/get_provider_info.py | 22 +++ 11 files changed, 523 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a3040b211b869..0c1b1d9c8b43d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -576,6 +576,10 @@ repos: ^providers/\.pre-commit-config\.yaml$| ^providers/amazon/src/airflow/providers/amazon/aws/hooks/emr\.py$| ^providers/amazon/src/airflow/providers/amazon/aws/operators/emr\.py$| + ^providers/amazon/src/airflow/providers/amazon/get_provider_info\.py$| + ^providers/amazon/provider\.yaml$| + ^providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info\.py$| + ^providers/microsoft/azure/provider\.yaml$| ^providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra\.py$| ^providers/apache/hdfs/docs/connections\.rst$| ^providers/apache/hive/src/airflow/providers/apache/hive/operators/hive_stats\.py$| diff --git a/providers/amazon/provider.yaml b/providers/amazon/provider.yaml index 583b437a22196..9d1cea12bedbc 100644 --- a/providers/amazon/provider.yaml +++ b/providers/amazon/provider.yaml @@ -925,14 +925,105 @@ extra-links: connection-types: - hook-class-name: airflow.providers.amazon.aws.hooks.base_aws.AwsGenericHook connection-type: aws + ui-field-behaviour: + hidden-fields: + - host + - schema + - port + relabeling: + login: AWS Access Key ID + password: AWS Secret Access Key + placeholders: + login: AKIAIOSFODNN7EXAMPLE + password: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + extra: | + { + "region_name": "us-east-1", + "session_kwargs": {"profile_name": "default"}, + "config_kwargs": {"retries": {"mode": "standard", "max_attempts": 10}}, + "role_arn": "arn:aws:iam::123456789098:role/role-name", + "assume_role_method": "assume_role", + "assume_role_kwargs": {"RoleSessionName": "airflow"}, + "aws_session_token": "AQoDYXdzEJr...EXAMPLETOKEN", + "endpoint_url": "http://localhost:4566" + } - hook-class-name: airflow.providers.amazon.aws.hooks.chime.ChimeWebhookHook connection-type: chime + ui-field-behaviour: + hidden-fields: + - login + - port + - extra + relabeling: + host: Chime Webhook Endpoint + password: Chime Webhook token + placeholders: + schema: https + host: hooks.chime.aws/incomingwebhook/ + password: T00000000?token=XXXXXXXXXXXXXXXXXXXXXXXX - hook-class-name: airflow.providers.amazon.aws.hooks.emr.EmrHook connection-type: emr + ui-field-behaviour: + hidden-fields: + - host + - schema + - port + - login + - password + relabeling: + extra: Run Job Flow Configuration + placeholders: + extra: | + { + "Name": "MyClusterName", + "ReleaseLabel": "emr-5.36.0", + "Applications": [{"Name": "Spark"}], + "Instances": { + "InstanceGroups": [{ + "Name": "Primary node", + "Market": "SPOT", + "InstanceRole": "MASTER", + "InstanceType": "m5.large", + "InstanceCount": 1 + }], + "KeepJobFlowAliveWhenNoSteps": false, + "TerminationProtected": false + }, + "StepConcurrencyLevel": 2 + } - hook-class-name: airflow.providers.amazon.aws.hooks.redshift_sql.RedshiftSQLHook connection-type: redshift + ui-field-behaviour: + relabeling: + login: User + schema: Database - hook-class-name: airflow.providers.amazon.aws.hooks.athena_sql.AthenaSQLHook connection-type: athena + ui-field-behaviour: + hidden-fields: + - host + - port + relabeling: + login: AWS Access Key ID + password: AWS Secret Access Key + placeholders: + login: AKIAIOSFODNN7EXAMPLE + password: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + extra: | + { + "aws_domain": "amazonaws.com", + "driver": "rest", + "s3_staging_dir": "s3://bucket_name/staging/", + "work_group": "primary", + "region_name": "us-east-1", + "session_kwargs": {"profile_name": "default"}, + "config_kwargs": {"retries": {"mode": "standard", "max_attempts": 10}}, + "role_arn": "arn:aws:iam::123456789098:role/role-name", + "assume_role_method": "assume_role", + "assume_role_kwargs": {"RoleSessionName": "airflow"}, + "aws_session_token": "AQoDYXdzEJr...EXAMPLETOKEN", + "endpoint_url": "http://localhost:4566" + } notifications: - airflow.providers.amazon.aws.notifications.chime.ChimeNotifier diff --git a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py index 17d127472d150..fbdd7ef45de18 100644 --- a/providers/amazon/src/airflow/providers/amazon/get_provider_info.py +++ b/providers/amazon/src/airflow/providers/amazon/get_provider_info.py @@ -1080,19 +1080,57 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.amazon.aws.hooks.base_aws.AwsGenericHook", "connection-type": "aws", + "ui-field-behaviour": { + "hidden-fields": ["host", "schema", "port"], + "relabeling": {"login": "AWS Access Key ID", "password": "AWS Secret Access Key"}, + "placeholders": { + "login": "AKIAIOSFODNN7EXAMPLE", + "password": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "extra": '{\n "region_name": "us-east-1",\n "session_kwargs": {"profile_name": "default"},\n "config_kwargs": {"retries": {"mode": "standard", "max_attempts": 10}},\n "role_arn": "arn:aws:iam::123456789098:role/role-name",\n "assume_role_method": "assume_role",\n "assume_role_kwargs": {"RoleSessionName": "airflow"},\n "aws_session_token": "AQoDYXdzEJr...EXAMPLETOKEN",\n "endpoint_url": "http://localhost:4566"\n}\n', + }, + }, }, { "hook-class-name": "airflow.providers.amazon.aws.hooks.chime.ChimeWebhookHook", "connection-type": "chime", + "ui-field-behaviour": { + "hidden-fields": ["login", "port", "extra"], + "relabeling": {"host": "Chime Webhook Endpoint", "password": "Chime Webhook token"}, + "placeholders": { + "schema": "https", + "host": "hooks.chime.aws/incomingwebhook/", + "password": "T00000000?token=XXXXXXXXXXXXXXXXXXXXXXXX", + }, + }, + }, + { + "hook-class-name": "airflow.providers.amazon.aws.hooks.emr.EmrHook", + "connection-type": "emr", + "ui-field-behaviour": { + "hidden-fields": ["host", "schema", "port", "login", "password"], + "relabeling": {"extra": "Run Job Flow Configuration"}, + "placeholders": { + "extra": '{\n "Name": "MyClusterName",\n "ReleaseLabel": "emr-5.36.0",\n "Applications": [{"Name": "Spark"}],\n "Instances": {\n "InstanceGroups": [{\n "Name": "Primary node",\n "Market": "SPOT",\n "InstanceRole": "MASTER",\n "InstanceType": "m5.large",\n "InstanceCount": 1\n }],\n "KeepJobFlowAliveWhenNoSteps": false,\n "TerminationProtected": false\n },\n "StepConcurrencyLevel": 2\n}\n' + }, + }, }, - {"hook-class-name": "airflow.providers.amazon.aws.hooks.emr.EmrHook", "connection-type": "emr"}, { "hook-class-name": "airflow.providers.amazon.aws.hooks.redshift_sql.RedshiftSQLHook", "connection-type": "redshift", + "ui-field-behaviour": {"relabeling": {"login": "User", "schema": "Database"}}, }, { "hook-class-name": "airflow.providers.amazon.aws.hooks.athena_sql.AthenaSQLHook", "connection-type": "athena", + "ui-field-behaviour": { + "hidden-fields": ["host", "port"], + "relabeling": {"login": "AWS Access Key ID", "password": "AWS Secret Access Key"}, + "placeholders": { + "login": "AKIAIOSFODNN7EXAMPLE", + "password": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", + "extra": '{\n "aws_domain": "amazonaws.com",\n "driver": "rest",\n "s3_staging_dir": "s3://bucket_name/staging/",\n "work_group": "primary",\n "region_name": "us-east-1",\n "session_kwargs": {"profile_name": "default"},\n "config_kwargs": {"retries": {"mode": "standard", "max_attempts": 10}},\n "role_arn": "arn:aws:iam::123456789098:role/role-name",\n "assume_role_method": "assume_role",\n "assume_role_kwargs": {"RoleSessionName": "airflow"},\n "aws_session_token": "AQoDYXdzEJr...EXAMPLETOKEN",\n "endpoint_url": "http://localhost:4566"\n}\n', + }, + }, }, ], "notifications": [ diff --git a/providers/google/provider.yaml b/providers/google/provider.yaml index 56cd3f1d0e68b..1eaca6bb9d44a 100644 --- a/providers/google/provider.yaml +++ b/providers/google/provider.yaml @@ -1197,12 +1197,25 @@ connection-types: connection-type: gcpcloudsqldb - hook-class-name: airflow.providers.google.cloud.hooks.bigquery.BigQueryHook connection-type: gcpbigquery + ui-field-behaviour: + hidden-fields: ["host", "schema", "login", "password", "port", "extra"] + relabeling: {} + placeholders: {} - hook-class-name: airflow.providers.google.cloud.hooks.compute_ssh.ComputeEngineSSHHook connection-type: gcpssh + ui-field-behaviour: + hidden-fields: ["host", "schema", "login", "password", "port", "extra"] + relabeling: {} + placeholders: {} - hook-class-name: airflow.providers.google.leveldb.hooks.leveldb.LevelDBHook connection-type: leveldb - hook-class-name: airflow.providers.google.ads.hooks.ads.GoogleAdsHook connection-type: google_ads + ui-field-behaviour: + hidden-fields: ["host", "login", "schema", "port"] + relabeling: {} + placeholders: + password: "Leave blank (optional)" - hook-class-name: airflow.providers.google.cloud.hooks.looker.LookerHook connection-type: gcp_looker diff --git a/providers/google/src/airflow/providers/google/get_provider_info.py b/providers/google/src/airflow/providers/google/get_provider_info.py index af4b9a8392a51..99e3d0783598e 100644 --- a/providers/google/src/airflow/providers/google/get_provider_info.py +++ b/providers/google/src/airflow/providers/google/get_provider_info.py @@ -1434,10 +1434,20 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.google.cloud.hooks.bigquery.BigQueryHook", "connection-type": "gcpbigquery", + "ui-field-behaviour": { + "hidden-fields": ["host", "schema", "login", "password", "port", "extra"], + "relabeling": {}, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.google.cloud.hooks.compute_ssh.ComputeEngineSSHHook", "connection-type": "gcpssh", + "ui-field-behaviour": { + "hidden-fields": ["host", "schema", "login", "password", "port", "extra"], + "relabeling": {}, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.google.leveldb.hooks.leveldb.LevelDBHook", @@ -1446,6 +1456,11 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.google.ads.hooks.ads.GoogleAdsHook", "connection-type": "google_ads", + "ui-field-behaviour": { + "hidden-fields": ["host", "login", "schema", "port"], + "relabeling": {}, + "placeholders": {"password": "Leave blank (optional)"}, + }, }, { "hook-class-name": "airflow.providers.google.cloud.hooks.looker.LookerHook", diff --git a/providers/hashicorp/provider.yaml b/providers/hashicorp/provider.yaml index ffa3f17625fe1..fea993e184aa4 100644 --- a/providers/hashicorp/provider.yaml +++ b/providers/hashicorp/provider.yaml @@ -86,6 +86,8 @@ hooks: connection-types: - hook-class-name: airflow.providers.hashicorp.hooks.vault.VaultHook connection-type: vault + ui-field-behaviour: + hidden-fields: ["extra"] secrets-backends: - airflow.providers.hashicorp.secrets.vault.VaultBackend diff --git a/providers/hashicorp/src/airflow/providers/hashicorp/get_provider_info.py b/providers/hashicorp/src/airflow/providers/hashicorp/get_provider_info.py index b89b9b71da098..e6f4ecb5099cf 100644 --- a/providers/hashicorp/src/airflow/providers/hashicorp/get_provider_info.py +++ b/providers/hashicorp/src/airflow/providers/hashicorp/get_provider_info.py @@ -44,6 +44,7 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.hashicorp.hooks.vault.VaultHook", "connection-type": "vault", + "ui-field-behaviour": {"hidden-fields": ["extra"]}, } ], "secrets-backends": ["airflow.providers.hashicorp.secrets.vault.VaultBackend"], diff --git a/providers/microsoft/azure/provider.yaml b/providers/microsoft/azure/provider.yaml index 6cb3921ebcdab..c49f055a1c945 100644 --- a/providers/microsoft/azure/provider.yaml +++ b/providers/microsoft/azure/provider.yaml @@ -332,36 +332,181 @@ transfers: connection-types: - hook-class-name: airflow.providers.microsoft.azure.hooks.base_azure.AzureBaseHook connection-type: azure + ui-field-behaviour: + hidden-fields: ["schema", "port", "host"] + relabeling: + login: Azure Client ID + password: Azure Secret + placeholders: + extra: '{"key_path": "path to json file for auth", "key_json": "specifies json dict for auth"}' + login: client_id (token credentials auth) + password: secret (token credentials auth) + tenantId: tenantId (token credentials auth) + subscriptionId: subscriptionId (token credentials auth) - hook-class-name: airflow.providers.microsoft.azure.hooks.adx.AzureDataExplorerHook connection-type: azure_data_explorer + ui-field-behaviour: + hidden-fields: ["schema", "port", "extra"] + relabeling: + login: Username + host: Data Explorer Cluster URL + placeholders: + login: Varies with authentication method + password: Varies with authentication method + auth_method: AAD_APP/AAD_APP_CERT/AAD_CREDS/AAD_DEVICE/AZURE_TOKEN_CRED + tenant: Used with AAD_APP/AAD_APP_CERT/AAD_CREDS + certificate: Used with AAD_APP_CERT + thumbprint: Used with AAD_APP_CERT - hook-class-name: airflow.providers.microsoft.azure.hooks.batch.AzureBatchHook connection-type: azure_batch + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Batch Account Name + password: Batch Account Access Key + placeholders: {} - hook-class-name: airflow.providers.microsoft.azure.hooks.cosmos.AzureCosmosDBHook connection-type: azure_cosmos + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Cosmos Endpoint URI + password: Cosmos Master Key Token + placeholders: + login: endpoint uri + password: master key (not needed for Azure AD authentication) + database_name: database name + collection_name: collection name + subscription_id: Subscription ID (required for Azure AD authentication) + resource_group_name: Resource Group Name (required for Azure AD authentication) - hook-class-name: airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeHook connection-type: azure_data_lake + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Azure Client ID + password: Azure Client Secret + placeholders: + login: client id + password: secret + tenant: tenant id + account_name: datalake store - hook-class-name: airflow.providers.microsoft.azure.hooks.fileshare.AzureFileShareHook connection-type: azure_fileshare + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Blob Storage Login (optional) + password: Blob Storage Key (optional) + placeholders: + login: account name or account url + password: secret + sas_token: account url or token (optional) + connection_string: account url or token (optional) - hook-class-name: airflow.providers.microsoft.azure.hooks.container_volume.AzureContainerVolumeHook connection-type: azure_container_volume + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Azure Client ID + password: Azure Secret + placeholders: + login: client_id (token credentials auth) + password: secret (token credentials auth) + connection_string: connection string auth + subscription_id: Subscription id (required for Azure AD authentication) + resource_group: Resource group name (required for Azure AD authentication) - hook-class-name: airflow.providers.microsoft.azure.hooks.container_instance.AzureContainerInstanceHook connection-type: azure_container_instance - hook-class-name: airflow.providers.microsoft.azure.hooks.wasb.WasbHook connection-type: wasb + ui-field-behaviour: + hidden-fields: ["schema", "port"] + relabeling: + login: Blob Storage Login (optional) + password: Blob Storage Key (optional) + host: Account URL (Active Directory Auth) + placeholders: + login: account name + password: secret + host: account url + connection_string: connection string auth + tenant_id: tenant + shared_access_key: shared access key + sas_token: account url or token + extra: additional options for ClientSecretCredential or DefaultAzureCredential - hook-class-name: airflow.providers.microsoft.azure.hooks.data_factory.AzureDataFactoryHook connection-type: azure_data_factory + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Client ID + password: Secret + placeholders: {} - hook-class-name: airflow.providers.microsoft.azure.hooks.container_registry.AzureContainerRegistryHook connection-type: azure_container_registry + ui-field-behaviour: + hidden-fields: ["schema", "port", "extra"] + relabeling: + login: Registry Username + password: Registry Password + host: Registry Server + placeholders: + login: private registry username + password: private registry password + host: docker image registry server + subscription_id: Subscription id (required for Azure AD authentication) + resource_group: Resource group name (required for Azure AD authentication) - hook-class-name: airflow.providers.microsoft.azure.hooks.asb.BaseAzureServiceBusHook connection-type: azure_service_bus + ui-field-behaviour: + hidden-fields: ["port", "host", "extra", "login", "password"] + relabeling: + schema: Connection String + placeholders: + fully_qualified_namespace: .servicebus.windows.net (for Azure AD authentication) + credential: credential + schema: Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=... - hook-class-name: airflow.providers.microsoft.azure.hooks.synapse.BaseAzureSynapseHook connection-type: azure_synapse + ui-field-behaviour: + hidden-fields: ["schema", "port", "extra"] + relabeling: + login: Client ID + password: Secret + host: Synapse Workspace URL + placeholders: {} - hook-class-name: airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeStorageV2Hook connection-type: adls + ui-field-behaviour: + hidden-fields: ["schema", "port"] + relabeling: + login: Client ID (Active Directory) + password: ADLS Gen2 Key / Client Secret (Active Directory) + host: ADLS Gen2 Account Name + placeholders: + extra: additional options for use with FileService and AzureFileVolume + login: client id + password: key / secret + host: storage account name + connection_string: connection string (overrides auth) + tenant_id: tenant id - hook-class-name: airflow.providers.microsoft.azure.hooks.msgraph.KiotaRequestAdapterHook connection-type: msgraph + ui-field-behaviour: + hidden-fields: ["extra"] + relabeling: + login: Client ID + password: Client Secret + placeholders: {} - hook-class-name: airflow.providers.microsoft.azure.hooks.powerbi.PowerBIHook connection-type: powerbi + ui-field-behaviour: + hidden-fields: ["schema", "port", "host", "extra"] + relabeling: + login: Client ID + password: Client Secret + placeholders: {} secrets-backends: - airflow.providers.microsoft.azure.secrets.key_vault.AzureKeyVaultBackend diff --git a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info.py b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info.py index 356ea5d13ef5c..de4da0f0ac602 100644 --- a/providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info.py +++ b/providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info.py @@ -322,30 +322,104 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.microsoft.azure.hooks.base_azure.AzureBaseHook", "connection-type": "azure", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host"], + "relabeling": {"login": "Azure Client ID", "password": "Azure Secret"}, + "placeholders": { + "extra": '{"key_path": "path to json file for auth", "key_json": "specifies json dict for auth"}', + "login": "client_id (token credentials auth)", + "password": "secret (token credentials auth)", + "tenantId": "tenantId (token credentials auth)", + "subscriptionId": "subscriptionId (token credentials auth)", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.adx.AzureDataExplorerHook", "connection-type": "azure_data_explorer", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "extra"], + "relabeling": {"login": "Username", "host": "Data Explorer Cluster URL"}, + "placeholders": { + "login": "Varies with authentication method", + "password": "Varies with authentication method", + "auth_method": "AAD_APP/AAD_APP_CERT/AAD_CREDS/AAD_DEVICE/AZURE_TOKEN_CRED", + "tenant": "Used with AAD_APP/AAD_APP_CERT/AAD_CREDS", + "certificate": "Used with AAD_APP_CERT", + "thumbprint": "Used with AAD_APP_CERT", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.batch.AzureBatchHook", "connection-type": "azure_batch", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Batch Account Name", "password": "Batch Account Access Key"}, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.cosmos.AzureCosmosDBHook", "connection-type": "azure_cosmos", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Cosmos Endpoint URI", "password": "Cosmos Master Key Token"}, + "placeholders": { + "login": "endpoint uri", + "password": "master key (not needed for Azure AD authentication)", + "database_name": "database name", + "collection_name": "collection name", + "subscription_id": "Subscription ID (required for Azure AD authentication)", + "resource_group_name": "Resource Group Name (required for Azure AD authentication)", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeHook", "connection-type": "azure_data_lake", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Azure Client ID", "password": "Azure Client Secret"}, + "placeholders": { + "login": "client id", + "password": "secret", + "tenant": "tenant id", + "account_name": "datalake store", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.fileshare.AzureFileShareHook", "connection-type": "azure_fileshare", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": { + "login": "Blob Storage Login (optional)", + "password": "Blob Storage Key (optional)", + }, + "placeholders": { + "login": "account name or account url", + "password": "secret", + "sas_token": "account url or token (optional)", + "connection_string": "account url or token (optional)", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.container_volume.AzureContainerVolumeHook", "connection-type": "azure_container_volume", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Azure Client ID", "password": "Azure Secret"}, + "placeholders": { + "login": "client_id (token credentials auth)", + "password": "secret (token credentials auth)", + "connection_string": "connection string auth", + "subscription_id": "Subscription id (required for Azure AD authentication)", + "resource_group": "Resource group name (required for Azure AD authentication)", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.container_instance.AzureContainerInstanceHook", @@ -354,34 +428,116 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.microsoft.azure.hooks.wasb.WasbHook", "connection-type": "wasb", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port"], + "relabeling": { + "login": "Blob Storage Login (optional)", + "password": "Blob Storage Key (optional)", + "host": "Account URL (Active Directory Auth)", + }, + "placeholders": { + "login": "account name", + "password": "secret", + "host": "account url", + "connection_string": "connection string auth", + "tenant_id": "tenant", + "shared_access_key": "shared access key", + "sas_token": "account url or token", + "extra": "additional options for ClientSecretCredential or DefaultAzureCredential", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.data_factory.AzureDataFactoryHook", "connection-type": "azure_data_factory", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Client ID", "password": "Secret"}, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.container_registry.AzureContainerRegistryHook", "connection-type": "azure_container_registry", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "extra"], + "relabeling": { + "login": "Registry Username", + "password": "Registry Password", + "host": "Registry Server", + }, + "placeholders": { + "login": "private registry username", + "password": "private registry password", + "host": "docker image registry server", + "subscription_id": "Subscription id (required for Azure AD authentication)", + "resource_group": "Resource group name (required for Azure AD authentication)", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.asb.BaseAzureServiceBusHook", "connection-type": "azure_service_bus", + "ui-field-behaviour": { + "hidden-fields": ["port", "host", "extra", "login", "password"], + "relabeling": {"schema": "Connection String"}, + "placeholders": { + "fully_qualified_namespace": ".servicebus.windows.net (for Azure AD authentication)", + "credential": "credential", + "schema": "Endpoint=sb://.servicebus.windows.net/;SharedAccessKeyName=...", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.synapse.BaseAzureSynapseHook", "connection-type": "azure_synapse", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "extra"], + "relabeling": { + "login": "Client ID", + "password": "Secret", + "host": "Synapse Workspace URL", + }, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.data_lake.AzureDataLakeStorageV2Hook", "connection-type": "adls", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port"], + "relabeling": { + "login": "Client ID (Active Directory)", + "password": "ADLS Gen2 Key / Client Secret (Active Directory)", + "host": "ADLS Gen2 Account Name", + }, + "placeholders": { + "extra": "additional options for use with FileService and AzureFileVolume", + "login": "client id", + "password": "key / secret", + "host": "storage account name", + "connection_string": "connection string (overrides auth)", + "tenant_id": "tenant id", + }, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.msgraph.KiotaRequestAdapterHook", "connection-type": "msgraph", + "ui-field-behaviour": { + "hidden-fields": ["extra"], + "relabeling": {"login": "Client ID", "password": "Client Secret"}, + "placeholders": {}, + }, }, { "hook-class-name": "airflow.providers.microsoft.azure.hooks.powerbi.PowerBIHook", "connection-type": "powerbi", + "ui-field-behaviour": { + "hidden-fields": ["schema", "port", "host", "extra"], + "relabeling": {"login": "Client ID", "password": "Client Secret"}, + "placeholders": {}, + }, }, ], "secrets-backends": ["airflow.providers.microsoft.azure.secrets.key_vault.AzureKeyVaultBackend"], diff --git a/providers/snowflake/provider.yaml b/providers/snowflake/provider.yaml index 343c6e9575fd6..0412dc0b118bf 100644 --- a/providers/snowflake/provider.yaml +++ b/providers/snowflake/provider.yaml @@ -146,6 +146,41 @@ transfers: connection-types: - hook-class-name: airflow.providers.snowflake.hooks.snowflake.SnowflakeHook connection-type: snowflake + ui-field-behaviour: + hidden-fields: ["port", "host"] + relabeling: {} + placeholders: + extra: | + { + "authenticator": "snowflake oauth", + "private_key_file": "private key", + "session_parameters": "session parameters", + "client_request_mfa_token": "client request mfa token", + "client_store_temporary_credential": "client store temporary credential", + "grant_type": "refresh_token client_credentials", + "token_endpoint": "token endpoint", + "refresh_token": "refresh token", + "scope": "scope", + "proxy_host": "proxy.example.com", + "proxy_port": "8080", + "proxy_user": "proxy_username", + "proxy_password": "proxy_password" + } + schema: snowflake schema + login: snowflake username + password: snowflake password + account: snowflake account name + warehouse: snowflake warehouse name + database: snowflake db name + region: snowflake hosted region + role: snowflake role + private_key_file: Path of snowflake private key (PEM Format) + private_key_content: Content to snowflake private key (PEM format) + insecure_mode: insecure mode + proxy_host: Proxy server hostname + proxy_port: Proxy server port + proxy_user: Proxy username (optional) + proxy_password: Proxy password (optional) triggers: - integration-name: Snowflake diff --git a/providers/snowflake/src/airflow/providers/snowflake/get_provider_info.py b/providers/snowflake/src/airflow/providers/snowflake/get_provider_info.py index 03ab85efa0482..9acc48e03f6e7 100644 --- a/providers/snowflake/src/airflow/providers/snowflake/get_provider_info.py +++ b/providers/snowflake/src/airflow/providers/snowflake/get_provider_info.py @@ -86,6 +86,28 @@ def get_provider_info(): { "hook-class-name": "airflow.providers.snowflake.hooks.snowflake.SnowflakeHook", "connection-type": "snowflake", + "ui-field-behaviour": { + "hidden-fields": ["port", "host"], + "relabeling": {}, + "placeholders": { + "extra": '{\n "authenticator": "snowflake oauth",\n "private_key_file": "private key",\n "session_parameters": "session parameters",\n "client_request_mfa_token": "client request mfa token",\n "client_store_temporary_credential": "client store temporary credential",\n "grant_type": "refresh_token client_credentials",\n "token_endpoint": "token endpoint",\n "refresh_token": "refresh token",\n "scope": "scope",\n "proxy_host": "proxy.example.com",\n "proxy_port": "8080",\n "proxy_user": "proxy_username",\n "proxy_password": "proxy_password"\n}\n', + "schema": "snowflake schema", + "login": "snowflake username", + "password": "snowflake password", + "account": "snowflake account name", + "warehouse": "snowflake warehouse name", + "database": "snowflake db name", + "region": "snowflake hosted region", + "role": "snowflake role", + "private_key_file": "Path of snowflake private key (PEM Format)", + "private_key_content": "Content to snowflake private key (PEM format)", + "insecure_mode": "insecure mode", + "proxy_host": "Proxy server hostname", + "proxy_port": "Proxy server port", + "proxy_user": "Proxy username (optional)", + "proxy_password": "Proxy password (optional)", + }, + }, } ], "triggers": [ From 9af709fe3dc5cf88f3a54d42749e2945c1194138 Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Tue, 17 Feb 2026 13:18:07 +0530 Subject: [PATCH 2/4] general regex --- .pre-commit-config.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c1b1d9c8b43d..6a9301a06f5ed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -576,10 +576,8 @@ repos: ^providers/\.pre-commit-config\.yaml$| ^providers/amazon/src/airflow/providers/amazon/aws/hooks/emr\.py$| ^providers/amazon/src/airflow/providers/amazon/aws/operators/emr\.py$| - ^providers/amazon/src/airflow/providers/amazon/get_provider_info\.py$| - ^providers/amazon/provider\.yaml$| - ^providers/microsoft/azure/src/airflow/providers/microsoft/azure/get_provider_info\.py$| - ^providers/microsoft/azure/provider\.yaml$| + ^providers/[^/]+/src/airflow/providers/[^/]+/get_provider_info\.py$| + ^providers/[^/]+/provider\.yaml$ ^providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra\.py$| ^providers/apache/hdfs/docs/connections\.rst$| ^providers/apache/hive/src/airflow/providers/apache/hive/operators/hive_stats\.py$| From ac5fbd755f306a6cc14de636fa5765aca1a86693 Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Tue, 17 Feb 2026 15:09:58 +0530 Subject: [PATCH 3/4] fixing regex --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6a9301a06f5ed..03c6c95ac8125 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -577,7 +577,7 @@ repos: ^providers/amazon/src/airflow/providers/amazon/aws/hooks/emr\.py$| ^providers/amazon/src/airflow/providers/amazon/aws/operators/emr\.py$| ^providers/[^/]+/src/airflow/providers/[^/]+/get_provider_info\.py$| - ^providers/[^/]+/provider\.yaml$ + ^providers/[^/]+/provider\.| ^providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra\.py$| ^providers/apache/hdfs/docs/connections\.rst$| ^providers/apache/hive/src/airflow/providers/apache/hive/operators/hive_stats\.py$| From 95ffd3c6bc09e165c305091763d7ae1e519dbe26 Mon Sep 17 00:00:00 2001 From: Amogh Desai Date: Tue, 17 Feb 2026 16:41:02 +0530 Subject: [PATCH 4/4] fixing regex --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 03c6c95ac8125..4cdc986cc3a73 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -576,8 +576,8 @@ repos: ^providers/\.pre-commit-config\.yaml$| ^providers/amazon/src/airflow/providers/amazon/aws/hooks/emr\.py$| ^providers/amazon/src/airflow/providers/amazon/aws/operators/emr\.py$| - ^providers/[^/]+/src/airflow/providers/[^/]+/get_provider_info\.py$| - ^providers/[^/]+/provider\.| + ^providers/.*/get_provider_info\.py$| + ^providers/.*/provider\.yaml$| ^providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra\.py$| ^providers/apache/hdfs/docs/connections\.rst$| ^providers/apache/hive/src/airflow/providers/apache/hive/operators/hive_stats\.py$|